Name: series-workflowmrqln Phase: Failed StartedAt: 2026-07-14 03:04:33 +0000 UTC FinishedAt: 2026-07-14 03:35:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmrqln[0] Phase: Succeeded StartedAt: 2026-07-14 03:04:33 +0000 UTC FinishedAt: 2026-07-14 03:35:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmrqln[0].run-triage Phase: Succeeded StartedAt: 2026-07-14 03:04:33 +0000 UTC FinishedAt: 2026-07-14 03:35:40 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDAzOjM1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlbW92ZXMgdGhlIHBjcnlwdCBwYXJhbGxlbCBjcnlwdG8gZW5naW5lIGFuZCB0aGUgYXNzb2NpYXRlZCBzZXJpYWxpemVkIGpvYiBzdXBwb3J0IGZyb20gcGFkYXRhLiBJdCBpcyBhIHB1cmUgY2xlYW51cC9yZW1vdmFsIHBhdGNoIGFuZCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IG5ldyBmdW5jdGlvbmFsIGNvZGUgb3IgbG9naWMgdGhhdCByZXF1aXJlcyBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNCAwMzozNTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGNjMzk0Y2M5Y2UxZGNjYzQxNWJjOGZjNjVmZTY1NjdhYThjNzUzNDRcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEp1bCAxNCAwMzozNToxMiAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3BhZGF0YS5yc3QgYi9Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3BhZGF0YS5yc3RcbmluZGV4IDA1YjczYzZjMTA1ZjA0Li5kN2RjN2UzMzA1NGRiZCAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vY29yZS1hcGkvcGFkYXRhLnJzdFxuJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9wYWRhdGEucnN0XG5AQCAtNywxNTIgJiM0Mzs3LDExIEBAIFRoZSBwYWRhdGEgcGFyYWxsZWwgZXhlY3V0aW9uIG1lY2hhbmlzbVxuIDpEYXRlOiBNYXkgMjAyMFxuIFxuIFBhZGF0YSBpcyBhIG1lY2hhbmlzbSBieSB3aGljaCB0aGUga2VybmVsIGNhbiBmYXJtIGpvYnMgb3V0IHRvIGJlIGRvbmUgaW5cbi1wYXJhbGxlbCBvbiBtdWx0aXBsZSBDUFVzIHdoaWxlIG9wdGlvbmFsbHkgcmV0YWluaW5nIHRoZWlyIG9yZGVyaW5nLlxuJiM0MztwYXJhbGxlbCBvbiBtdWx0aXBsZSBDUFVzIHdoaWxlIGNvb3JkaW5hdGluZyBiZXR3ZWVuIHRocmVhZHMuXG4gXG4tSXQgd2FzIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGZvciBJUHNlYywgd2hpY2ggbmVlZHMgdG8gcGVyZm9ybSBlbmNyeXB0aW9uIGFuZFxuLWRlY3J5cHRpb24gb24gbGFyZ2UgbnVtYmVycyBvZiBwYWNrZXRzIHdpdGhvdXQgcmVvcmRlcmluZyB0aG9zZSBwYWNrZXRzLiAgVGhpc1xuLWlzIGN1cnJlbnRseSB0aGUgc29sZSBjb25zdW1lciBvZiBwYWRhdGEmIzM5O3Mgc2VyaWFsaXplZCBqb2Igc3VwcG9ydC5cbi1cbi1QYWRhdGEgYWxzbyBzdXBwb3J0cyBtdWx0aXRocmVhZGVkIGpvYnMsIHNwbGl0dGluZyB1cCB0aGUgam9iIGV2ZW5seSB3aGlsZSBsb2FkXG4mIzQzO1BhZGF0YSBzdXBwb3J0cyBtdWx0aXRocmVhZGVkIGpvYnMsIHNwbGl0dGluZyB1cCB0aGUgam9iIGV2ZW5seSB3aGlsZSBsb2FkXG4gYmFsYW5jaW5nIGFuZCBjb29yZGluYXRpbmcgYmV0d2VlbiB0aHJlYWRzLlxuIFxuLVJ1bm5pbmcgU2VyaWFsaXplZCBKb2JzXG4tPT09PT09PT09PT09PT09PT09PT09PT1cbi1cbi1Jbml0aWFsaXppbmdcbi0tLS0tLS0tLS0tLS1cbi1cbi1UaGUgZmlyc3Qgc3RlcCBpbiB1c2luZyBwYWRhdGEgdG8gcnVuIHNlcmlhbGl6ZWQgam9icyBpcyB0byBzZXQgdXAgYVxuLXBhZGF0YV9pbnN0YW5jZSBzdHJ1Y3R1cmUgZm9yIG92ZXJhbGwgY29udHJvbCBvZiBob3cgam9icyBhcmUgdG8gYmUgcnVuOjpcbi1cbi0gICAgI2luY2x1ZGUgXHUwMDNjbGludXgvcGFkYXRhLmhcdTAwM2Vcbi1cbi0gICAgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGFkYXRhX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpO1xuLVxuLSYjMzk7bmFtZSYjMzk7IHNpbXBseSBpZGVudGlmaWVzIHRoZSBpbnN0YW5jZS5cbi1cbi1UaGVuLCBjb21wbGV0ZSBwYWRhdGEgaW5pdGlhbGl6YXRpb24gYnkgYWxsb2NhdGluZyBhIHBhZGF0YV9zaGVsbDo6XG4tXG4tICAgc3RydWN0IHBhZGF0YV9zaGVsbCAqcGFkYXRhX2FsbG9jX3NoZWxsKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KTtcbi1cbi1BIHBhZGF0YV9zaGVsbCBpcyB1c2VkIHRvIHN1Ym1pdCBhIGpvYiB0byBwYWRhdGEgYW5kIGFsbG93cyBhIHNlcmllcyBvZiBzdWNoXG4tam9icyB0byBiZSBzZXJpYWxpemVkIGluZGVwZW5kZW50bHkuICBBIHBhZGF0YV9pbnN0YW5jZSBtYXkgaGF2ZSBvbmUgb3IgbW9yZVxuLXBhZGF0YV9zaGVsbHMgYXNzb2NpYXRlZCB3aXRoIGl0LCBlYWNoIGFsbG93aW5nIGEgc2VwYXJhdGUgc2VyaWVzIG9mIGpvYnMuXG4tXG4tTW9kaWZ5aW5nIGNwdW1hc2tzXG4tLS0tLS0tLS0tLS0tLS0tLS0tXG4tXG4tVGhlIENQVXMgdXNlZCB0byBydW4gam9icyBjYW4gYmUgY2hhbmdlZCBpbiB0d28gd2F5cywgcHJvZ3JhbW1hdGljYWxseSB3aXRoXG4tcGFkYXRhX3NldF9jcHVtYXNrKCkgb3IgdmlhIHN5c2ZzLiAgVGhlIGZvcm1lciBpcyBkZWZpbmVkOjpcbi1cbi0gICAgaW50IHBhZGF0YV9zZXRfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdW1hc2tfdHlwZSxcbi1cdFx0XHQgICBjcHVtYXNrX3Zhcl90IGNwdW1hc2spO1xuLVxuLUhlcmUgY3B1bWFza190eXBlIGlzIG9uZSBvZiBQQURBVEFfQ1BVX1BBUkFMTEVMIG9yIFBBREFUQV9DUFVfU0VSSUFMLCB3aGVyZSBhXG4tcGFyYWxsZWwgY3B1bWFzayBkZXNjcmliZXMgd2hpY2ggcHJvY2Vzc29ycyB3aWxsIGJlIHVzZWQgdG8gZXhlY3V0ZSBqb2JzXG4tc3VibWl0dGVkIHRvIHRoaXMgaW5zdGFuY2UgaW4gcGFyYWxsZWwgYW5kIGEgc2VyaWFsIGNwdW1hc2sgZGVmaW5lcyB3aGljaFxuLXByb2Nlc3NvcnMgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZCBhcyB0aGUgc2VyaWFsaXphdGlvbiBjYWxsYmFjayBwcm9jZXNzb3IuXG4tY3B1bWFzayBzcGVjaWZpZXMgdGhlIG5ldyBjcHVtYXNrIHRvIHVzZS5cbi1cbi1UaGVyZSBtYXkgYmUgc3lzZnMgZmlsZXMgZm9yIGFuIGluc3RhbmNlJiMzOTtzIGNwdW1hc2tzLiAgRm9yIGV4YW1wbGUsIHBjcnlwdCYjMzk7c1xuLWxpdmUgaW4gL3N5cy9rZXJuZWwvcGNyeXB0L1x1MDAzY2luc3RhbmNlLW5hbWVcdTAwM2UuICBXaXRoaW4gYW4gaW5zdGFuY2UmIzM5O3MgZGlyZWN0b3J5XG4tdGhlcmUgYXJlIHR3byBmaWxlcywgcGFyYWxsZWxfY3B1bWFzayBhbmQgc2VyaWFsX2NwdW1hc2ssIGFuZCBlaXRoZXIgY3B1bWFza1xuLW1heSBiZSBjaGFuZ2VkIGJ5IGVjaG9pbmcgYSBiaXRtYXNrIGludG8gdGhlIGZpbGUsIGZvciBleGFtcGxlOjpcbi1cbi0gICAgZWNobyBmIFx1MDAzZSAvc3lzL2tlcm5lbC9wY3J5cHQvcGVuY3J5cHQvcGFyYWxsZWxfY3B1bWFza1xuLVxuLVJlYWRpbmcgb25lIG9mIHRoZXNlIGZpbGVzIHNob3dzIHRoZSB1c2VyLXN1cHBsaWVkIGNwdW1hc2ssIHdoaWNoIG1heSBiZVxuLWRpZmZlcmVudCBmcm9tIHRoZSAmIzM5O3VzYWJsZSYjMzk7IGNwdW1hc2suXG4tXG4tUGFkYXRhIG1haW50YWlucyB0d28gcGFpcnMgb2YgY3B1bWFza3MgaW50ZXJuYWxseSwgdGhlIHVzZXItc3VwcGxpZWQgY3B1bWFza3Ncbi1hbmQgdGhlICYjMzk7dXNhYmxlJiMzOTsgY3B1bWFza3MuICAoRWFjaCBwYWlyIGNvbnNpc3RzIG9mIGEgcGFyYWxsZWwgYW5kIGEgc2VyaWFsXG4tY3B1bWFzay4pICBUaGUgdXNlci1zdXBwbGllZCBjcHVtYXNrcyBkZWZhdWx0IHRvIGFsbCBwb3NzaWJsZSBDUFVzIG9uIGluc3RhbmNlXG4tYWxsb2NhdGlvbiBhbmQgbWF5IGJlIGNoYW5nZWQgYXMgYWJvdmUuICBUaGUgdXNhYmxlIGNwdW1hc2tzIGFyZSBhbHdheXMgYVxuLXN1YnNldCBvZiB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrcyBhbmQgY29udGFpbiBvbmx5IHRoZSBvbmxpbmUgQ1BVcyBpbiB0aGVcbi11c2VyLXN1cHBsaWVkIG1hc2tzOyB0aGVzZSBhcmUgdGhlIGNwdW1hc2tzIHBhZGF0YSBhY3R1YWxseSB1c2VzLiAgU28gaXQgaXNcbi1sZWdhbCB0byBzdXBwbHkgYSBjcHVtYXNrIHRvIHBhZGF0YSB0aGF0IGNvbnRhaW5zIG9mZmxpbmUgQ1BVcy4gIE9uY2UgYW5cbi1vZmZsaW5lIENQVSBpbiB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrIGNvbWVzIG9ubGluZSwgcGFkYXRhIGlzIGdvaW5nIHRvIHVzZVxuLWl0LlxuLVxuLUNoYW5naW5nIHRoZSBDUFUgbWFza3MgYXJlIGV4cGVuc2l2ZSBvcGVyYXRpb25zLCBzbyBpdCBzaG91bGQgbm90IGJlIGRvbmUgd2l0aFxuLWdyZWF0IGZyZXF1ZW5jeS5cbi1cbi1SdW5uaW5nIEEgSm9iXG4tLS0tLS0tLS0tLS0tLVxuLVxuLUFjdHVhbGx5IHN1Ym1pdHRpbmcgd29yayB0byB0aGUgcGFkYXRhIGluc3RhbmNlIHJlcXVpcmVzIHRoZSBjcmVhdGlvbiBvZiBhXG4tcGFkYXRhX3ByaXYgc3RydWN0dXJlLCB3aGljaCByZXByZXNlbnRzIG9uZSBqb2I6OlxuLVxuLSAgICBzdHJ1Y3QgcGFkYXRhX3ByaXYge1xuLSAgICAgICAgLyogT3RoZXIgc3R1ZmYgaGVyZS4uLiAqL1xuLVx0dm9pZCAgICAgICAgICAgICAgICAgICAgKCpwYXJhbGxlbCkoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpO1xuLVx0dm9pZCAgICAgICAgICAgICAgICAgICAgKCpzZXJpYWwpKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTtcbi0gICAgfTtcbi1cbi1UaGlzIHN0cnVjdHVyZSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgZW1iZWRkZWQgd2l0aGluIHNvbWUgbGFyZ2VyXG4tc3RydWN0dXJlIHNwZWNpZmljIHRvIHRoZSB3b3JrIHRvIGJlIGRvbmUuICBNb3N0IG9mIGl0cyBmaWVsZHMgYXJlIHByaXZhdGUgdG9cbi1wYWRhdGEsIGJ1dCB0aGUgc3RydWN0dXJlIHNob3VsZCBiZSB6ZXJvZWQgYXQgaW5pdGlhbGlzYXRpb24gdGltZSwgYW5kIHRoZVxuLXBhcmFsbGVsKCkgYW5kIHNlcmlhbCgpIGZ1bmN0aW9ucyBzaG91bGQgYmUgcHJvdmlkZWQuICBUaG9zZSBmdW5jdGlvbnMgd2lsbFxuLWJlIGNhbGxlZCBpbiB0aGUgcHJvY2VzcyBvZiBnZXR0aW5nIHRoZSB3b3JrIGRvbmUgYXMgd2Ugd2lsbCBzZWVcbi1tb21lbnRhcmlseS5cbi1cbi1UaGUgc3VibWlzc2lvbiBvZiB0aGUgam9iIGlzIGRvbmUgd2l0aDo6XG4tXG4tICAgIGludCBwYWRhdGFfZG9fcGFyYWxsZWwoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsXG4tXHRcdCAgICAgICAgICAgc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEsIGludCAqY2JfY3B1KTtcbi1cbi1UaGUgcHMgYW5kIHBhZGF0YSBzdHJ1Y3R1cmVzIG11c3QgYmUgc2V0IHVwIGFzIGRlc2NyaWJlZCBhYm92ZTsgY2JfY3B1XG4tcG9pbnRzIHRvIHRoZSBwcmVmZXJyZWQgQ1BVIHRvIGJlIHVzZWQgZm9yIHRoZSBmaW5hbCBjYWxsYmFjayB3aGVuIHRoZSBqb2IgaXNcbi1kb25lOyBpdCBtdXN0IGJlIGluIHRoZSBjdXJyZW50IGluc3RhbmNlJiMzOTtzIENQVSBtYXNrIChpZiBub3QgdGhlIGNiX2NwdSBwb2ludGVyXG4taXMgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgQ1BVIGFjdHVhbGx5IGNob3NlbikuICBUaGUgcmV0dXJuIHZhbHVlIGZyb21cbi1wYWRhdGFfZG9fcGFyYWxsZWwoKSBpcyB6ZXJvIG9uIHN1Y2Nlc3MsIGluZGljYXRpbmcgdGhhdCB0aGUgam9iIGlzIGluXG4tcHJvZ3Jlc3MuIC1FQlVTWSBtZWFucyB0aGF0IHNvbWVib2R5LCBzb21ld2hlcmUgZWxzZSBpcyBtZXNzaW5nIHdpdGggdGhlXG4taW5zdGFuY2UmIzM5O3MgQ1BVIG1hc2ssIHdoaWxlIC1FSU5WQUwgaXMgYSBjb21wbGFpbnQgYWJvdXQgY2JfY3B1IG5vdCBiZWluZyBpbiB0aGVcbi1zZXJpYWwgY3B1bWFzaywgbm8gb25saW5lIENQVXMgaW4gdGhlIHBhcmFsbGVsIG9yIHNlcmlhbCBjcHVtYXNrcywgb3IgYSBzdG9wcGVkXG4taW5zdGFuY2UuXG4tXG4tRWFjaCBqb2Igc3VibWl0dGVkIHRvIHBhZGF0YV9kb19wYXJhbGxlbCgpIHdpbGwsIGluIHR1cm4sIGJlIHBhc3NlZCB0b1xuLWV4YWN0bHkgb25lIGNhbGwgdG8gdGhlIGFib3ZlLW1lbnRpb25lZCBwYXJhbGxlbCgpIGZ1bmN0aW9uLCBvbiBvbmUgQ1BVLCBzb1xuLXRydWUgcGFyYWxsZWxpc20gaXMgYWNoaWV2ZWQgYnkgc3VibWl0dGluZyBtdWx0aXBsZSBqb2JzLiAgcGFyYWxsZWwoKSBydW5zIHdpdGhcbi1zb2Z0d2FyZSBpbnRlcnJ1cHRzIGRpc2FibGVkIGFuZCB0aHVzIGNhbm5vdCBzbGVlcC4gIFRoZSBwYXJhbGxlbCgpXG4tZnVuY3Rpb24gZ2V0cyB0aGUgcGFkYXRhX3ByaXYgc3RydWN0dXJlIHBvaW50ZXIgYXMgaXRzIGxvbmUgcGFyYW1ldGVyO1xuLWluZm9ybWF0aW9uIGFib3V0IHRoZSBhY3R1YWwgd29yayB0byBiZSBkb25lIGlzIHByb2JhYmx5IG9idGFpbmVkIGJ5IHVzaW5nXG4tY29udGFpbmVyX29mKCkgdG8gZmluZCB0aGUgZW5jbG9zaW5nIHN0cnVjdHVyZS5cbi1cbi1Ob3RlIHRoYXQgcGFyYWxsZWwoKSBoYXMgbm8gcmV0dXJuIHZhbHVlOyB0aGUgcGFkYXRhIHN1YnN5c3RlbSBhc3N1bWVzIHRoYXRcbi1wYXJhbGxlbCgpIHdpbGwgdGFrZSByZXNwb25zaWJpbGl0eSBmb3IgdGhlIGpvYiBmcm9tIHRoaXMgcG9pbnQuICBUaGUgam9iXG4tbmVlZCBub3QgYmUgY29tcGxldGVkIGR1cmluZyB0aGlzIGNhbGwsIGJ1dCwgaWYgcGFyYWxsZWwoKSBsZWF2ZXMgd29ya1xuLW91dHN0YW5kaW5nLCBpdCBzaG91bGQgYmUgcHJlcGFyZWQgdG8gYmUgY2FsbGVkIGFnYWluIHdpdGggYSBuZXcgam9iIGJlZm9yZVxuLXRoZSBwcmV2aW91cyBvbmUgY29tcGxldGVzLlxuLVxuLVNlcmlhbGl6aW5nIEpvYnNcbi0tLS0tLS0tLS0tLS0tLS0tXG4tXG4tV2hlbiBhIGpvYiBkb2VzIGNvbXBsZXRlLCBwYXJhbGxlbCgpIChvciB3aGF0ZXZlciBmdW5jdGlvbiBhY3R1YWxseSBmaW5pc2hlc1xuLXRoZSB3b3JrKSBzaG91bGQgaW5mb3JtIHBhZGF0YSBvZiB0aGUgZmFjdCB3aXRoIGEgY2FsbCB0bzo6XG4tXG4tICAgIHZvaWQgcGFkYXRhX2RvX3NlcmlhbChzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSk7XG4tXG4tQXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLCBwYWRhdGFfZG9fc2VyaWFsKCkgd2lsbCB0cmlnZ2VyIGEgY2FsbCB0byB0aGVcbi1zZXJpYWwoKSBmdW5jdGlvbiBpbiB0aGUgcGFkYXRhX3ByaXYgc3RydWN0dXJlLiAgVGhhdCBjYWxsIHdpbGwgaGFwcGVuIG9uXG4tdGhlIENQVSByZXF1ZXN0ZWQgaW4gdGhlIGluaXRpYWwgY2FsbCB0byBwYWRhdGFfZG9fcGFyYWxsZWwoKTsgaXQsIHRvbywgaXNcbi1ydW4gd2l0aCBsb2NhbCBzb2Z0d2FyZSBpbnRlcnJ1cHRzIGRpc2FibGVkLlxuLU5vdGUgdGhhdCB0aGlzIGNhbGwgbWF5IGJlIGRlZmVycmVkIGZvciBhIHdoaWxlIHNpbmNlIHRoZSBwYWRhdGEgY29kZSB0YWtlc1xuLXBhaW5zIHRvIGVuc3VyZSB0aGF0IGpvYnMgYXJlIGNvbXBsZXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlXG4tc3VibWl0dGVkLlxuLVxuLURlc3Ryb3lpbmdcbi0tLS0tLS0tLS0tXG4tXG4tQ2xlYW5pbmcgdXAgYSBwYWRhdGEgaW5zdGFuY2UgcHJlZGljdGFibHkgaW52b2x2ZXMgY2FsbGluZyB0aGUgdHdvIGZyZWVcbi1mdW5jdGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBhbGxvY2F0aW9uIGluIHJldmVyc2U6OlxuLVxuLSAgICB2b2lkIHBhZGF0YV9mcmVlX3NoZWxsKHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzKTtcbi0gICAgdm9pZCBwYWRhdGFfZnJlZShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCk7XG4tXG4tSXQgaXMgdGhlIHVzZXImIzM5O3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIGFsbCBvdXRzdGFuZGluZyBqb2JzIGFyZSBjb21wbGV0ZVxuLWJlZm9yZSBhbnkgb2YgdGhlIGFib3ZlIGFyZSBjYWxsZWQuXG4tXG4gUnVubmluZyBNdWx0aXRocmVhZGVkIEpvYnNcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuIFxuZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlNcbmluZGV4IDgwNmJkMmQ4MGQxNTM1Li4yNjBiM2JkYzc2MTQ4YyAxMDA2NDRcbi0tLSBhL01BSU5UQUlORVJTXG4mIzQzOyYjNDM7JiM0MzsgYi9NQUlOVEFJTkVSU1xuQEAgLTIxMDg1LDEzICYjNDM7MjEwODUsNiBAQCBMOlx0bmV0ZGV2QHZnZXIua2VybmVsLm9yZ1xuIFM6XHRNYWludGFpbmVkXG4gRjpcdGRyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9wY25ldDMyLmNcbiBcbi1QQ1JZUFQgUEFSQUxMRUwgQ1JZUFRPIEVOR0lORVxuLU06XHRTdGVmZmVuIEtsYXNzZXJ0IFx1MDAzY3N0ZWZmZW4ua2xhc3NlcnRAc2VjdW5ldC5jb21cdTAwM2Vcbi1MOlx0bGludXgtY3J5cHRvQHZnZXIua2VybmVsLm9yZ1xuLVM6XHRNYWludGFpbmVkXG4tRjpcdGNyeXB0by9wY3J5cHQuY1xuLUY6XHRpbmNsdWRlL2NyeXB0by9wY3J5cHQuaFxuLVxuIFBEUyBEU0MgVklSVElPIERBVEEgUEFUSCBBQ0NFTEVSQVRPUlxuIFI6XHRCcmV0dCBDcmVlbGV5IFx1MDAzY2JyZXR0LmNyZWVsZXlAYW1kLmNvbVx1MDAzZVxuIEY6XHRkcml2ZXJzL3ZkcGEvcGRzL1xuZGlmZiAtLWdpdCBhL2FyY2gvbG9vbmdhcmNoL2NvbmZpZ3MvbG9vbmdzb24zMl9kZWZjb25maWcgYi9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uMzJfZGVmY29uZmlnXG5pbmRleCA3YzhmMDE1MTNlZDI3Yy4uY2Y5N2Y0NDkzNTczNmYgMTAwNjQ0XG4tLS0gYS9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uMzJfZGVmY29uZmlnXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uMzJfZGVmY29uZmlnXG5AQCAtMTA2Myw3ICYjNDM7MTA2Myw2IEBAIENPTkZJR19TRUNVUklUWV9ZQU1BPXlcbiBDT05GSUdfREVGQVVMVF9TRUNVUklUWV9EQUM9eVxuIENPTkZJR19DUllQVE9fVVNFUj1tXG4gQ09ORklHX0NSWVBUT19TRUxGVEVTVFM9eVxuLUNPTkZJR19DUllQVE9fUENSWVBUPW1cbiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tXG4gQ09ORklHX0NSWVBUT19BTlVCSVM9bVxuIENPTkZJR19DUllQVE9fQkxPV0ZJU0g9bVxuZGlmZiAtLWdpdCBhL2FyY2gvbG9vbmdhcmNoL2NvbmZpZ3MvbG9vbmdzb242NF9kZWZjb25maWcgYi9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uNjRfZGVmY29uZmlnXG5pbmRleCA4ZTM5MDZkM2JkNzBjYS4uZDBlY2U3OTIwZjIxNTggMTAwNjQ0XG4tLS0gYS9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uNjRfZGVmY29uZmlnXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uNjRfZGVmY29uZmlnXG5AQCAtMTA5Niw3ICYjNDM7MTA5Niw2IEBAIENPTkZJR19TRUNVUklUWV9ZQU1BPXlcbiBDT05GSUdfREVGQVVMVF9TRUNVUklUWV9EQUM9eVxuIENPTkZJR19DUllQVE9fVVNFUj1tXG4gQ09ORklHX0NSWVBUT19TRUxGVEVTVFM9eVxuLUNPTkZJR19DUllQVE9fUENSWVBUPW1cbiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tXG4gQ09ORklHX0NSWVBUT19BTlVCSVM9bVxuIENPTkZJR19DUllQVE9fQkxPV0ZJU0g9bVxuZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jb25maWdzL2RlYnVnX2RlZmNvbmZpZyBiL2FyY2gvczM5MC9jb25maWdzL2RlYnVnX2RlZmNvbmZpZ1xuaW5kZXggNTQ2MzdiZTg3ZmI3MzUuLjE1ZjUxY2I5MjRkYmYwIDEwMDY0NFxuLS0tIGEvYXJjaC9zMzkwL2NvbmZpZ3MvZGVidWdfZGVmY29uZmlnXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3MzOTAvY29uZmlncy9kZWJ1Z19kZWZjb25maWdcbkBAIC03NjUsNyAmIzQzOzc2NSw2IEBAIENPTkZJR19DUllQVE9fVVNFUj1tXG4gQ09ORklHX0NSWVBUT19TRUxGVEVTVFM9eVxuIENPTkZJR19DUllQVE9fU0VMRlRFU1RTX0ZVTEw9eVxuIENPTkZJR19DUllQVE9fTlVMTD15XG4tQ09ORklHX0NSWVBUT19QQ1JZUFQ9bVxuIENPTkZJR19DUllQVE9fQ1JZUFREPW1cbiBDT05GSUdfQ1JZUFRPX0JFTkNITUFSSz1tXG4gQ09ORklHX0NSWVBUT19ESD1tXG5kaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NvbmZpZ3MvZGVmY29uZmlnIGIvYXJjaC9zMzkwL2NvbmZpZ3MvZGVmY29uZmlnXG5pbmRleCA1ZjUxMTRhMjUzY2Y3Yy4uODgyNTdmZjNjMmM2YWEgMTAwNjQ0XG4tLS0gYS9hcmNoL3MzOTAvY29uZmlncy9kZWZjb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvczM5MC9jb25maWdzL2RlZmNvbmZpZ1xuQEAgLTc0OSw3ICYjNDM7NzQ5LDYgQEAgQ09ORklHX0NSWVBUT19GSVBTPXlcbiBDT05GSUdfQ1JZUFRPX1VTRVI9bVxuIENPTkZJR19DUllQVE9fU0VMRlRFU1RTPXlcbiBDT05GSUdfQ1JZUFRPX05VTEw9eVxuLUNPTkZJR19DUllQVE9fUENSWVBUPW1cbiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tXG4gQ09ORklHX0NSWVBUT19CRU5DSE1BUks9bVxuIENPTkZJR19DUllQVE9fREg9bVxuZGlmZiAtLWdpdCBhL2NyeXB0by9LY29uZmlnIGIvY3J5cHRvL0tjb25maWdcbmluZGV4IGYxZTM3MjE5NTI3MzE2Li4yMjhhN2FjOWYwNjNhMiAxMDA2NDRcbi0tLSBhL2NyeXB0by9LY29uZmlnXG4mIzQzOyYjNDM7JiM0MzsgYi9jcnlwdG8vS2NvbmZpZ1xuQEAgLTIwMSwxNiAmIzQzOzIwMSw2IEBAIGNvbmZpZyBDUllQVE9fTlVMTFxuIFx0aGVscFxuIFx0ICBUaGVzZSBhcmUgJiMzOTtOdWxsJiMzOTsgYWxnb3JpdGhtcywgdXNlZCBieSBJUHNlYywgd2hpY2ggZG8gbm90aGluZy5cbiBcbi1jb25maWcgQ1JZUFRPX1BDUllQVFxuLVx0dHJpc3RhdGUgXCYjMzQ7UGFyYWxsZWwgY3J5cHRvIGVuZ2luZVwmIzM0O1xuLVx0ZGVwZW5kcyBvbiBTTVBcbi1cdHNlbGVjdCBQQURBVEFcbi1cdHNlbGVjdCBDUllQVE9fTUFOQUdFUlxuLVx0c2VsZWN0IENSWVBUT19BRUFEXG4tXHRoZWxwXG4tXHQgIFRoaXMgY29udmVydHMgYW4gYXJiaXRyYXJ5IGNyeXB0byBhbGdvcml0aG0gaW50byBhIHBhcmFsbGVsXG4tXHQgIGFsZ29yaXRobSB0aGF0IGV4ZWN1dGVzIGluIGtlcm5lbCB0aHJlYWRzLlxuLVxuIGNvbmZpZyBDUllQVE9fQ1JZUFREXG4gXHR0cmlzdGF0ZSBcJiMzNDtTb2Z0d2FyZSBhc3luYyBjcnlwdG8gZGFlbW9uXCYjMzQ7XG4gXHRzZWxlY3QgQ1JZUFRPX0FFQURcbmRpZmYgLS1naXQgYS9jcnlwdG8vTWFrZWZpbGUgYi9jcnlwdG8vTWFrZWZpbGVcbmluZGV4IDgzODZkNTVhOTc1NWU3Li4yZTQ4N2M5NDZlNjNkNyAxMDA2NDRcbi0tLSBhL2NyeXB0by9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvY3J5cHRvL01ha2VmaWxlXG5AQCAtMTIwLDcgJiM0MzsxMjAsNiBAQCBDRkxBR1NfYWVnaXMxMjgtbmVvbi1pbm5lci5vICYjNDM7PSAkKGFlZ2lzMTI4LWNmbGFncy15KVxuIGFlZ2lzMTI4LSQoQ09ORklHX0NSWVBUT19BRUdJUzEyOF9TSU1EKSAmIzQzOz0gYWVnaXMxMjgtbmVvbi5vIGFlZ2lzMTI4LW5lb24taW5uZXIub1xuIGVuZGlmXG4gXG4tb2JqLSQoQ09ORklHX0NSWVBUT19QQ1JZUFQpICYjNDM7PSBwY3J5cHQub1xuIG9iai0kKENPTkZJR19DUllQVE9fQ1JZUFREKSAmIzQzOz0gY3J5cHRkLm9cbiBvYmotJChDT05GSUdfQ1JZUFRPX0RFUykgJiM0Mzs9IGRlc19nZW5lcmljLm9cbiBvYmotJChDT05GSUdfQ1JZUFRPX0JMT1dGSVNIKSAmIzQzOz0gYmxvd2Zpc2hfZ2VuZXJpYy5vXG5kaWZmIC0tZ2l0IGEvY3J5cHRvL3BjcnlwdC5jIGIvY3J5cHRvL3BjcnlwdC5jXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDlmMzcyNDQyOTgxZTY1Li4wMDAwMDAwMDAwMDAwMFxuLS0tIGEvY3J5cHRvL3BjcnlwdC5jXG4mIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsXG5AQCAtMSwzOTQgJiM0MzswLDAgQEBcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tLypcbi0gKiBwY3J5cHQgLSBQYXJhbGxlbCBjcnlwdG8gd3JhcHBlci5cbi0gKlxuLSAqIENvcHlyaWdodCAoQykgMjAwOSBzZWN1bmV0IFNlY3VyaXR5IE5ldHdvcmtzIEFHXG4tICogQ29weXJpZ2h0IChDKSAyMDA5IFN0ZWZmZW4gS2xhc3NlcnQgXHUwMDNjc3RlZmZlbi5rbGFzc2VydEBzZWN1bmV0LmNvbVx1MDAzZVxuLSAqL1xuLVxuLSNpbmNsdWRlIFx1MDAzY2NyeXB0by9hbGdhcGkuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2NyeXB0by9pbnRlcm5hbC9hZWFkLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9hdG9taWMuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2Vyci5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvaW5pdC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbW9kdWxlLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9rb2JqZWN0LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9jcHUuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2NyeXB0by9wY3J5cHQuaFx1MDAzZVxuLVxuLXN0YXRpYyBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwZW5jcnlwdDtcbi1zdGF0aWMgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGRlY3J5cHQ7XG4tc3RhdGljIHN0cnVjdCBrc2V0ICAgICAgICAgICAqcGNyeXB0X2tzZXQ7XG4tXG4tc3RydWN0IHBjcnlwdF9pbnN0YW5jZV9jdHgge1xuLVx0c3RydWN0IGNyeXB0b19hZWFkX3NwYXduIHNwYXduO1xuLVx0c3RydWN0IHBhZGF0YV9zaGVsbCAqcHNlbmM7XG4tXHRzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwc2RlYztcbi1cdGF0b21pY190IHRmbV9jb3VudDtcbi19O1xuLVxuLXN0cnVjdCBwY3J5cHRfYWVhZF9jdHgge1xuLVx0c3RydWN0IGNyeXB0b19hZWFkICpjaGlsZDtcbi1cdHVuc2lnbmVkIGludCBjYl9jcHU7XG4tfTtcbi1cbi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4ICpwY3J5cHRfdGZtX2ljdHgoXG4tXHRzdHJ1Y3QgY3J5cHRvX2FlYWQgKnRmbSlcbi17XG4tXHRyZXR1cm4gYWVhZF9pbnN0YW5jZV9jdHgoYWVhZF9hbGdfaW5zdGFuY2UodGZtKSk7XG4tfVxuLVxuLXN0YXRpYyBpbnQgcGNyeXB0X2FlYWRfc2V0a2V5KHN0cnVjdCBjcnlwdG9fYWVhZCAqcGFyZW50LFxuLVx0XHRcdCAgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pXG4te1xuLVx0c3RydWN0IHBjcnlwdF9hZWFkX2N0eCAqY3R4ID0gY3J5cHRvX2FlYWRfY3R4KHBhcmVudCk7XG4tXG4tXHRyZXR1cm4gY3J5cHRvX2FlYWRfc2V0a2V5KGN0eC1cdTAwM2VjaGlsZCwga2V5LCBrZXlsZW4pO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX3NldGF1dGhzaXplKHN0cnVjdCBjcnlwdG9fYWVhZCAqcGFyZW50LFxuLVx0XHRcdFx0ICAgdW5zaWduZWQgaW50IGF1dGhzaXplKVxuLXtcbi1cdHN0cnVjdCBwY3J5cHRfYWVhZF9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eChwYXJlbnQpO1xuLVxuLVx0cmV0dXJuIGNyeXB0b19hZWFkX3NldGF1dGhzaXplKGN0eC1cdTAwM2VjaGlsZCwgYXV0aHNpemUpO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBwY3J5cHRfYWVhZF9zZXJpYWwoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpXG4te1xuLVx0c3RydWN0IHBjcnlwdF9yZXF1ZXN0ICpwcmVxID0gcGNyeXB0X3BhZGF0YV9yZXF1ZXN0KHBhZGF0YSk7XG4tXHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBwY3J5cHRfcmVxdWVzdF9jdHgocHJlcSk7XG4tXG4tXHRhZWFkX3JlcXVlc3RfY29tcGxldGUocmVxLVx1MDAzZWJhc2UuZGF0YSwgcGFkYXRhLVx1MDAzZWluZm8pO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBwY3J5cHRfYWVhZF9kb25lKHZvaWQgKmRhdGEsIGludCBlcnIpXG4te1xuLVx0c3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxID0gZGF0YTtcbi1cdHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IGFlYWRfcmVxdWVzdF9jdHgocmVxKTtcbi1cdHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhID0gcGNyeXB0X3JlcXVlc3RfcGFkYXRhKHByZXEpO1xuLVxuLVx0aWYgKGVyciA9PSAtRUlOUFJPR1JFU1MpXG4tXHRcdHJldHVybjtcbi1cbi1cdHBhZGF0YS1cdTAwM2VpbmZvID0gZXJyO1xuLVxuLVx0cGFkYXRhX2RvX3NlcmlhbChwYWRhdGEpO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBwY3J5cHRfYWVhZF9lbmMoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpXG4te1xuLVx0c3RydWN0IHBjcnlwdF9yZXF1ZXN0ICpwcmVxID0gcGNyeXB0X3BhZGF0YV9yZXF1ZXN0KHBhZGF0YSk7XG4tXHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBwY3J5cHRfcmVxdWVzdF9jdHgocHJlcSk7XG4tXHRpbnQgcmV0O1xuLVxuLVx0cmV0ID0gY3J5cHRvX2FlYWRfZW5jcnlwdChyZXEpO1xuLVxuLVx0aWYgKHJldCA9PSAtRUlOUFJPR1JFU1MgfHwgcmV0ID09IC1FQlVTWSlcbi1cdFx0cmV0dXJuO1xuLVxuLVx0cGFkYXRhLVx1MDAzZWluZm8gPSByZXQ7XG4tXHRwYWRhdGFfZG9fc2VyaWFsKHBhZGF0YSk7XG4tfVxuLVxuLXN0YXRpYyBpbnQgcGNyeXB0X2FlYWRfZW5jcnlwdChzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEpXG4te1xuLVx0aW50IGVycjtcbi1cdHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IGFlYWRfcmVxdWVzdF9jdHgocmVxKTtcbi1cdHN0cnVjdCBhZWFkX3JlcXVlc3QgKmNyZXEgPSBwY3J5cHRfcmVxdWVzdF9jdHgocHJlcSk7XG4tXHRzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSA9IHBjcnlwdF9yZXF1ZXN0X3BhZGF0YShwcmVxKTtcbi1cdHN0cnVjdCBjcnlwdG9fYWVhZCAqYWVhZCA9IGNyeXB0b19hZWFkX3JlcXRmbShyZXEpO1xuLVx0c3RydWN0IHBjcnlwdF9hZWFkX2N0eCAqY3R4ID0gY3J5cHRvX2FlYWRfY3R4KGFlYWQpO1xuLVx0dTMyIGZsYWdzID0gYWVhZF9yZXF1ZXN0X2ZsYWdzKHJlcSk7XG4tXHRzdHJ1Y3QgcGNyeXB0X2luc3RhbmNlX2N0eCAqaWN0eDtcbi1cbi1cdGljdHggPSBwY3J5cHRfdGZtX2ljdHgoYWVhZCk7XG4tXG4tXHRtZW1zZXQocGFkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHBhZGF0YV9wcml2KSk7XG4tXG4tXHRwYWRhdGEtXHUwMDNlcGFyYWxsZWwgPSBwY3J5cHRfYWVhZF9lbmM7XG4tXHRwYWRhdGEtXHUwMDNlc2VyaWFsID0gcGNyeXB0X2FlYWRfc2VyaWFsO1xuLVxuLVx0YWVhZF9yZXF1ZXN0X3NldF90Zm0oY3JlcSwgY3R4LVx1MDAzZWNoaWxkKTtcbi1cdGFlYWRfcmVxdWVzdF9zZXRfY2FsbGJhY2soY3JlcSwgZmxhZ3MgXHUwMDI2IH5DUllQVE9fVEZNX1JFUV9NQVlfU0xFRVAsXG4tXHRcdFx0XHQgIHBjcnlwdF9hZWFkX2RvbmUsIHJlcSk7XG4tXHRhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KGNyZXEsIHJlcS1cdTAwM2VzcmMsIHJlcS1cdTAwM2Vkc3QsXG4tXHRcdFx0ICAgICAgIHJlcS1cdTAwM2VjcnlwdGxlbiwgcmVxLVx1MDAzZWl2KTtcbi1cdGFlYWRfcmVxdWVzdF9zZXRfYWQoY3JlcSwgcmVxLVx1MDAzZWFzc29jbGVuKTtcbi1cbi1cdGVyciA9IHBhZGF0YV9kb19wYXJhbGxlbChpY3R4LVx1MDAzZXBzZW5jLCBwYWRhdGEsIFx1MDAyNmN0eC1cdTAwM2VjYl9jcHUpO1xuLVx0aWYgKCFlcnIpXG4tXHRcdHJldHVybiAtRUlOUFJPR1JFU1M7XG4tXHRpZiAoZXJyID09IC1FQlVTWSkge1xuLVx0XHQvKiB0cnkgbm9uLXBhcmFsbGVsIG1vZGUgKi9cbi1cdFx0YWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhjcmVxLCBmbGFncywgcmVxLVx1MDAzZWJhc2UuY29tcGxldGUsXG4tXHRcdFx0XHRcdCAgcmVxLVx1MDAzZWJhc2UuZGF0YSk7XG4tXHRcdHJldHVybiBjcnlwdG9fYWVhZF9lbmNyeXB0KGNyZXEpO1xuLVx0fVxuLVxuLVx0cmV0dXJuIGVycjtcbi19XG4tXG4tc3RhdGljIHZvaWQgcGNyeXB0X2FlYWRfZGVjKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKVxuLXtcbi1cdHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IHBjcnlwdF9wYWRhdGFfcmVxdWVzdChwYWRhdGEpO1xuLVx0c3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxID0gcGNyeXB0X3JlcXVlc3RfY3R4KHByZXEpO1xuLVx0aW50IHJldDtcbi1cbi1cdHJldCA9IGNyeXB0b19hZWFkX2RlY3J5cHQocmVxKTtcbi1cbi1cdGlmIChyZXQgPT0gLUVJTlBST0dSRVNTIHx8IHJldCA9PSAtRUJVU1kpXG4tXHRcdHJldHVybjtcbi1cbi1cdHBhZGF0YS1cdTAwM2VpbmZvID0gcmV0O1xuLVx0cGFkYXRhX2RvX3NlcmlhbChwYWRhdGEpO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX2RlY3J5cHQoc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxKVxuLXtcbi1cdGludCBlcnI7XG4tXHRzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnByZXEgPSBhZWFkX3JlcXVlc3RfY3R4KHJlcSk7XG4tXHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpjcmVxID0gcGNyeXB0X3JlcXVlc3RfY3R4KHByZXEpO1xuLVx0c3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEgPSBwY3J5cHRfcmVxdWVzdF9wYWRhdGEocHJlcSk7XG4tXHRzdHJ1Y3QgY3J5cHRvX2FlYWQgKmFlYWQgPSBjcnlwdG9fYWVhZF9yZXF0Zm0ocmVxKTtcbi1cdHN0cnVjdCBwY3J5cHRfYWVhZF9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eChhZWFkKTtcbi1cdHUzMiBmbGFncyA9IGFlYWRfcmVxdWVzdF9mbGFncyhyZXEpO1xuLVx0c3RydWN0IHBjcnlwdF9pbnN0YW5jZV9jdHggKmljdHg7XG4tXG4tXHRpY3R4ID0gcGNyeXB0X3RmbV9pY3R4KGFlYWQpO1xuLVxuLVx0bWVtc2V0KHBhZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBwYWRhdGFfcHJpdikpO1xuLVxuLVx0cGFkYXRhLVx1MDAzZXBhcmFsbGVsID0gcGNyeXB0X2FlYWRfZGVjO1xuLVx0cGFkYXRhLVx1MDAzZXNlcmlhbCA9IHBjcnlwdF9hZWFkX3NlcmlhbDtcbi1cbi1cdGFlYWRfcmVxdWVzdF9zZXRfdGZtKGNyZXEsIGN0eC1cdTAwM2VjaGlsZCk7XG4tXHRhZWFkX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKGNyZXEsIGZsYWdzIFx1MDAyNiB+Q1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQLFxuLVx0XHRcdFx0ICBwY3J5cHRfYWVhZF9kb25lLCByZXEpO1xuLVx0YWVhZF9yZXF1ZXN0X3NldF9jcnlwdChjcmVxLCByZXEtXHUwMDNlc3JjLCByZXEtXHUwMDNlZHN0LFxuLVx0XHRcdCAgICAgICByZXEtXHUwMDNlY3J5cHRsZW4sIHJlcS1cdTAwM2Vpdik7XG4tXHRhZWFkX3JlcXVlc3Rfc2V0X2FkKGNyZXEsIHJlcS1cdTAwM2Vhc3NvY2xlbik7XG4tXG4tXHRlcnIgPSBwYWRhdGFfZG9fcGFyYWxsZWwoaWN0eC1cdTAwM2Vwc2RlYywgcGFkYXRhLCBcdTAwMjZjdHgtXHUwMDNlY2JfY3B1KTtcbi1cdGlmICghZXJyKVxuLVx0XHRyZXR1cm4gLUVJTlBST0dSRVNTO1xuLVx0aWYgKGVyciA9PSAtRUJVU1kpIHtcbi1cdFx0LyogdHJ5IG5vbi1wYXJhbGxlbCBtb2RlICovXG4tXHRcdGFlYWRfcmVxdWVzdF9zZXRfY2FsbGJhY2soY3JlcSwgZmxhZ3MsIHJlcS1cdTAwM2ViYXNlLmNvbXBsZXRlLFxuLVx0XHRcdFx0XHQgIHJlcS1cdTAwM2ViYXNlLmRhdGEpO1xuLVx0XHRyZXR1cm4gY3J5cHRvX2FlYWRfZGVjcnlwdChjcmVxKTtcbi1cdH1cbi1cbi1cdHJldHVybiBlcnI7XG4tfVxuLVxuLXN0YXRpYyBpbnQgcGNyeXB0X2FlYWRfaW5pdF90Zm0oc3RydWN0IGNyeXB0b19hZWFkICp0Zm0pXG4te1xuLVx0aW50IGNwdV9pbmRleDtcbi1cdHN0cnVjdCBhZWFkX2luc3RhbmNlICppbnN0ID0gYWVhZF9hbGdfaW5zdGFuY2UodGZtKTtcbi1cdHN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4ICppY3R4ID0gYWVhZF9pbnN0YW5jZV9jdHgoaW5zdCk7XG4tXHRzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgodGZtKTtcbi1cdHN0cnVjdCBjcnlwdG9fYWVhZCAqY2lwaGVyO1xuLVxuLVx0Y3B1X2luZGV4ID0gKHVuc2lnbmVkIGludClhdG9taWNfaW5jX3JldHVybihcdTAwMjZpY3R4LVx1MDAzZXRmbV9jb3VudCkgJVxuLVx0XHQgICAgY3B1bWFza193ZWlnaHQoY3B1X29ubGluZV9tYXNrKTtcbi1cbi1cdGN0eC1cdTAwM2VjYl9jcHUgPSBjcHVtYXNrX250aChjcHVfaW5kZXgsIGNwdV9vbmxpbmVfbWFzayk7XG4tXHRjaXBoZXIgPSBjcnlwdG9fc3Bhd25fYWVhZChcdTAwMjZpY3R4LVx1MDAzZXNwYXduKTtcbi1cbi1cdGlmIChJU19FUlIoY2lwaGVyKSlcbi1cdFx0cmV0dXJuIFBUUl9FUlIoY2lwaGVyKTtcbi1cbi1cdGN0eC1cdTAwM2VjaGlsZCA9IGNpcGhlcjtcbi1cdGNyeXB0b19hZWFkX3NldF9yZXFzaXplKHRmbSwgc2l6ZW9mKHN0cnVjdCBwY3J5cHRfcmVxdWVzdCkgJiM0Mztcbi1cdFx0XHRcdCAgICAgc2l6ZW9mKHN0cnVjdCBhZWFkX3JlcXVlc3QpICYjNDM7XG4tXHRcdFx0XHQgICAgIGNyeXB0b19hZWFkX3JlcXNpemUoY2lwaGVyKSk7XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4tc3RhdGljIHZvaWQgcGNyeXB0X2FlYWRfZXhpdF90Zm0oc3RydWN0IGNyeXB0b19hZWFkICp0Zm0pXG4te1xuLVx0c3RydWN0IHBjcnlwdF9hZWFkX2N0eCAqY3R4ID0gY3J5cHRvX2FlYWRfY3R4KHRmbSk7XG4tXG4tXHRjcnlwdG9fZnJlZV9hZWFkKGN0eC1cdTAwM2VjaGlsZCk7XG4tfVxuLVxuLXN0YXRpYyB2b2lkIHBjcnlwdF9mcmVlKHN0cnVjdCBhZWFkX2luc3RhbmNlICppbnN0KVxuLXtcbi1cdHN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4ICpjdHggPSBhZWFkX2luc3RhbmNlX2N0eChpbnN0KTtcbi1cbi1cdGNyeXB0b19kcm9wX2FlYWQoXHUwMDI2Y3R4LVx1MDAzZXNwYXduKTtcbi1cdHBhZGF0YV9mcmVlX3NoZWxsKGN0eC1cdTAwM2Vwc2RlYyk7XG4tXHRwYWRhdGFfZnJlZV9zaGVsbChjdHgtXHUwMDNlcHNlbmMpO1xuLVx0a2ZyZWUoaW5zdCk7XG4tfVxuLVxuLXN0YXRpYyBpbnQgcGNyeXB0X2luaXRfaW5zdGFuY2Uoc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdCxcbi1cdFx0XHRcdHN0cnVjdCBjcnlwdG9fYWxnICphbGcpXG4te1xuLVx0aWYgKHNucHJpbnRmKGluc3QtXHUwMDNlYWxnLmNyYV9kcml2ZXJfbmFtZSwgQ1JZUFRPX01BWF9BTEdfTkFNRSxcbi1cdFx0ICAgICBcJiMzNDtwY3J5cHQoJXMpXCYjMzQ7LCBhbGctXHUwMDNlY3JhX2RyaXZlcl9uYW1lKSBcdTAwM2U9IENSWVBUT19NQVhfQUxHX05BTUUpXG4tXHRcdHJldHVybiAtRU5BTUVUT09MT05HO1xuLVxuLVx0bWVtY3B5KGluc3QtXHUwMDNlYWxnLmNyYV9uYW1lLCBhbGctXHUwMDNlY3JhX25hbWUsIENSWVBUT19NQVhfQUxHX05BTUUpO1xuLVxuLVx0aW5zdC1cdTAwM2VhbGcuY3JhX3ByaW9yaXR5ID0gYWxnLVx1MDAzZWNyYV9wcmlvcml0eSAmIzQzOyAxMDA7XG4tXHRpbnN0LVx1MDAzZWFsZy5jcmFfYmxvY2tzaXplID0gYWxnLVx1MDAzZWNyYV9ibG9ja3NpemU7XG4tXHRpbnN0LVx1MDAzZWFsZy5jcmFfYWxpZ25tYXNrID0gYWxnLVx1MDAzZWNyYV9hbGlnbm1hc2s7XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4tc3RhdGljIGludCBwY3J5cHRfY3JlYXRlX2FlYWQoc3RydWN0IGNyeXB0b190ZW1wbGF0ZSAqdG1wbCwgc3RydWN0IHJ0YXR0ciAqKnRiLFxuLVx0XHRcdCAgICAgIHN0cnVjdCBjcnlwdG9fYXR0cl90eXBlICphbGd0KVxuLXtcbi1cdHN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4ICpjdHg7XG4tXHRzdHJ1Y3QgYWVhZF9pbnN0YW5jZSAqaW5zdDtcbi1cdHN0cnVjdCBhZWFkX2FsZyAqYWxnO1xuLVx0dTMyIG1hc2sgPSBjcnlwdG9fYWxndF9pbmhlcml0ZWRfbWFzayhhbGd0KTtcbi1cdGludCBlcnI7XG4tXG4tXHRpbnN0ID0ga3phbGxvYyhzaXplb2YoKmluc3QpICYjNDM7IHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7XG4tXHRpZiAoIWluc3QpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuLVxuLVx0ZXJyID0gLUVOT01FTTtcbi1cbi1cdGN0eCA9IGFlYWRfaW5zdGFuY2VfY3R4KGluc3QpO1xuLVx0Y3R4LVx1MDAzZXBzZW5jID0gcGFkYXRhX2FsbG9jX3NoZWxsKHBlbmNyeXB0KTtcbi1cdGlmICghY3R4LVx1MDAzZXBzZW5jKVxuLVx0XHRnb3RvIGVycl9mcmVlX2luc3Q7XG4tXG4tXHRjdHgtXHUwMDNlcHNkZWMgPSBwYWRhdGFfYWxsb2Nfc2hlbGwocGRlY3J5cHQpO1xuLVx0aWYgKCFjdHgtXHUwMDNlcHNkZWMpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfaW5zdDtcbi1cbi1cdGVyciA9IGNyeXB0b19ncmFiX2FlYWQoXHUwMDI2Y3R4LVx1MDAzZXNwYXduLCBhZWFkX2NyeXB0b19pbnN0YW5jZShpbnN0KSxcbi1cdFx0XHQgICAgICAgY3J5cHRvX2F0dHJfYWxnX25hbWUodGJbMV0pLCAwLCBtYXNrKTtcbi1cdGlmIChlcnIpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfaW5zdDtcbi1cbi1cdGFsZyA9IGNyeXB0b19zcGF3bl9hZWFkX2FsZyhcdTAwMjZjdHgtXHUwMDNlc3Bhd24pO1xuLVx0ZXJyID0gcGNyeXB0X2luaXRfaW5zdGFuY2UoYWVhZF9jcnlwdG9faW5zdGFuY2UoaW5zdCksIFx1MDAyNmFsZy1cdTAwM2ViYXNlKTtcbi1cdGlmIChlcnIpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfaW5zdDtcbi1cbi1cdGluc3QtXHUwMDNlYWxnLmJhc2UuY3JhX2ZsYWdzIHw9IENSWVBUT19BTEdfQVNZTkM7XG4tXG4tXHRpbnN0LVx1MDAzZWFsZy5pdnNpemUgPSBjcnlwdG9fYWVhZF9hbGdfaXZzaXplKGFsZyk7XG4tXHRpbnN0LVx1MDAzZWFsZy5tYXhhdXRoc2l6ZSA9IGNyeXB0b19hZWFkX2FsZ19tYXhhdXRoc2l6ZShhbGcpO1xuLVxuLVx0aW5zdC1cdTAwM2VhbGcuYmFzZS5jcmFfY3R4c2l6ZSA9IHNpemVvZihzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4KTtcbi1cbi1cdGluc3QtXHUwMDNlYWxnLmluaXQgPSBwY3J5cHRfYWVhZF9pbml0X3RmbTtcbi1cdGluc3QtXHUwMDNlYWxnLmV4aXQgPSBwY3J5cHRfYWVhZF9leGl0X3RmbTtcbi1cbi1cdGluc3QtXHUwMDNlYWxnLnNldGtleSA9IHBjcnlwdF9hZWFkX3NldGtleTtcbi1cdGluc3QtXHUwMDNlYWxnLnNldGF1dGhzaXplID0gcGNyeXB0X2FlYWRfc2V0YXV0aHNpemU7XG4tXHRpbnN0LVx1MDAzZWFsZy5lbmNyeXB0ID0gcGNyeXB0X2FlYWRfZW5jcnlwdDtcbi1cdGluc3QtXHUwMDNlYWxnLmRlY3J5cHQgPSBwY3J5cHRfYWVhZF9kZWNyeXB0O1xuLVxuLVx0aW5zdC1cdTAwM2VmcmVlID0gcGNyeXB0X2ZyZWU7XG4tXG4tXHRlcnIgPSBhZWFkX3JlZ2lzdGVyX2luc3RhbmNlKHRtcGwsIGluc3QpO1xuLVx0aWYgKGVycikge1xuLWVycl9mcmVlX2luc3Q6XG4tXHRcdHBjcnlwdF9mcmVlKGluc3QpO1xuLVx0fVxuLVx0cmV0dXJuIGVycjtcbi19XG4tXG4tc3RhdGljIGludCBwY3J5cHRfY3JlYXRlKHN0cnVjdCBjcnlwdG9fdGVtcGxhdGUgKnRtcGwsIHN0cnVjdCBydGF0dHIgKip0Yilcbi17XG4tXHRzdHJ1Y3QgY3J5cHRvX2F0dHJfdHlwZSAqYWxndDtcbi1cbi1cdGFsZ3QgPSBjcnlwdG9fZ2V0X2F0dHJfdHlwZSh0Yik7XG4tXHRpZiAoSVNfRVJSKGFsZ3QpKVxuLVx0XHRyZXR1cm4gUFRSX0VSUihhbGd0KTtcbi1cbi1cdHN3aXRjaCAoYWxndC1cdTAwM2V0eXBlIFx1MDAyNiBhbGd0LVx1MDAzZW1hc2sgXHUwMDI2IENSWVBUT19BTEdfVFlQRV9NQVNLKSB7XG4tXHRjYXNlIENSWVBUT19BTEdfVFlQRV9BRUFEOlxuLVx0XHRyZXR1cm4gcGNyeXB0X2NyZWF0ZV9hZWFkKHRtcGwsIHRiLCBhbGd0KTtcbi1cdH1cbi1cbi1cdHJldHVybiAtRUlOVkFMO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBjcnlwdF9zeXNmc19hZGQoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsIGNvbnN0IGNoYXIgKm5hbWUpXG4te1xuLVx0aW50IHJldDtcbi1cbi1cdHBpbnN0LVx1MDAzZWtvYmoua3NldCA9IHBjcnlwdF9rc2V0O1xuLVx0cmV0ID0ga29iamVjdF9hZGQoXHUwMDI2cGluc3QtXHUwMDNla29iaiwgTlVMTCwgXCYjMzQ7JXNcJiMzNDssIG5hbWUpO1xuLVx0aWYgKCFyZXQpXG4tXHRcdGtvYmplY3RfdWV2ZW50KFx1MDAyNnBpbnN0LVx1MDAzZWtvYmosIEtPQkpfQUREKTtcbi1cbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLXN0YXRpYyBpbnQgcGNyeXB0X2luaXRfcGFkYXRhKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKipwaW5zdCwgY29uc3QgY2hhciAqbmFtZSlcbi17XG4tXHRpbnQgcmV0ID0gLUVOT01FTTtcbi1cbi1cdCpwaW5zdCA9IHBhZGF0YV9hbGxvYyhuYW1lKTtcbi1cdGlmICghKnBpbnN0KVxuLVx0XHRyZXR1cm4gcmV0O1xuLVxuLVx0cmV0ID0gcGNyeXB0X3N5c2ZzX2FkZCgqcGluc3QsIG5hbWUpO1xuLVx0aWYgKHJldClcbi1cdFx0cGFkYXRhX2ZyZWUoKnBpbnN0KTtcbi1cbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLXN0YXRpYyBzdHJ1Y3QgY3J5cHRvX3RlbXBsYXRlIHBjcnlwdF90bXBsID0ge1xuLVx0Lm5hbWUgPSBcJiMzNDtwY3J5cHRcJiMzNDssXG4tXHQuY3JlYXRlID0gcGNyeXB0X2NyZWF0ZSxcbi1cdC5tb2R1bGUgPSBUSElTX01PRFVMRSxcbi19O1xuLVxuLXN0YXRpYyBpbnQgX19pbml0IHBjcnlwdF9pbml0KHZvaWQpXG4te1xuLVx0aW50IGVyciA9IC1FTk9NRU07XG4tXG4tXHRwY3J5cHRfa3NldCA9IGtzZXRfY3JlYXRlX2FuZF9hZGQoXCYjMzQ7cGNyeXB0XCYjMzQ7LCBOVUxMLCBrZXJuZWxfa29iaik7XG4tXHRpZiAoIXBjcnlwdF9rc2V0KVxuLVx0XHRnb3RvIGVycjtcbi1cbi1cdGVyciA9IHBjcnlwdF9pbml0X3BhZGF0YShcdTAwMjZwZW5jcnlwdCwgXCYjMzQ7cGVuY3J5cHRcJiMzNDspO1xuLVx0aWYgKGVycilcbi1cdFx0Z290byBlcnJfdW5yZWdfa3NldDtcbi1cbi1cdGVyciA9IHBjcnlwdF9pbml0X3BhZGF0YShcdTAwMjZwZGVjcnlwdCwgXCYjMzQ7cGRlY3J5cHRcJiMzNDspO1xuLVx0aWYgKGVycilcbi1cdFx0Z290byBlcnJfZGVpbml0X3BlbmNyeXB0O1xuLVxuLVx0cmV0dXJuIGNyeXB0b19yZWdpc3Rlcl90ZW1wbGF0ZShcdTAwMjZwY3J5cHRfdG1wbCk7XG4tXG4tZXJyX2RlaW5pdF9wZW5jcnlwdDpcbi1cdHBhZGF0YV9mcmVlKHBlbmNyeXB0KTtcbi1lcnJfdW5yZWdfa3NldDpcbi1cdGtzZXRfdW5yZWdpc3RlcihwY3J5cHRfa3NldCk7XG4tZXJyOlxuLVx0cmV0dXJuIGVycjtcbi19XG4tXG4tc3RhdGljIHZvaWQgX19leGl0IHBjcnlwdF9leGl0KHZvaWQpXG4te1xuLVx0Y3J5cHRvX3VucmVnaXN0ZXJfdGVtcGxhdGUoXHUwMDI2cGNyeXB0X3RtcGwpO1xuLVxuLVx0cGFkYXRhX2ZyZWUocGVuY3J5cHQpO1xuLVx0cGFkYXRhX2ZyZWUocGRlY3J5cHQpO1xuLVxuLVx0a3NldF91bnJlZ2lzdGVyKHBjcnlwdF9rc2V0KTtcbi19XG4tXG4tbW9kdWxlX2luaXQocGNyeXB0X2luaXQpO1xuLW1vZHVsZV9leGl0KHBjcnlwdF9leGl0KTtcbi1cbi1NT0RVTEVfTElDRU5TRShcJiMzNDtHUExcJiMzNDspO1xuLU1PRFVMRV9BVVRIT1IoXCYjMzQ7U3RlZmZlbiBLbGFzc2VydCBcdTAwM2NzdGVmZmVuLmtsYXNzZXJ0QHNlY3VuZXQuY29tXHUwMDNlXCYjMzQ7KTtcbi1NT0RVTEVfREVTQ1JJUFRJT04oXCYjMzQ7UGFyYWxsZWwgY3J5cHRvIHdyYXBwZXJcJiMzNDspO1xuLU1PRFVMRV9BTElBU19DUllQVE8oXCYjMzQ7cGNyeXB0XCYjMzQ7KTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2NyeXB0by9wY3J5cHQuaCBiL2luY2x1ZGUvY3J5cHRvL3BjcnlwdC5oXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDIzNGQ3Y2YzY2Y1ZWFkLi4wMDAwMDAwMDAwMDAwMFxuLS0tIGEvaW5jbHVkZS9jcnlwdG8vcGNyeXB0LmhcbiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGxcbkBAIC0xLDM5ICYjNDM7MCwwIEBAXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuLS8qXG4tICogcGNyeXB0IC0gUGFyYWxsZWwgY3J5cHRvIGVuZ2luZS5cbi0gKlxuLSAqIENvcHlyaWdodCAoQykgMjAwOSBzZWN1bmV0IFNlY3VyaXR5IE5ldHdvcmtzIEFHXG4tICogQ29weXJpZ2h0IChDKSAyMDA5IFN0ZWZmZW4gS2xhc3NlcnQgXHUwMDNjc3RlZmZlbi5rbGFzc2VydEBzZWN1bmV0LmNvbVx1MDAzZVxuLSAqL1xuLVxuLSNpZm5kZWYgX0NSWVBUT19QQ1JZUFRfSFxuLSNkZWZpbmUgX0NSWVBUT19QQ1JZUFRfSFxuLVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2NvbnRhaW5lcl9vZi5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvY3J5cHRvLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9wYWRhdGEuaFx1MDAzZVxuLVxuLXN0cnVjdCBwY3J5cHRfcmVxdWVzdCB7XG4tXHRzdHJ1Y3QgcGFkYXRhX3ByaXZcdHBhZGF0YTtcbi1cdHZvaWRcdFx0XHQqZGF0YTtcbi1cdHZvaWRcdFx0XHQqX19jdHhbXSBDUllQVE9fTUlOQUxJR05fQVRUUjtcbi19O1xuLVxuLXN0YXRpYyBpbmxpbmUgdm9pZCAqcGNyeXB0X3JlcXVlc3RfY3R4KHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcmVxKVxuLXtcbi1cdHJldHVybiByZXEtXHUwMDNlX19jdHg7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmVcbi1zdHJ1Y3QgcGFkYXRhX3ByaXYgKnBjcnlwdF9yZXF1ZXN0X3BhZGF0YShzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnJlcSlcbi17XG4tXHRyZXR1cm4gXHUwMDI2cmVxLVx1MDAzZXBhZGF0YTtcbi19XG4tXG4tc3RhdGljIGlubGluZVxuLXN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcGNyeXB0X3BhZGF0YV9yZXF1ZXN0KHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKVxuLXtcbi1cdHJldHVybiBjb250YWluZXJfb2YocGFkYXRhLCBzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QsIHBhZGF0YSk7XG4tfVxuLVxuLSNlbmRpZlxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGFkYXRhLmggYi9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oXG5pbmRleCBiNjIzMmJlYTZlZGY1OS4uZWE0NWVhNjgwY2I3OTcgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oXG5AQCAtMTIsMTEyICYjNDM7MTIsOCBAQFxuICNpZm5kZWYgUEFEQVRBX0hcbiAjZGVmaW5lIFBBREFUQV9IXG4gXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvcmVmY291bnQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2NvbXBpbGVyX3R5cGVzLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC93b3JrcXVldWUuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NwaW5sb2NrLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9saXN0LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9rb2JqZWN0LmhcdTAwM2Vcbi1cbi0jZGVmaW5lIFBBREFUQV9DUFVfU0VSSUFMICAgMHgwMVxuLSNkZWZpbmUgUEFEQVRBX0NQVV9QQVJBTExFTCAweDAyXG4tXG4tLyoqXG4tICogc3RydWN0IHBhZGF0YV9wcml2IC0gUmVwcmVzZW50cyBvbmUgam9iXG4tICpcbi0gKiBAbGlzdDogTGlzdCBlbnRyeSwgdG8gYXR0YWNoIHRvIHRoZSBwYWRhdGEgbGlzdHMuXG4tICogQHBkOiBQb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBjb250cm9sIHN0cnVjdHVyZS5cbi0gKiBAY2JfY3B1OiBDYWxsYmFjayBjcHUgZm9yIHNlcmlhbGl6YXRpb29uLlxuLSAqIEBzZXFfbnI6IFNlcXVlbmNlIG51bWJlciBvZiB0aGUgcGFyYWxsZWxpemVkIGRhdGEgb2JqZWN0LlxuLSAqIEBpbmZvOiBVc2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGFyYWxsZWwgdG8gdGhlIHNlcmlhbCBmdW5jdGlvbi5cbi0gKiBAcGFyYWxsZWw6IFBhcmFsbGVsIGV4ZWN1dGlvbiBmdW5jdGlvbi5cbi0gKiBAc2VyaWFsOiBTZXJpYWwgY29tcGxldGUgZnVuY3Rpb24uXG4tICovXG4tc3RydWN0IHBhZGF0YV9wcml2IHtcbi1cdHN0cnVjdCBsaXN0X2hlYWRcdGxpc3Q7XG4tXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YVx0KnBkO1xuLVx0aW50XHRcdFx0Y2JfY3B1O1xuLVx0dW5zaWduZWQgaW50XHRcdHNlcV9ucjtcbi1cdGludFx0XHRcdGluZm87XG4tXHR2b2lkICAgICAgICAgICAgICAgICAgICAoKnBhcmFsbGVsKShzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSk7XG4tXHR2b2lkICAgICAgICAgICAgICAgICAgICAoKnNlcmlhbCkoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpO1xuLX07XG4tXG4tLyoqXG4tICogc3RydWN0IHBhZGF0YV9saXN0IC0gb25lIHBlciB3b3JrIHR5cGUgcGVyIENQVVxuLSAqXG4tICogQGxpc3Q6IExpc3QgaGVhZC5cbi0gKiBAbG9jazogTGlzdCBsb2NrLlxuLSAqL1xuLXN0cnVjdCBwYWRhdGFfbGlzdCB7XG4tXHRzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBsaXN0O1xuLVx0c3BpbmxvY2tfdCAgICAgICAgICAgICAgbG9jaztcbi19O1xuLVxuLS8qKlxuLSogc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUgLSBUaGUgcGVyY3B1IHBhZGF0YSBzZXJpYWwgcXVldWVcbi0qXG4tKiBAc2VyaWFsOiBMaXN0IHRvIHdhaXQgZm9yIHNlcmlhbGl6YXRpb24gYWZ0ZXIgcmVvcmRlcmluZy5cbi0qIEB3b3JrOiB3b3JrIHN0cnVjdCBmb3Igc2VyaWFsaXphdGlvbi5cbi0qIEBwZDogQmFja3BvaW50ZXIgdG8gdGhlIGludGVybmFsIGNvbnRyb2wgc3RydWN0dXJlLlxuLSovXG4tc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUge1xuLSAgICAgICBzdHJ1Y3QgcGFkYXRhX2xpc3QgICAgc2VyaWFsO1xuLSAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgd29yaztcbi0gICAgICAgc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkO1xuLX07XG4tXG4tLyoqXG4tICogc3RydWN0IHBhZGF0YV9jcHVtYXNrIC0gVGhlIGNwdW1hc2tzIGZvciB0aGUgcGFyYWxsZWwvc2VyaWFsIHdvcmtlcnNcbi0gKlxuLSAqIEBwY3B1OiBjcHVtYXNrIGZvciB0aGUgcGFyYWxsZWwgd29ya2Vycy5cbi0gKiBAY2JjcHU6IGNwdW1hc2sgZm9yIHRoZSBzZXJpYWwgKGNhbGxiYWNrKSB3b3JrZXJzLlxuLSAqL1xuLXN0cnVjdCBwYWRhdGFfY3B1bWFzayB7XG4tXHRjcHVtYXNrX3Zhcl90XHRwY3B1O1xuLVx0Y3B1bWFza192YXJfdFx0Y2JjcHU7XG4tfTtcbi1cbi0vKipcbi0gKiBzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAtIEludGVybmFsIGNvbnRyb2wgc3RydWN0dXJlLCBjb3ZlcnMgZXZlcnl0aGluZ1xuLSAqIHRoYXQgZGVwZW5kcyBvbiB0aGUgY3B1bWFzayBpbiB1c2UuXG4tICpcbi0gKiBAcHM6IHBhZGF0YV9zaGVsbCBvYmplY3QuXG4tICogQHJlb3JkZXJfbGlzdDogcGVyY3B1IHJlb3JkZXIgbGlzdHNcbi0gKiBAc3F1ZXVlOiBwZXJjcHUgcGFkYXRhIHF1ZXVlcyB1c2VkIGZvciBzZXJpYWx1emF0aW9uLlxuLSAqIEByZWZjbnQ6IE51bWJlciBvZiBvYmplY3RzIGhvbGRpbmcgYSByZWZlcmVuY2Ugb24gdGhpcyBwYXJhbGxlbF9kYXRhLlxuLSAqIEBzZXFfbnI6IFNlcXVlbmNlIG51bWJlciBvZiB0aGUgcGFyYWxsZWxpemVkIGRhdGEgb2JqZWN0LlxuLSAqIEBwcm9jZXNzZWQ6IE51bWJlciBvZiBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RzLlxuLSAqIEBjcHU6IE5leHQgQ1BVIHRvIGJlIHByb2Nlc3NlZC5cbi0gKiBAY3B1bWFzazogVGhlIGNwdW1hc2tzIGluIHVzZSBmb3IgcGFyYWxsZWwgYW5kIHNlcmlhbCB3b3JrZXJzLlxuLSAqL1xuLXN0cnVjdCBwYXJhbGxlbF9kYXRhIHtcbi1cdHN0cnVjdCBwYWRhdGFfc2hlbGxcdFx0KnBzO1xuLVx0c3RydWN0IHBhZGF0YV9saXN0XHRcdF9fcGVyY3B1ICpyZW9yZGVyX2xpc3Q7XG4tXHRzdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZVx0X19wZXJjcHUgKnNxdWV1ZTtcbi1cdHJlZmNvdW50X3RcdFx0XHRyZWZjbnQ7XG4tXHR1bnNpZ25lZCBpbnRcdFx0XHRzZXFfbnI7XG4tXHR1bnNpZ25lZCBpbnRcdFx0XHRwcm9jZXNzZWQ7XG4tXHRpbnRcdFx0XHRcdGNwdTtcbi1cdHN0cnVjdCBwYWRhdGFfY3B1bWFza1x0XHRjcHVtYXNrO1xuLX07XG4tXG4tLyoqXG4tICogc3RydWN0IHBhZGF0YV9zaGVsbCAtIFdyYXBwZXIgYXJvdW5kIHN0cnVjdCBwYXJhbGxlbF9kYXRhLCBpdHNcbi0gKiBwdXJwb3NlIGlzIHRvIGFsbG93IHRoZSB1bmRlcmx5aW5nIGNvbnRyb2wgc3RydWN0dXJlIHRvIGJlIHJlcGxhY2VkXG4tICogb24gdGhlIGZseSB1c2luZyBSQ1UuXG4tICpcbi0gKiBAcGluc3Q6IHBhZGF0IGluc3RhbmNlLlxuLSAqIEBwZDogQWN0dWFsIHBhcmFsbGVsX2RhdGEgc3RydWN0dXJlIHdoaWNoIG1heSBiZSBzdWJzdGl0dXRlZCBvbiB0aGUgZmx5LlxuLSAqIEBvcGQ6IFBvaW50ZXIgdG8gb2xkIHBkIHRvIGJlIGZyZWVkIGJ5IHBhZGF0YV9yZXBsYWNlLlxuLSAqIEBsaXN0OiBMaXN0IGVudHJ5IGluIHBhZGF0YV9pbnN0YW5jZSBsaXN0LlxuLSAqL1xuLXN0cnVjdCBwYWRhdGFfc2hlbGwge1xuLVx0c3RydWN0IHBhZGF0YV9pbnN0YW5jZVx0XHQqcGluc3Q7XG4tXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YSBfX3JjdVx0KnBkO1xuLVx0c3RydWN0IHBhcmFsbGVsX2RhdGFcdFx0Km9wZDtcbi1cdHN0cnVjdCBsaXN0X2hlYWRcdFx0bGlzdDtcbi19O1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvdHlwZXMuaFx1MDAzZVxuIFxuIC8qKlxuICAqIHN0cnVjdCBwYWRhdGFfbXRfam9iIC0gcmVwcmVzZW50cyBvbmUgbXVsdGl0aHJlYWRlZCBqb2JcbkBAIC0xNDYsNDYgJiM0Mzs0Miw5IEBAIHN0cnVjdCBwYWRhdGFfbXRfam9iIHtcbiBcdGJvb2xcdFx0XHRudW1hX2F3YXJlO1xuIH07XG4gXG4tLyoqXG4tICogc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAtIFRoZSBvdmVyYWxsIGNvbnRyb2wgc3RydWN0dXJlLlxuLSAqXG4tICogQGNwdWhwX25vZGU6IExpbmthZ2UgZm9yIENQVSBob3RwbHVnIGNhbGxiYWNrcy5cbi0gKiBAcGFyYWxsZWxfd3E6IFRoZSB3b3JrcXVldWUgdXNlZCBmb3IgcGFyYWxsZWwgd29yay5cbi0gKiBAc2VyaWFsX3dxOiBUaGUgd29ya3F1ZXVlIHVzZWQgZm9yIHNlcmlhbCB3b3JrLlxuLSAqIEBwc2xpc3Q6IExpc3Qgb2YgcGFkYXRhX3NoZWxsIG9iamVjdHMgYXR0YWNoZWQgdG8gdGhpcyBpbnN0YW5jZS5cbi0gKiBAY3B1bWFzazogVXNlciBzdXBwbGllZCBjcHVtYXNrcyBmb3IgcGFyYWxsZWwgYW5kIHNlcmlhbCB3b3Jrcy5cbi0gKiBAdmFsaWRhdGVfY3B1bWFzazogSW50ZXJuYWwgY3B1bWFzayB1c2VkIHRvIHZhbGlkYXRlIEBjcHVtYXNrIGR1cmluZyBob3RwbHVnLlxuLSAqIEBrb2JqOiBwYWRhdGEgaW5zdGFuY2Uga2VybmVsIG9iamVjdC5cbi0gKiBAbG9jazogcGFkYXRhIGluc3RhbmNlIGxvY2suXG4tICogQGZsYWdzOiBwYWRhdGEgZmxhZ3MuXG4tICovXG4tc3RydWN0IHBhZGF0YV9pbnN0YW5jZSB7XG4tXHRzdHJ1Y3QgaGxpc3Rfbm9kZVx0XHRjcHVocF9ub2RlO1xuLVx0c3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3RcdFx0KnBhcmFsbGVsX3dxO1xuLVx0c3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3RcdFx0KnNlcmlhbF93cTtcbi1cdHN0cnVjdCBsaXN0X2hlYWRcdFx0cHNsaXN0O1xuLVx0c3RydWN0IHBhZGF0YV9jcHVtYXNrXHRcdGNwdW1hc2s7XG4tXHRjcHVtYXNrX3Zhcl90XHRcdFx0dmFsaWRhdGVfY3B1bWFzaztcbi1cdHN0cnVjdCBrb2JqZWN0ICAgICAgICAgICAgICAgICAgIGtvYmo7XG4tXHRzdHJ1Y3QgbXV0ZXhcdFx0XHQgbG9jaztcbi1cdHU4XHRcdFx0XHQgZmxhZ3M7XG4tI2RlZmluZVx0UEFEQVRBX0lOSVRcdDFcbi0jZGVmaW5lXHRQQURBVEFfUkVTRVRcdDJcbi0jZGVmaW5lXHRQQURBVEFfSU5WQUxJRFx0NFxuLX07XG4tXG4gI2lmZGVmIENPTkZJR19QQURBVEFcbiBleHRlcm4gdm9pZCBfX2luaXQgcGFkYXRhX2luaXQodm9pZCk7XG4tZXh0ZXJuIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBhZGF0YV9hbGxvYyhjb25zdCBjaGFyICpuYW1lKTtcbi1leHRlcm4gdm9pZCBwYWRhdGFfZnJlZShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCk7XG4tZXh0ZXJuIHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBhZGF0YV9hbGxvY19zaGVsbChzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCk7XG4tZXh0ZXJuIHZvaWQgcGFkYXRhX2ZyZWVfc2hlbGwoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMpO1xuLWV4dGVybiBpbnQgcGFkYXRhX2RvX3BhcmFsbGVsKHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzLFxuLVx0XHRcdCAgICAgIHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhLCBpbnQgKmNiX2NwdSk7XG4tZXh0ZXJuIHZvaWQgcGFkYXRhX2RvX3NlcmlhbChzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSk7XG4gZXh0ZXJuIHZvaWQgX19pbml0IHBhZGF0YV9kb19tdWx0aXRocmVhZGVkKHN0cnVjdCBwYWRhdGFfbXRfam9iICpqb2IpO1xuLWV4dGVybiBpbnQgcGFkYXRhX3NldF9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgY3B1bWFza190eXBlLFxuLVx0XHRcdCAgICAgIGNwdW1hc2tfdmFyX3QgY3B1bWFzayk7XG4gI2Vsc2VcbiBzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IHBhZGF0YV9pbml0KHZvaWQpIHt9XG4gc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBwYWRhdGFfZG9fbXVsdGl0aHJlYWRlZChzdHJ1Y3QgcGFkYXRhX210X2pvYiAqam9iKVxuZGlmZiAtLWdpdCBhL2tlcm5lbC9wYWRhdGEuYyBiL2tlcm5lbC9wYWRhdGEuY1xuaW5kZXggMGQzZWExYjY4YjFmNzAuLjZlYjEzMGQzMTAyNGM1IDEwMDY0NFxuLS0tIGEva2VybmVsL3BhZGF0YS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvcGFkYXRhLmNcbkBAIC0xLDYgJiM0MzsxLDYgQEBcbiAvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuIC8qXG4tICogcGFkYXRhLmMgLSBnZW5lcmljIGludGVyZmFjZSB0byBwcm9jZXNzIGRhdGEgc3RyZWFtcyBpbiBwYXJhbGxlbFxuJiM0MzsgKiBwYWRhdGEuYyAtIGdlbmVyaWMgaW50ZXJmYWNlIHRvIHJ1biBtdWx0aXRocmVhZGVkIGpvYnNcbiAgKlxuICAqIFNlZSBEb2N1bWVudGF0aW9uL2NvcmUtYXBpL3BhZGF0YS5yc3QgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICpcbkBAIC0xMSwxNyAmIzQzOzExLDE3IEBAXG4gICogQXV0aG9yOiBEYW5pZWwgSm9yZGFuIFx1MDAzY2RhbmllbC5tLmpvcmRhbkBvcmFjbGUuY29tXHUwMDNlXG4gICovXG4gXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2F0b21pYy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvY29tcGxldGlvbi5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvZXhwb3J0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jcHVtYXNrLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9lcnIuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2NwdS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2luaXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9rZXJuZWwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9saXN0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbm9kZW1hc2suaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhZGF0YS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbXV0ZXguaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zeXNmcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvcmN1cGRhdGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zcGlubG9jay5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3dvcmtxdWV1ZS5oXHUwMDNlXG4gXG4gI2RlZmluZVx0UEFEQVRBX1dPUktfT05TVEFDS1x0MVx0LyogV29yayYjMzk7cyBtZW1vcnkgaXMgb24gc3RhY2sgKi9cbiBcbkBAIC00NCwzNiAmIzQzOzQ0LDggQEAgc3RydWN0IHBhZGF0YV9tdF9qb2Jfc3RhdGUge1xuIFx0dW5zaWduZWQgbG9uZ1x0XHRjaHVua19zaXplO1xuIH07XG4gXG4tc3RhdGljIHZvaWQgcGFkYXRhX2ZyZWVfcGQoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKTtcbiBzdGF0aWMgdm9pZCBfX2luaXQgcGFkYXRhX210X2hlbHBlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspO1xuIFxuLXN0YXRpYyBpbmxpbmUgdm9pZCBwYWRhdGFfZ2V0X3BkKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZClcbi17XG4tXHRyZWZjb3VudF9pbmMoXHUwMDI2cGQtXHUwMDNlcmVmY250KTtcbi19XG4tXG4tc3RhdGljIGlubGluZSB2b2lkIHBhZGF0YV9wdXRfcGRfY250KHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCwgaW50IGNudClcbi17XG4tXHRpZiAocmVmY291bnRfc3ViX2FuZF90ZXN0KGNudCwgXHUwMDI2cGQtXHUwMDNlcmVmY250KSlcbi1cdFx0cGFkYXRhX2ZyZWVfcGQocGQpO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIHZvaWQgcGFkYXRhX3B1dF9wZChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQpXG4te1xuLVx0cGFkYXRhX3B1dF9wZF9jbnQocGQsIDEpO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBhZGF0YV9jcHVfaGFzaChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQsIHVuc2lnbmVkIGludCBzZXFfbnIpXG4te1xuLVx0Lypcbi1cdCAqIEhhc2ggdGhlIHNlcXVlbmNlIG51bWJlcnMgdG8gdGhlIGNwdXMgYnkgdGFraW5nXG4tXHQgKiBzZXFfbnIgbW9kLiBudW1iZXIgb2YgY3B1cyBpbiB1c2UuXG4tXHQgKi9cbi1cdGludCBjcHVfaW5kZXggPSBzZXFfbnIgJSBjcHVtYXNrX3dlaWdodChwZC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLVxuLVx0cmV0dXJuIGNwdW1hc2tfbnRoKGNwdV9pbmRleCwgcGQtXHUwMDNlY3B1bWFzay5wY3B1KTtcbi19XG4tXG4gc3RhdGljIHN0cnVjdCBwYWRhdGFfd29yayAqcGFkYXRhX3dvcmtfYWxsb2Modm9pZClcbiB7XG4gXHRzdHJ1Y3QgcGFkYXRhX3dvcmsgKnB3O1xuQEAgLTE0NywyNjAgJiM0MzsxMTksNiBAQCBzdGF0aWMgdm9pZCBfX2luaXQgcGFkYXRhX3dvcmtzX2ZyZWUoc3RydWN0IGxpc3RfaGVhZCAqd29ya3MpXG4gXHRzcGluX3VubG9ja19iaChcdTAwMjZwYWRhdGFfd29ya3NfbG9jayk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIHBhZGF0YV9wYXJhbGxlbF93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICpwYXJhbGxlbF93b3JrKVxuLXtcbi1cdHN0cnVjdCBwYWRhdGFfd29yayAqcHcgPSBjb250YWluZXJfb2YocGFyYWxsZWxfd29yaywgc3RydWN0IHBhZGF0YV93b3JrLFxuLVx0XHRcdFx0XHQgICAgICBwd193b3JrKTtcbi1cdHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhID0gcHctXHUwMDNlcHdfZGF0YTtcbi1cbi1cdGxvY2FsX2JoX2Rpc2FibGUoKTtcbi1cdHBhZGF0YS1cdTAwM2VwYXJhbGxlbChwYWRhdGEpO1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnBhZGF0YV93b3Jrc19sb2NrKTtcbi1cdHBhZGF0YV93b3JrX2ZyZWUocHcpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2cGFkYXRhX3dvcmtzX2xvY2spO1xuLVx0bG9jYWxfYmhfZW5hYmxlKCk7XG4tfVxuLVxuLS8qKlxuLSAqIHBhZGF0YV9kb19wYXJhbGxlbCAtIHBhZGF0YSBwYXJhbGxlbGl6YXRpb24gZnVuY3Rpb25cbi0gKlxuLSAqIEBwczogcGFkYXRhc2hlbGxcbi0gKiBAcGFkYXRhOiBvYmplY3QgdG8gYmUgcGFyYWxsZWxpemVkXG4tICogQGNiX2NwdTogcG9pbnRlciB0byB0aGUgQ1BVIHRoYXQgdGhlIHNlcmlhbGl6YXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gc2hvdWxkXG4tICogICAgICAgICAgcnVuIG9uLiAgSWYgaXQmIzM5O3Mgbm90IGluIHRoZSBzZXJpYWwgY3B1bWFzayBvZiBAcGluc3Rcbi0gKiAgICAgICAgICAoaS5lLiBjcHVtYXNrLmNiY3B1KSwgdGhpcyBmdW5jdGlvbiBzZWxlY3RzIGEgZmFsbGJhY2sgQ1BVIGFuZCBpZlxuLSAqICAgICAgICAgIG5vbmUgZm91bmQsIHJldHVybnMgLUVJTlZBTC5cbi0gKlxuLSAqIFRoZSBwYXJhbGxlbGl6YXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBydW4gd2l0aCBCSHMgb2ZmLlxuLSAqIE5vdGU6IEV2ZXJ5IG9iamVjdCB3aGljaCBpcyBwYXJhbGxlbGl6ZWQgYnkgcGFkYXRhX2RvX3BhcmFsbGVsXG4tICogbXVzdCBiZSBzZWVuIGJ5IHBhZGF0YV9kb19zZXJpYWwuXG4tICpcbi0gKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBlbHNlIG5lZ2F0aXZlIGVycm9yIGNvZGUuXG4tICovXG4taW50IHBhZGF0YV9kb19wYXJhbGxlbChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcyxcbi1cdFx0ICAgICAgIHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhLCBpbnQgKmNiX2NwdSlcbi17XG4tXHRzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCA9IHBzLVx1MDAzZXBpbnN0O1xuLVx0c3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkO1xuLVx0c3RydWN0IHBhZGF0YV93b3JrICpwdztcbi1cdGludCBjcHVfaW5kZXgsIGVycjtcbi1cbi1cdHJjdV9yZWFkX2xvY2tfYmgoKTtcbi1cbi1cdHBkID0gcmN1X2RlcmVmZXJlbmNlX2JoKHBzLVx1MDAzZXBkKTtcbi1cbi1cdGVyciA9IC1FSU5WQUw7XG4tXHRpZiAoIShwaW5zdC1cdTAwM2VmbGFncyBcdTAwMjYgUEFEQVRBX0lOSVQpIHx8IHBpbnN0LVx1MDAzZWZsYWdzIFx1MDAyNiBQQURBVEFfSU5WQUxJRClcbi1cdFx0Z290byBvdXQ7XG4tXG4tXHRpZiAoIWNwdW1hc2tfdGVzdF9jcHUoKmNiX2NwdSwgcGQtXHUwMDNlY3B1bWFzay5jYmNwdSkpIHtcbi1cdFx0aWYgKGNwdW1hc2tfZW1wdHkocGQtXHUwMDNlY3B1bWFzay5jYmNwdSkpXG4tXHRcdFx0Z290byBvdXQ7XG4tXG4tXHRcdC8qIFNlbGVjdCBhbiBhbHRlcm5hdGUgZmFsbGJhY2sgQ1BVIGFuZCBub3RpZnkgdGhlIGNhbGxlci4gKi9cbi1cdFx0Y3B1X2luZGV4ID0gKmNiX2NwdSAlIGNwdW1hc2tfd2VpZ2h0KHBkLVx1MDAzZWNwdW1hc2suY2JjcHUpO1xuLVx0XHQqY2JfY3B1ID0gY3B1bWFza19udGgoY3B1X2luZGV4LCBwZC1cdTAwM2VjcHVtYXNrLmNiY3B1KTtcbi1cdH1cbi1cbi1cdGVyciA9IC1FQlVTWTtcbi1cdGlmICgocGluc3QtXHUwMDNlZmxhZ3MgXHUwMDI2IFBBREFUQV9SRVNFVCkpXG4tXHRcdGdvdG8gb3V0O1xuLVxuLVx0cGFkYXRhX2dldF9wZChwZCk7XG4tXHRwYWRhdGEtXHUwMDNlcGQgPSBwZDtcbi1cdHBhZGF0YS1cdTAwM2VjYl9jcHUgPSAqY2JfY3B1O1xuLVxuLVx0c3Bpbl9sb2NrKFx1MDAyNnBhZGF0YV93b3Jrc19sb2NrKTtcbi1cdHBhZGF0YS1cdTAwM2VzZXFfbnIgPSAmIzQzOyYjNDM7cGQtXHUwMDNlc2VxX25yO1xuLVx0cHcgPSBwYWRhdGFfd29ya19hbGxvYygpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2cGFkYXRhX3dvcmtzX2xvY2spO1xuLVxuLVx0aWYgKCFwdykge1xuLVx0XHQvKiBNYXhpbXVtIHdvcmtzIGxpbWl0IGV4Y2VlZGVkLCBydW4gaW4gdGhlIGN1cnJlbnQgdGFzay4gKi9cbi1cdFx0cGFkYXRhLVx1MDAzZXBhcmFsbGVsKHBhZGF0YSk7XG4tXHR9XG4tXG4tXHRyY3VfcmVhZF91bmxvY2tfYmgoKTtcbi1cbi1cdGlmIChwdykge1xuLVx0XHRwYWRhdGFfd29ya19pbml0KHB3LCBwYWRhdGFfcGFyYWxsZWxfd29ya2VyLCBwYWRhdGEsIDApO1xuLVx0XHRxdWV1ZV93b3JrKHBpbnN0LVx1MDAzZXBhcmFsbGVsX3dxLCBcdTAwMjZwdy1cdTAwM2Vwd193b3JrKTtcbi1cdH1cbi1cbi1cdHJldHVybiAwO1xuLW91dDpcbi1cdHJjdV9yZWFkX3VubG9ja19iaCgpO1xuLVxuLVx0cmV0dXJuIGVycjtcbi19XG4tRVhQT1JUX1NZTUJPTChwYWRhdGFfZG9fcGFyYWxsZWwpO1xuLVxuLS8qXG4tICogcGFkYXRhX2ZpbmRfbmV4dCAtIEZpbmQgdGhlIG5leHQgb2JqZWN0IHRoYXQgbmVlZHMgc2VyaWFsaXphdGlvbi5cbi0gKlxuLSAqIFJldHVybjpcbi0gKiAqIEEgcG9pbnRlciB0byB0aGUgY29udHJvbCBzdHJ1Y3Qgb2YgdGhlIG5leHQgb2JqZWN0IHRoYXQgbmVlZHNcbi0gKiAgIHNlcmlhbGl6YXRpb24sIGlmIHByZXNlbnQgaW4gb25lIG9mIHRoZSBwZXJjcHUgcmVvcmRlciBxdWV1ZXMuXG4tICogKiBOVUxMLCBpZiB0aGUgbmV4dCBvYmplY3QgdGhhdCBuZWVkcyBzZXJpYWxpemF0aW9uIHdpbGxcbi0gKiAgIGJlIHBhcmFsbGVsIHByb2Nlc3NlZCBieSBhbm90aGVyIGNwdSBhbmQgaXMgbm90IHlldCBwcmVzZW50IGluXG4tICogICB0aGUgY3B1JiMzOTtzIHJlb3JkZXIgcXVldWUuXG4tICovXG4tc3RhdGljIHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhX2ZpbmRfbmV4dChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQsIGludCBjcHUsXG4tXHRcdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgcHJvY2Vzc2VkKVxuLXtcbi1cdHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhO1xuLVx0c3RydWN0IHBhZGF0YV9saXN0ICpyZW9yZGVyO1xuLVxuLVx0cmVvcmRlciA9IHBlcl9jcHVfcHRyKHBkLVx1MDAzZXJlb3JkZXJfbGlzdCwgY3B1KTtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZyZW9yZGVyLVx1MDAzZWxvY2spO1xuLVx0aWYgKGxpc3RfZW1wdHkoXHUwMDI2cmVvcmRlci1cdTAwM2VsaXN0KSlcbi1cdFx0Z290byBub3Rmb3VuZDtcbi1cbi1cdHBhZGF0YSA9IGxpc3RfZW50cnkocmVvcmRlci1cdTAwM2VsaXN0Lm5leHQsIHN0cnVjdCBwYWRhdGFfcHJpdiwgbGlzdCk7XG4tXG4tXHQvKlxuLVx0ICogQ2hlY2tzIHRoZSByYXJlIGNhc2Ugd2hlcmUgdHdvIG9yIG1vcmUgcGFyYWxsZWwgam9icyBoYXZlIGhhc2hlZCB0b1xuLVx0ICogdGhlIHNhbWUgQ1BVIGFuZCBvbmUgb2YgdGhlIGxhdGVyIG9uZXMgZmluaXNoZXMgZmlyc3QuXG4tXHQgKi9cbi1cdGlmIChwYWRhdGEtXHUwMDNlc2VxX25yICE9IHByb2Nlc3NlZClcbi1cdFx0Z290byBub3Rmb3VuZDtcbi1cbi1cdGxpc3RfZGVsX2luaXQoXHUwMDI2cGFkYXRhLVx1MDAzZWxpc3QpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2cmVvcmRlci1cdTAwM2Vsb2NrKTtcbi1cdHJldHVybiBwYWRhdGE7XG4tXG4tbm90Zm91bmQ6XG4tXHRwZC1cdTAwM2Vwcm9jZXNzZWQgPSBwcm9jZXNzZWQ7XG4tXHRwZC1cdTAwM2VjcHUgPSBjcHU7XG4tXHRzcGluX3VubG9jayhcdTAwMjZyZW9yZGVyLVx1MDAzZWxvY2spO1xuLVx0cmV0dXJuIE5VTEw7XG4tfVxuLVxuLXN0YXRpYyB2b2lkIHBhZGF0YV9yZW9yZGVyKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKVxuLXtcbi1cdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCA9IHBhZGF0YS1cdTAwM2VwZDtcbi1cdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0ID0gcGQtXHUwMDNlcHMtXHUwMDNlcGluc3Q7XG4tXHR1bnNpZ25lZCBpbnQgcHJvY2Vzc2VkO1xuLVx0aW50IGNwdTtcbi1cbi1cdHByb2Nlc3NlZCA9IHBkLVx1MDAzZXByb2Nlc3NlZDtcbi1cdGNwdSA9IHBkLVx1MDAzZWNwdTtcbi1cbi1cdGRvIHtcbi1cdFx0c3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUgKnNxdWV1ZTtcbi1cdFx0aW50IGNiX2NwdTtcbi1cbi1cdFx0cHJvY2Vzc2VkJiM0MzsmIzQzOztcbi1cdFx0LyogV2hlbiBzZXF1ZW5jZSB3cmFwcyBhcm91bmQsIHJlc2V0IHRvIHRoZSBmaXJzdCBDUFUuICovXG4tXHRcdGlmICh1bmxpa2VseShwcm9jZXNzZWQgPT0gMCkpXG4tXHRcdFx0Y3B1ID0gY3B1bWFza19maXJzdChwZC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLVx0XHRlbHNlXG4tXHRcdFx0Y3B1ID0gY3B1bWFza19uZXh0X3dyYXAoY3B1LCBwZC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLVxuLVx0XHRjYl9jcHUgPSBwYWRhdGEtXHUwMDNlY2JfY3B1O1xuLVx0XHRzcXVldWUgPSBwZXJfY3B1X3B0cihwZC1cdTAwM2VzcXVldWUsIGNiX2NwdSk7XG4tXG4tXHRcdHNwaW5fbG9jayhcdTAwMjZzcXVldWUtXHUwMDNlc2VyaWFsLmxvY2spO1xuLVx0XHRsaXN0X2FkZF90YWlsKFx1MDAyNnBhZGF0YS1cdTAwM2VsaXN0LCBcdTAwMjZzcXVldWUtXHUwMDNlc2VyaWFsLmxpc3QpO1xuLVx0XHRxdWV1ZV93b3JrX29uKGNiX2NwdSwgcGluc3QtXHUwMDNlc2VyaWFsX3dxLCBcdTAwMjZzcXVldWUtXHUwMDNld29yayk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIElmIHRoZSBuZXh0IG9iamVjdCB0aGF0IG5lZWRzIHNlcmlhbGl6YXRpb24gaXMgcGFyYWxsZWxcbi1cdFx0ICogcHJvY2Vzc2VkIGJ5IGFub3RoZXIgY3B1IGFuZCBpcyBzdGlsbCBvbiBpdCYjMzk7cyB3YXkgdG8gdGhlXG4tXHRcdCAqIGNwdSYjMzk7cyByZW9yZGVyIHF1ZXVlLCBlbmQgdGhlIGxvb3AuXG4tXHRcdCAqL1xuLVx0XHRwYWRhdGEgPSBwYWRhdGFfZmluZF9uZXh0KHBkLCBjcHUsIHByb2Nlc3NlZCk7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNxdWV1ZS1cdTAwM2VzZXJpYWwubG9jayk7XG4tXHR9IHdoaWxlIChwYWRhdGEpO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBwYWRhdGFfc2VyaWFsX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnNlcmlhbF93b3JrKVxuLXtcbi1cdHN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlICpzcXVldWU7XG4tXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQ7XG4tXHRMSVNUX0hFQUQobG9jYWxfbGlzdCk7XG4tXHRpbnQgY250O1xuLVxuLVx0bG9jYWxfYmhfZGlzYWJsZSgpO1xuLVx0c3F1ZXVlID0gY29udGFpbmVyX29mKHNlcmlhbF93b3JrLCBzdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZSwgd29yayk7XG4tXHRwZCA9IHNxdWV1ZS1cdTAwM2VwZDtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZzcXVldWUtXHUwMDNlc2VyaWFsLmxvY2spO1xuLVx0bGlzdF9yZXBsYWNlX2luaXQoXHUwMDI2c3F1ZXVlLVx1MDAzZXNlcmlhbC5saXN0LCBcdTAwMjZsb2NhbF9saXN0KTtcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnNxdWV1ZS1cdTAwM2VzZXJpYWwubG9jayk7XG4tXG4tXHRjbnQgPSAwO1xuLVxuLVx0d2hpbGUgKCFsaXN0X2VtcHR5KFx1MDAyNmxvY2FsX2xpc3QpKSB7XG4tXHRcdHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhO1xuLVxuLVx0XHRwYWRhdGEgPSBsaXN0X2VudHJ5KGxvY2FsX2xpc3QubmV4dCxcbi1cdFx0XHRcdCAgICBzdHJ1Y3QgcGFkYXRhX3ByaXYsIGxpc3QpO1xuLVxuLVx0XHRsaXN0X2RlbF9pbml0KFx1MDAyNnBhZGF0YS1cdTAwM2VsaXN0KTtcbi1cbi1cdFx0cGFkYXRhLVx1MDAzZXNlcmlhbChwYWRhdGEpO1xuLVx0XHRjbnQmIzQzOyYjNDM7O1xuLVx0fVxuLVx0bG9jYWxfYmhfZW5hYmxlKCk7XG4tXG4tXHRwYWRhdGFfcHV0X3BkX2NudChwZCwgY250KTtcbi19XG4tXG4tLyoqXG4tICogcGFkYXRhX2RvX3NlcmlhbCAtIHBhZGF0YSBzZXJpYWxpemF0aW9uIGZ1bmN0aW9uXG4tICpcbi0gKiBAcGFkYXRhOiBvYmplY3QgdG8gYmUgc2VyaWFsaXplZC5cbi0gKlxuLSAqIHBhZGF0YV9kb19zZXJpYWwgbXVzdCBiZSBjYWxsZWQgZm9yIGV2ZXJ5IHBhcmFsbGVsaXplZCBvYmplY3QuXG4tICogVGhlIHNlcmlhbGl6YXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBydW4gd2l0aCBCSHMgb2ZmLlxuLSAqL1xuLXZvaWQgcGFkYXRhX2RvX3NlcmlhbChzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSlcbi17XG4tXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQgPSBwYWRhdGEtXHUwMDNlcGQ7XG4tXHRpbnQgaGFzaGVkX2NwdSA9IHBhZGF0YV9jcHVfaGFzaChwZCwgcGFkYXRhLVx1MDAzZXNlcV9ucik7XG4tXHRzdHJ1Y3QgcGFkYXRhX2xpc3QgKnJlb3JkZXIgPSBwZXJfY3B1X3B0cihwZC1cdTAwM2VyZW9yZGVyX2xpc3QsIGhhc2hlZF9jcHUpO1xuLVx0c3RydWN0IHBhZGF0YV9wcml2ICpjdXI7XG4tXHRzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7XG4tXHRib29sIGdvdGl0ID0gdHJ1ZTtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZyZW9yZGVyLVx1MDAzZWxvY2spO1xuLVx0LyogU29ydCBpbiBhc2NlbmRpbmcgb3JkZXIgb2Ygc2VxdWVuY2UgbnVtYmVyLiAqL1xuLVx0bGlzdF9mb3JfZWFjaF9wcmV2KHBvcywgXHUwMDI2cmVvcmRlci1cdTAwM2VsaXN0KSB7XG4tXHRcdGN1ciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgcGFkYXRhX3ByaXYsIGxpc3QpO1xuLVx0XHQvKiBDb21wYXJlIGJ5IGRpZmZlcmVuY2UgdG8gY29uc2lkZXIgaW50ZWdlciB3cmFwIGFyb3VuZCAqL1xuLVx0XHRpZiAoKHNpZ25lZCBpbnQpKGN1ci1cdTAwM2VzZXFfbnIgLSBwYWRhdGEtXHUwMDNlc2VxX25yKSBcdTAwM2MgMClcbi1cdFx0XHRicmVhaztcbi1cdH1cbi1cdGlmIChwYWRhdGEtXHUwMDNlc2VxX25yICE9IHBkLVx1MDAzZXByb2Nlc3NlZCkge1xuLVx0XHRnb3RpdCA9IGZhbHNlO1xuLVx0XHRsaXN0X2FkZChcdTAwMjZwYWRhdGEtXHUwMDNlbGlzdCwgcG9zKTtcbi1cdH1cbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnJlb3JkZXItXHUwMDNlbG9jayk7XG4tXG4tXHRpZiAoZ290aXQpXG4tXHRcdHBhZGF0YV9yZW9yZGVyKHBhZGF0YSk7XG4tfVxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX2RvX3NlcmlhbCk7XG4tXG4tc3RhdGljIGludCBwYWRhdGFfc2V0dXBfY3B1bWFza3Moc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpXG4te1xuLVx0c3RydWN0IHdvcmtxdWV1ZV9hdHRycyAqYXR0cnM7XG4tXHRpbnQgZXJyO1xuLVxuLVx0YXR0cnMgPSBhbGxvY193b3JrcXVldWVfYXR0cnMoKTtcbi1cdGlmICghYXR0cnMpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuLVxuLVx0LyogUmVzdHJpY3QgcGFyYWxsZWxfd3Egd29ya2VycyB0byBwZC1cdTAwM2VjcHVtYXNrLnBjcHUuICovXG4tXHRjcHVtYXNrX2NvcHkoYXR0cnMtXHUwMDNlY3B1bWFzaywgcGluc3QtXHUwMDNlY3B1bWFzay5wY3B1KTtcbi1cdGVyciA9IGFwcGx5X3dvcmtxdWV1ZV9hdHRycyhwaW5zdC1cdTAwM2VwYXJhbGxlbF93cSwgYXR0cnMpO1xuLVx0ZnJlZV93b3JrcXVldWVfYXR0cnMoYXR0cnMpO1xuLVxuLVx0cmV0dXJuIGVycjtcbi19XG4tXG4gc3RhdGljIHZvaWQgX19pbml0IHBhZGF0YV9tdF9oZWxwZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3KVxuIHtcbiBcdHN0cnVjdCBwYWRhdGFfd29yayAqcHcgPSBjb250YWluZXJfb2Yodywgc3RydWN0IHBhZGF0YV93b3JrLCBwd193b3JrKTtcbkBAIC01MDYsNjEzICYjNDM7MjI0LDE3IEBAIHZvaWQgX19pbml0IHBhZGF0YV9kb19tdWx0aXRocmVhZGVkKHN0cnVjdCBwYWRhdGFfbXRfam9iICpqb2IpXG4gXHRwYWRhdGFfd29ya3NfZnJlZShcdTAwMjZ3b3Jrcyk7XG4gfVxuIFxuLS8qIEluaXRpYWxpemUgYWxsIHBlcmNwdSBxdWV1ZXMgdXNlZCBieSBzZXJpYWwgd29ya2VycyAqL1xuLXN0YXRpYyB2b2lkIHBhZGF0YV9pbml0X3NxdWV1ZXMoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKVxuLXtcbi1cdGludCBjcHU7XG4tXHRzdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZSAqc3F1ZXVlO1xuLVxuLVx0Zm9yX2VhY2hfY3B1KGNwdSwgcGQtXHUwMDNlY3B1bWFzay5jYmNwdSkge1xuLVx0XHRzcXVldWUgPSBwZXJfY3B1X3B0cihwZC1cdTAwM2VzcXVldWUsIGNwdSk7XG4tXHRcdHNxdWV1ZS1cdTAwM2VwZCA9IHBkO1xuLVx0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZzcXVldWUtXHUwMDNlc2VyaWFsLmxpc3QpO1xuLVx0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZzcXVldWUtXHUwMDNlc2VyaWFsLmxvY2spO1xuLVx0XHRJTklUX1dPUksoXHUwMDI2c3F1ZXVlLVx1MDAzZXdvcmssIHBhZGF0YV9zZXJpYWxfd29ya2VyKTtcbi1cdH1cbi19XG4tXG4tLyogSW5pdGlhbGl6ZSBwZXItQ1BVIHJlb3JkZXIgbGlzdHMgKi9cbi1zdGF0aWMgdm9pZCBwYWRhdGFfaW5pdF9yZW9yZGVyX2xpc3Qoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKVxuLXtcbi1cdGludCBjcHU7XG4tXHRzdHJ1Y3QgcGFkYXRhX2xpc3QgKmxpc3Q7XG4tXG4tXHRmb3JfZWFjaF9jcHUoY3B1LCBwZC1cdTAwM2VjcHVtYXNrLnBjcHUpIHtcbi1cdFx0bGlzdCA9IHBlcl9jcHVfcHRyKHBkLVx1MDAzZXJlb3JkZXJfbGlzdCwgY3B1KTtcbi1cdFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2bGlzdC1cdTAwM2VsaXN0KTtcbi1cdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2bGlzdC1cdTAwM2Vsb2NrKTtcbi1cdH1cbi19XG4tXG4tLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGludGVybmFsIGNwdW1hc2sgZGVwZW5kZW5kIHJlc291cmNlcy4gKi9cbi1zdGF0aWMgc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBhZGF0YV9hbGxvY19wZChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcyxcbi1cdFx0XHRcdFx0ICAgICBpbnQgb2ZmbGluaW5nX2NwdSlcbi17XG4tXHRzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCA9IHBzLVx1MDAzZXBpbnN0O1xuLVx0c3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkO1xuLVxuLVx0cGQgPSBremFsbG9jX29iaihzdHJ1Y3QgcGFyYWxsZWxfZGF0YSk7XG4tXHRpZiAoIXBkKVxuLVx0XHRnb3RvIGVycjtcbi1cbi1cdHBkLVx1MDAzZXJlb3JkZXJfbGlzdCA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgcGFkYXRhX2xpc3QpO1xuLVx0aWYgKCFwZC1cdTAwM2VyZW9yZGVyX2xpc3QpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfcGQ7XG4tXG4tXHRwZC1cdTAwM2VzcXVldWUgPSBhbGxvY19wZXJjcHUoc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUpO1xuLVx0aWYgKCFwZC1cdTAwM2VzcXVldWUpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfcmVvcmRlcl9saXN0O1xuLVxuLVx0cGQtXHUwMDNlcHMgPSBwcztcbi1cbi1cdGlmICghYWxsb2NfY3B1bWFza192YXIoXHUwMDI2cGQtXHUwMDNlY3B1bWFzay5wY3B1LCBHRlBfS0VSTkVMKSlcbi1cdFx0Z290byBlcnJfZnJlZV9zcXVldWU7XG4tXHRpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKFx1MDAyNnBkLVx1MDAzZWNwdW1hc2suY2JjcHUsIEdGUF9LRVJORUwpKVxuLVx0XHRnb3RvIGVycl9mcmVlX3BjcHU7XG4tXG4tXHRjcHVtYXNrX2FuZChwZC1cdTAwM2VjcHVtYXNrLnBjcHUsIHBpbnN0LVx1MDAzZWNwdW1hc2sucGNwdSwgY3B1X29ubGluZV9tYXNrKTtcbi1cdGNwdW1hc2tfYW5kKHBkLVx1MDAzZWNwdW1hc2suY2JjcHUsIHBpbnN0LVx1MDAzZWNwdW1hc2suY2JjcHUsIGNwdV9vbmxpbmVfbWFzayk7XG4tXHRpZiAob2ZmbGluaW5nX2NwdSBcdTAwM2U9IDApIHtcbi1cdFx0X19jcHVtYXNrX2NsZWFyX2NwdShvZmZsaW5pbmdfY3B1LCBwZC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLVx0XHRfX2NwdW1hc2tfY2xlYXJfY3B1KG9mZmxpbmluZ19jcHUsIHBkLVx1MDAzZWNwdW1hc2suY2JjcHUpO1xuLVx0fVxuLVxuLVx0cGFkYXRhX2luaXRfcmVvcmRlcl9saXN0KHBkKTtcbi1cdHBhZGF0YV9pbml0X3NxdWV1ZXMocGQpO1xuLVx0cGQtXHUwMDNlc2VxX25yID0gLTE7XG4tXHRyZWZjb3VudF9zZXQoXHUwMDI2cGQtXHUwMDNlcmVmY250LCAxKTtcbi1cdHBkLVx1MDAzZWNwdSA9IGNwdW1hc2tfZmlyc3QocGQtXHUwMDNlY3B1bWFzay5wY3B1KTtcbi1cbi1cdHJldHVybiBwZDtcbi1cbi1lcnJfZnJlZV9wY3B1OlxuLVx0ZnJlZV9jcHVtYXNrX3ZhcihwZC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLWVycl9mcmVlX3NxdWV1ZTpcbi1cdGZyZWVfcGVyY3B1KHBkLVx1MDAzZXNxdWV1ZSk7XG4tZXJyX2ZyZWVfcmVvcmRlcl9saXN0OlxuLVx0ZnJlZV9wZXJjcHUocGQtXHUwMDNlcmVvcmRlcl9saXN0KTtcbi1lcnJfZnJlZV9wZDpcbi1cdGtmcmVlKHBkKTtcbi1lcnI6XG4tXHRyZXR1cm4gTlVMTDtcbi19XG4tXG4tc3RhdGljIHZvaWQgcGFkYXRhX2ZyZWVfcGQoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKVxuLXtcbi1cdGZyZWVfY3B1bWFza192YXIocGQtXHUwMDNlY3B1bWFzay5wY3B1KTtcbi1cdGZyZWVfY3B1bWFza192YXIocGQtXHUwMDNlY3B1bWFzay5jYmNwdSk7XG4tXHRmcmVlX3BlcmNwdShwZC1cdTAwM2VyZW9yZGVyX2xpc3QpO1xuLVx0ZnJlZV9wZXJjcHUocGQtXHUwMDNlc3F1ZXVlKTtcbi1cdGtmcmVlKHBkKTtcbi19XG4tXG4tc3RhdGljIHZvaWQgX19wYWRhdGFfc3RhcnQoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpXG4te1xuLVx0cGluc3QtXHUwMDNlZmxhZ3MgfD0gUEFEQVRBX0lOSVQ7XG4tfVxuLVxuLXN0YXRpYyB2b2lkIF9fcGFkYXRhX3N0b3Aoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpXG4te1xuLVx0aWYgKCEocGluc3QtXHUwMDNlZmxhZ3MgXHUwMDI2IFBBREFUQV9JTklUKSlcbi1cdFx0cmV0dXJuO1xuLVxuLVx0cGluc3QtXHUwMDNlZmxhZ3MgXHUwMDI2PSB+UEFEQVRBX0lOSVQ7XG4tXG4tXHRzeW5jaHJvbml6ZV9yY3UoKTtcbi19XG4tXG4tLyogUmVwbGFjZSB0aGUgaW50ZXJuYWwgY29udHJvbCBzdHJ1Y3R1cmUgd2l0aCBhIG5ldyBvbmUuICovXG4tc3RhdGljIGludCBwYWRhdGFfcmVwbGFjZV9vbmUoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsIGludCBvZmZsaW5pbmdfY3B1KVxuLXtcbi1cdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZF9uZXc7XG4tXG4tXHRwZF9uZXcgPSBwYWRhdGFfYWxsb2NfcGQocHMsIG9mZmxpbmluZ19jcHUpO1xuLVx0aWYgKCFwZF9uZXcpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuLVxuLVx0cHMtXHUwMDNlb3BkID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChwcy1cdTAwM2VwZCwgMSk7XG4tXHRyY3VfYXNzaWduX3BvaW50ZXIocHMtXHUwMDNlcGQsIHBkX25ldyk7XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4tc3RhdGljIGludCBwYWRhdGFfcmVwbGFjZShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IG9mZmxpbmluZ19jcHUpXG4te1xuLVx0c3RydWN0IHBhZGF0YV9zaGVsbCAqcHM7XG4tXHRpbnQgZXJyID0gMDtcbi1cbi1cdHBpbnN0LVx1MDAzZWZsYWdzIHw9IFBBREFUQV9SRVNFVDtcbi1cbi1cdGxpc3RfZm9yX2VhY2hfZW50cnkocHMsIFx1MDAyNnBpbnN0LVx1MDAzZXBzbGlzdCwgbGlzdCkge1xuLVx0XHRlcnIgPSBwYWRhdGFfcmVwbGFjZV9vbmUocHMsIG9mZmxpbmluZ19jcHUpO1xuLVx0XHRpZiAoZXJyKVxuLVx0XHRcdGJyZWFrO1xuLVx0fVxuLVxuLVx0c3luY2hyb25pemVfcmN1KCk7XG4tXG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JldmVyc2UocHMsIFx1MDAyNnBpbnN0LVx1MDAzZXBzbGlzdCwgbGlzdClcbi1cdFx0cGFkYXRhX3B1dF9wZChwcy1cdTAwM2VvcGQpO1xuLVxuLVx0cGluc3QtXHUwMDNlZmxhZ3MgXHUwMDI2PSB+UEFEQVRBX1JFU0VUO1xuLVxuLVx0cmV0dXJuIGVycjtcbi19XG4tXG4tLyogSWYgY3B1bWFzayBjb250YWlucyBubyBhY3RpdmUgY3B1LCB3ZSBtYXJrIHRoZSBpbnN0YW5jZSBhcyBpbnZhbGlkLiAqL1xuLXN0YXRpYyBib29sIHBhZGF0YV92YWxpZGF0ZV9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LFxuLVx0XHRcdFx0ICAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrLFxuLVx0XHRcdFx0ICAgIGludCBvZmZsaW5pbmdfY3B1KVxuLXtcbi1cdGNwdW1hc2tfY29weShwaW5zdC1cdTAwM2V2YWxpZGF0ZV9jcHVtYXNrLCBjcHVfb25saW5lX21hc2spO1xuLVxuLVx0Lypcbi1cdCAqIEBvZmZsaW5pbmdfY3B1IGlzIHN0aWxsIGluIGNwdV9vbmxpbmVfbWFzaywgc28gcmVtb3ZlIGl0IGhlcmUgZm9yXG4tXHQgKiB2YWxpZGF0aW9uLiAgVXNpbmcgYSBzdWItQ1BVSFBfVEVBUkRPV05fQ1BVIGhvdHBsdWcgc3RhdGUgd2hlcmVcbi1cdCAqIEBvZmZsaW5pbmdfY3B1IHdvdWxkbiYjMzk7dCBiZSBpbiB0aGUgb25saW5lIG1hc2sgZG9lc24mIzM5O3Qgd29yayBiZWNhdXNlXG4tXHQgKiBwYWRhdGFfY3B1X29mZmxpbmUoKSBjYW4gZmFpbCBidXQgc3VjaCBhIHN0YXRlIGRvZXNuJiMzOTt0IGFsbG93IGZhaWx1cmUuXG4tXHQgKi9cbi1cdGlmIChvZmZsaW5pbmdfY3B1IFx1MDAzZT0gMClcbi1cdFx0X19jcHVtYXNrX2NsZWFyX2NwdShvZmZsaW5pbmdfY3B1LCBwaW5zdC1cdTAwM2V2YWxpZGF0ZV9jcHVtYXNrKTtcbi1cbi1cdGlmICghY3B1bWFza19pbnRlcnNlY3RzKGNwdW1hc2ssIHBpbnN0LVx1MDAzZXZhbGlkYXRlX2NwdW1hc2spKSB7XG4tXHRcdHBpbnN0LVx1MDAzZWZsYWdzIHw9IFBBREFUQV9JTlZBTElEO1xuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXHR9XG4tXG4tXHRwaW5zdC1cdTAwM2VmbGFncyBcdTAwMjY9IH5QQURBVEFfSU5WQUxJRDtcbi1cdHJldHVybiB0cnVlO1xuLX1cbi1cbi1zdGF0aWMgaW50IF9fcGFkYXRhX3NldF9jcHVtYXNrcyhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCxcbi1cdFx0XHRcdCBjcHVtYXNrX3Zhcl90IHBjcHVtYXNrLFxuLVx0XHRcdFx0IGNwdW1hc2tfdmFyX3QgY2JjcHVtYXNrKVxuLXtcbi1cdGludCB2YWxpZDtcbi1cdGludCBlcnI7XG4tXG4tXHR2YWxpZCA9IHBhZGF0YV92YWxpZGF0ZV9jcHVtYXNrKHBpbnN0LCBwY3B1bWFzaywgLTEpO1xuLVx0aWYgKCF2YWxpZCkge1xuLVx0XHRfX3BhZGF0YV9zdG9wKHBpbnN0KTtcbi1cdFx0Z290byBvdXRfcmVwbGFjZTtcbi1cdH1cbi1cbi1cdHZhbGlkID0gcGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2socGluc3QsIGNiY3B1bWFzaywgLTEpO1xuLVx0aWYgKCF2YWxpZClcbi1cdFx0X19wYWRhdGFfc3RvcChwaW5zdCk7XG4tXG4tb3V0X3JlcGxhY2U6XG4tXHRjcHVtYXNrX2NvcHkocGluc3QtXHUwMDNlY3B1bWFzay5wY3B1LCBwY3B1bWFzayk7XG4tXHRjcHVtYXNrX2NvcHkocGluc3QtXHUwMDNlY3B1bWFzay5jYmNwdSwgY2JjcHVtYXNrKTtcbi1cbi1cdGVyciA9IHBhZGF0YV9zZXR1cF9jcHVtYXNrcyhwaW5zdCkgPzogcGFkYXRhX3JlcGxhY2UocGluc3QsIC0xKTtcbi1cbi1cdGlmICh2YWxpZClcbi1cdFx0X19wYWRhdGFfc3RhcnQocGluc3QpO1xuLVxuLVx0cmV0dXJuIGVycjtcbi19XG4tXG4tLyoqXG4tICogcGFkYXRhX3NldF9jcHVtYXNrIC0gU2V0cyBzcGVjaWZpZWQgYnkgQGNwdW1hc2tfdHlwZSBjcHVtYXNrIHRvIHRoZSB2YWx1ZVxuLSAqICAgICAgICAgICAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8gQGNwdW1hc2suXG4tICogQHBpbnN0OiBwYWRhdGEgaW5zdGFuY2Vcbi0gKiBAY3B1bWFza190eXBlOiBQQURBVEFfQ1BVX1NFUklBTCBvciBQQURBVEFfQ1BVX1BBUkFMTEVMIGNvcnJlc3BvbmRpbmdcbi0gKiAgICAgICAgICAgICAgICB0byBwYXJhbGxlbCBhbmQgc2VyaWFsIGNwdW1hc2tzIHJlc3BlY3RpdmVseS5cbi0gKiBAY3B1bWFzazogdGhlIGNwdW1hc2sgdG8gdXNlXG4tICpcbi0gKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlXG4tICovXG4taW50IHBhZGF0YV9zZXRfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdW1hc2tfdHlwZSxcbi1cdFx0ICAgICAgIGNwdW1hc2tfdmFyX3QgY3B1bWFzaylcbi17XG4tXHRzdHJ1Y3QgY3B1bWFzayAqc2VyaWFsX21hc2ssICpwYXJhbGxlbF9tYXNrO1xuLVx0aW50IGVyciA9IC1FSU5WQUw7XG4tXG4tXHRjcHVzX3JlYWRfbG9jaygpO1xuLVx0bXV0ZXhfbG9jayhcdTAwMjZwaW5zdC1cdTAwM2Vsb2NrKTtcbi1cbi1cdHN3aXRjaCAoY3B1bWFza190eXBlKSB7XG4tXHRjYXNlIFBBREFUQV9DUFVfUEFSQUxMRUw6XG4tXHRcdHNlcmlhbF9tYXNrID0gcGluc3QtXHUwMDNlY3B1bWFzay5jYmNwdTtcbi1cdFx0cGFyYWxsZWxfbWFzayA9IGNwdW1hc2s7XG4tXHRcdGJyZWFrO1xuLVx0Y2FzZSBQQURBVEFfQ1BVX1NFUklBTDpcbi1cdFx0cGFyYWxsZWxfbWFzayA9IHBpbnN0LVx1MDAzZWNwdW1hc2sucGNwdTtcbi1cdFx0c2VyaWFsX21hc2sgPSBjcHVtYXNrO1xuLVx0XHRicmVhaztcbi1cdGRlZmF1bHQ6XG4tXHRcdCBnb3RvIG91dDtcbi1cdH1cbi1cbi1cdGVyciA9ICBfX3BhZGF0YV9zZXRfY3B1bWFza3MocGluc3QsIHBhcmFsbGVsX21hc2ssIHNlcmlhbF9tYXNrKTtcbi1cbi1vdXQ6XG4tXHRtdXRleF91bmxvY2soXHUwMDI2cGluc3QtXHUwMDNlbG9jayk7XG4tXHRjcHVzX3JlYWRfdW5sb2NrKCk7XG4tXG4tXHRyZXR1cm4gZXJyO1xuLX1cbi1FWFBPUlRfU1lNQk9MKHBhZGF0YV9zZXRfY3B1bWFzayk7XG4tXG4tI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVVxuLVxuLXN0YXRpYyBpbmxpbmUgaW50IHBpbnN0X2hhc19jcHUoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsIGludCBjcHUpXG4te1xuLVx0cmV0dXJuIGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBwaW5zdC1cdTAwM2VjcHVtYXNrLnBjcHUpIHx8XG4tXHRcdGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBwaW5zdC1cdTAwM2VjcHVtYXNrLmNiY3B1KTtcbi19XG4tXG4tc3RhdGljIGludCBwYWRhdGFfY3B1X29ubGluZSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSlcbi17XG4tXHRzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdDtcbi1cdGludCByZXQ7XG4tXG4tXHRwaW5zdCA9IGhsaXN0X2VudHJ5X3NhZmUobm9kZSwgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSwgY3B1aHBfbm9kZSk7XG4tXHRpZiAoIXBpbnN0X2hhc19jcHUocGluc3QsIGNwdSkpXG4tXHRcdHJldHVybiAwO1xuLVxuLVx0bXV0ZXhfbG9jayhcdTAwMjZwaW5zdC1cdTAwM2Vsb2NrKTtcbi1cbi1cdHJldCA9IHBhZGF0YV9yZXBsYWNlKHBpbnN0LCAtMSk7XG4tXG4tXHRpZiAocGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2socGluc3QsIHBpbnN0LVx1MDAzZWNwdW1hc2sucGNwdSwgLTEpIFx1MDAyNlx1MDAyNlxuLVx0ICAgIHBhZGF0YV92YWxpZGF0ZV9jcHVtYXNrKHBpbnN0LCBwaW5zdC1cdTAwM2VjcHVtYXNrLmNiY3B1LCAtMSkpXG4tXHRcdF9fcGFkYXRhX3N0YXJ0KHBpbnN0KTtcbi1cbi1cdG11dGV4X3VubG9jayhcdTAwMjZwaW5zdC1cdTAwM2Vsb2NrKTtcbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLXN0YXRpYyBpbnQgcGFkYXRhX2NwdV9vZmZsaW5lKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKVxuLXtcbi1cdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0O1xuLVx0aW50IHJldDtcbi1cbi1cdHBpbnN0ID0gaGxpc3RfZW50cnlfc2FmZShub2RlLCBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlLCBjcHVocF9ub2RlKTtcbi1cdGlmICghcGluc3RfaGFzX2NwdShwaW5zdCwgY3B1KSlcbi1cdFx0cmV0dXJuIDA7XG4tXG4tXHRtdXRleF9sb2NrKFx1MDAyNnBpbnN0LVx1MDAzZWxvY2spO1xuLVxuLVx0aWYgKCFwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGluc3QtXHUwMDNlY3B1bWFzay5wY3B1LCBjcHUpIHx8XG4tXHQgICAgIXBhZGF0YV92YWxpZGF0ZV9jcHVtYXNrKHBpbnN0LCBwaW5zdC1cdTAwM2VjcHVtYXNrLmNiY3B1LCBjcHUpKVxuLVx0XHRfX3BhZGF0YV9zdG9wKHBpbnN0KTtcbi1cbi1cdHJldCA9IHBhZGF0YV9yZXBsYWNlKHBpbnN0LCBjcHUpO1xuLVxuLVx0bXV0ZXhfdW5sb2NrKFx1MDAyNnBpbnN0LVx1MDAzZWxvY2spO1xuLVx0cmV0dXJuIHJldDtcbi19XG4tXG4tc3RhdGljIGVudW0gY3B1aHBfc3RhdGUgaHBfb25saW5lO1xuLSNlbmRpZlxuLVxuLXN0YXRpYyB2b2lkIF9fcGFkYXRhX2ZyZWUoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpXG4te1xuLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFVcbi1cdGNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzKGhwX29ubGluZSwgXHUwMDI2cGluc3QtXHUwMDNlY3B1aHBfbm9kZSk7XG4tI2VuZGlmXG4tXG4tXHRXQVJOX09OKCFsaXN0X2VtcHR5KFx1MDAyNnBpbnN0LVx1MDAzZXBzbGlzdCkpO1xuLVxuLVx0ZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLVx0ZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC1cdTAwM2VjcHVtYXNrLmNiY3B1KTtcbi1cdGZyZWVfY3B1bWFza192YXIocGluc3QtXHUwMDNldmFsaWRhdGVfY3B1bWFzayk7XG4tXHRkZXN0cm95X3dvcmtxdWV1ZShwaW5zdC1cdTAwM2VzZXJpYWxfd3EpO1xuLVx0ZGVzdHJveV93b3JrcXVldWUocGluc3QtXHUwMDNlcGFyYWxsZWxfd3EpO1xuLVx0a2ZyZWUocGluc3QpO1xuLX1cbi1cbi0jZGVmaW5lIGtvYmoycGluc3QoX2tvYmopXHRcdFx0XHRcdFxcXG4tXHRjb250YWluZXJfb2YoX2tvYmosIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UsIGtvYmopXG4tI2RlZmluZSBhdHRyMnBlbnRyeShfYXR0cilcdFx0XHRcdFx0XFxcbi1cdGNvbnRhaW5lcl9vZl9jb25zdChfYXR0ciwgc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSwgYXR0cilcbi1cbi1zdGF0aWMgdm9pZCBwYWRhdGFfc3lzZnNfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iailcbi17XG4tXHRzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCA9IGtvYmoycGluc3Qoa29iaik7XG4tXHRfX3BhZGF0YV9mcmVlKHBpbnN0KTtcbi19XG4tXG4tc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSB7XG4tXHRzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7XG4tXHRzc2l6ZV90ICgqc2hvdykoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICosIGNoYXIgKik7XG4tXHRzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKiwgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqLFxuLVx0XHRcdCBjb25zdCBjaGFyICosIHNpemVfdCk7XG4tfTtcbi1cbi1zdGF0aWMgc3NpemVfdCBzaG93X2NwdW1hc2soc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsXG4tXHRcdFx0ICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsICBjaGFyICpidWYpXG4te1xuLVx0c3RydWN0IGNwdW1hc2sgKmNwdW1hc2s7XG4tXHRzc2l6ZV90IGxlbjtcbi1cbi1cdG11dGV4X2xvY2soXHUwMDI2cGluc3QtXHUwMDNlbG9jayk7XG4tXHRpZiAoIXN0cmNtcChhdHRyLVx1MDAzZW5hbWUsIFwmIzM0O3NlcmlhbF9jcHVtYXNrXCYjMzQ7KSlcbi1cdFx0Y3B1bWFzayA9IHBpbnN0LVx1MDAzZWNwdW1hc2suY2JjcHU7XG4tXHRlbHNlXG4tXHRcdGNwdW1hc2sgPSBwaW5zdC1cdTAwM2VjcHVtYXNrLnBjcHU7XG4tXG4tXHRsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgXCYjMzQ7JSpwYlxcblwmIzM0Oyxcbi1cdFx0ICAgICAgIG5yX2NwdV9pZHMsIGNwdW1hc2tfYml0cyhjcHVtYXNrKSk7XG4tXHRtdXRleF91bmxvY2soXHUwMDI2cGluc3QtXHUwMDNlbG9jayk7XG4tXHRyZXR1cm4gbGVuIFx1MDAzYyBQQUdFX1NJWkUgPyBsZW4gOiAtRUlOVkFMO1xuLX1cbi1cbi1zdGF0aWMgc3NpemVfdCBzdG9yZV9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LFxuLVx0XHRcdCAgICAgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cixcbi1cdFx0XHQgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KVxuLXtcbi1cdGNwdW1hc2tfdmFyX3QgbmV3X2NwdW1hc2s7XG4tXHRzc2l6ZV90IHJldDtcbi1cdGludCBtYXNrX3R5cGU7XG4tXG4tXHRpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKFx1MDAyNm5ld19jcHVtYXNrLCBHRlBfS0VSTkVMKSlcbi1cdFx0cmV0dXJuIC1FTk9NRU07XG4tXG4tXHRyZXQgPSBiaXRtYXBfcGFyc2UoYnVmLCBjb3VudCwgY3B1bWFza19iaXRzKG5ld19jcHVtYXNrKSxcbi1cdFx0XHQgICBucl9jcHVtYXNrX2JpdHMpO1xuLVx0aWYgKHJldCBcdTAwM2MgMClcbi1cdFx0Z290byBvdXQ7XG4tXG4tXHRtYXNrX3R5cGUgPSAhc3RyY21wKGF0dHItXHUwMDNlbmFtZSwgXCYjMzQ7c2VyaWFsX2NwdW1hc2tcJiMzNDspID9cbi1cdFx0UEFEQVRBX0NQVV9TRVJJQUwgOiBQQURBVEFfQ1BVX1BBUkFMTEVMO1xuLVx0cmV0ID0gcGFkYXRhX3NldF9jcHVtYXNrKHBpbnN0LCBtYXNrX3R5cGUsIG5ld19jcHVtYXNrKTtcbi1cdGlmICghcmV0KVxuLVx0XHRyZXQgPSBjb3VudDtcbi1cbi1vdXQ6XG4tXHRmcmVlX2NwdW1hc2tfdmFyKG5ld19jcHVtYXNrKTtcbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLSNkZWZpbmUgUEFEQVRBX0FUVFJfUlcoX25hbWUsIF9zaG93X25hbWUsIF9zdG9yZV9uYW1lKVx0XHRcXFxuLVx0c3RhdGljIGNvbnN0IHN0cnVjdCBwYWRhdGFfc3lzZnNfZW50cnkgX25hbWUjI19hdHRyID1cdFxcXG4tXHRcdF9fQVRUUihfbmFtZSwgMDY0NCwgX3Nob3dfbmFtZSwgX3N0b3JlX25hbWUpXG4tI2RlZmluZSBQQURBVEFfQVRUUl9STyhfbmFtZSwgX3Nob3dfbmFtZSlcdFx0XHRcXFxuLVx0c3RhdGljIGNvbnN0IHN0cnVjdCBwYWRhdGFfc3lzZnNfZW50cnkgX25hbWUjI19hdHRyID1cdFxcXG4tXHRcdF9fQVRUUihfbmFtZSwgMDQwMCwgX3Nob3dfbmFtZSwgTlVMTClcbi1cbi1QQURBVEFfQVRUUl9SVyhzZXJpYWxfY3B1bWFzaywgc2hvd19jcHVtYXNrLCBzdG9yZV9jcHVtYXNrKTtcbi1QQURBVEFfQVRUUl9SVyhwYXJhbGxlbF9jcHVtYXNrLCBzaG93X2NwdW1hc2ssIHN0b3JlX2NwdW1hc2spO1xuLVxuLS8qXG4tICogUGFkYXRhIHN5c2ZzIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgb2JqZWN0czpcbi0gKiBzZXJpYWxfY3B1bWFzayAgIFtSV10gLSBjcHVtYXNrIGZvciBzZXJpYWwgd29ya2Vyc1xuLSAqIHBhcmFsbGVsX2NwdW1hc2sgW1JXXSAtIGNwdW1hc2sgZm9yIHBhcmFsbGVsIHdvcmtlcnNcbi0gKi9cbi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqY29uc3QgcGFkYXRhX2RlZmF1bHRfYXR0cnNbXSA9IHtcbi1cdFx1MDAyNnNlcmlhbF9jcHVtYXNrX2F0dHIuYXR0cixcbi1cdFx1MDAyNnBhcmFsbGVsX2NwdW1hc2tfYXR0ci5hdHRyLFxuLVx0TlVMTCxcbi19O1xuLUFUVFJJQlVURV9HUk9VUFMocGFkYXRhX2RlZmF1bHQpO1xuLVxuLXN0YXRpYyBzc2l6ZV90IHBhZGF0YV9zeXNmc19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLFxuLVx0XHRcdFx0IHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zilcbi17XG4tXHRjb25zdCBzdHJ1Y3QgcGFkYXRhX3N5c2ZzX2VudHJ5ICpwZW50cnk7XG4tXHRzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdDtcbi1cdHNzaXplX3QgcmV0ID0gLUVJTztcbi1cbi1cdHBpbnN0ID0ga29iajJwaW5zdChrb2JqKTtcbi1cdHBlbnRyeSA9IGF0dHIycGVudHJ5KGF0dHIpO1xuLVx0aWYgKHBlbnRyeS1cdTAwM2VzaG93KVxuLVx0XHRyZXQgPSBwZW50cnktXHUwMDNlc2hvdyhwaW5zdCwgYXR0ciwgYnVmKTtcbi1cbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLXN0YXRpYyBzc2l6ZV90IHBhZGF0YV9zeXNmc19zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cixcbi1cdFx0XHRcdCAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpXG4te1xuLVx0Y29uc3Qgc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSAqcGVudHJ5O1xuLVx0c3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3Q7XG4tXHRzc2l6ZV90IHJldCA9IC1FSU87XG4tXG4tXHRwaW5zdCA9IGtvYmoycGluc3Qoa29iaik7XG4tXHRwZW50cnkgPSBhdHRyMnBlbnRyeShhdHRyKTtcbi1cdGlmIChwZW50cnktXHUwMDNlc3RvcmUpXG4tXHRcdHJldCA9IHBlbnRyeS1cdTAwM2VzdG9yZShwaW5zdCwgYXR0ciwgYnVmLCBjb3VudCk7XG4tXG4tXHRyZXR1cm4gcmV0O1xuLX1cbi1cbi1zdGF0aWMgY29uc3Qgc3RydWN0IHN5c2ZzX29wcyBwYWRhdGFfc3lzZnNfb3BzID0ge1xuLVx0LnNob3cgPSBwYWRhdGFfc3lzZnNfc2hvdyxcbi1cdC5zdG9yZSA9IHBhZGF0YV9zeXNmc19zdG9yZSxcbi19O1xuLVxuLXN0YXRpYyBjb25zdCBzdHJ1Y3Qga29ial90eXBlIHBhZGF0YV9hdHRyX3R5cGUgPSB7XG4tXHQuc3lzZnNfb3BzID0gXHUwMDI2cGFkYXRhX3N5c2ZzX29wcyxcbi1cdC5kZWZhdWx0X2dyb3VwcyA9IHBhZGF0YV9kZWZhdWx0X2dyb3Vwcyxcbi1cdC5yZWxlYXNlID0gcGFkYXRhX3N5c2ZzX3JlbGVhc2UsXG4tfTtcbi1cbi0vKipcbi0gKiBwYWRhdGFfYWxsb2MgLSBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIHBhZGF0YSBpbnN0YW5jZVxuLSAqIEBuYW1lOiB1c2VkIHRvIGlkZW50aWZ5IHRoZSBpbnN0YW5jZVxuLSAqXG4tICogUmV0dXJuOiBuZXcgaW5zdGFuY2Ugb24gc3VjY2VzcywgTlVMTCBvbiBlcnJvclxuLSAqL1xuLXN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBhZGF0YV9hbGxvYyhjb25zdCBjaGFyICpuYW1lKVxuLXtcbi1cdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0O1xuLVxuLVx0cGluc3QgPSBremFsbG9jX29iaihzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlKTtcbi1cdGlmICghcGluc3QpXG4tXHRcdGdvdG8gZXJyO1xuLVxuLVx0cGluc3QtXHUwMDNlcGFyYWxsZWxfd3EgPSBhbGxvY193b3JrcXVldWUoXCYjMzQ7JXNfcGFyYWxsZWxcJiMzNDssIFdRX1VOQk9VTkQsIDAsXG4tXHRcdFx0XHRcdCAgICAgbmFtZSk7XG4tXHRpZiAoIXBpbnN0LVx1MDAzZXBhcmFsbGVsX3dxKVxuLVx0XHRnb3RvIGVycl9mcmVlX2luc3Q7XG4tXG4tXHRjcHVzX3JlYWRfbG9jaygpO1xuLVxuLVx0cGluc3QtXHUwMDNlc2VyaWFsX3dxID0gYWxsb2Nfd29ya3F1ZXVlKFwmIzM0OyVzX3NlcmlhbFwmIzM0Oyxcbi1cdFx0XHRcdFx0ICAgV1FfTUVNX1JFQ0xBSU0gfCBXUV9DUFVfSU5URU5TSVZFIHwgV1FfUEVSQ1BVLFxuLVx0XHRcdFx0XHQgICAxLCBuYW1lKTtcbi1cdGlmICghcGluc3QtXHUwMDNlc2VyaWFsX3dxKVxuLVx0XHRnb3RvIGVycl9wdXRfY3B1cztcbi1cbi1cdGlmICghYWxsb2NfY3B1bWFza192YXIoXHUwMDI2cGluc3QtXHUwMDNlY3B1bWFzay5wY3B1LCBHRlBfS0VSTkVMKSlcbi1cdFx0Z290byBlcnJfZnJlZV9zZXJpYWxfd3E7XG4tXHRpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKFx1MDAyNnBpbnN0LVx1MDAzZWNwdW1hc2suY2JjcHUsIEdGUF9LRVJORUwpKVxuLVx0XHRnb3RvIGVycl9mcmVlX3BfbWFzaztcbi1cdGlmICghYWxsb2NfY3B1bWFza192YXIoXHUwMDI2cGluc3QtXHUwMDNldmFsaWRhdGVfY3B1bWFzaywgR0ZQX0tFUk5FTCkpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfY2JfbWFzaztcbi1cbi1cdElOSVRfTElTVF9IRUFEKFx1MDAyNnBpbnN0LVx1MDAzZXBzbGlzdCk7XG4tXG4tXHRjcHVtYXNrX2NvcHkocGluc3QtXHUwMDNlY3B1bWFzay5wY3B1LCBjcHVfcG9zc2libGVfbWFzayk7XG4tXHRjcHVtYXNrX2NvcHkocGluc3QtXHUwMDNlY3B1bWFzay5jYmNwdSwgY3B1X3Bvc3NpYmxlX21hc2spO1xuLVxuLVx0aWYgKHBhZGF0YV9zZXR1cF9jcHVtYXNrcyhwaW5zdCkpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfdl9tYXNrO1xuLVxuLVx0X19wYWRhdGFfc3RhcnQocGluc3QpO1xuLVxuLVx0a29iamVjdF9pbml0KFx1MDAyNnBpbnN0LVx1MDAzZWtvYmosIFx1MDAyNnBhZGF0YV9hdHRyX3R5cGUpO1xuLVx0bXV0ZXhfaW5pdChcdTAwMjZwaW5zdC1cdTAwM2Vsb2NrKTtcbi1cbi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVXG4tXHRjcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2Vfbm9jYWxsc19jcHVzbG9ja2VkKGhwX29ubGluZSxcbi1cdFx0XHRcdFx0XHQgICAgXHUwMDI2cGluc3QtXHUwMDNlY3B1aHBfbm9kZSk7XG4tI2VuZGlmXG4tXG4tXHRjcHVzX3JlYWRfdW5sb2NrKCk7XG4tXG4tXHRyZXR1cm4gcGluc3Q7XG4tXG4tZXJyX2ZyZWVfdl9tYXNrOlxuLVx0ZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC1cdTAwM2V2YWxpZGF0ZV9jcHVtYXNrKTtcbi1lcnJfZnJlZV9jYl9tYXNrOlxuLVx0ZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC1cdTAwM2VjcHVtYXNrLmNiY3B1KTtcbi1lcnJfZnJlZV9wX21hc2s6XG4tXHRmcmVlX2NwdW1hc2tfdmFyKHBpbnN0LVx1MDAzZWNwdW1hc2sucGNwdSk7XG4tZXJyX2ZyZWVfc2VyaWFsX3dxOlxuLVx0ZGVzdHJveV93b3JrcXVldWUocGluc3QtXHUwMDNlc2VyaWFsX3dxKTtcbi1lcnJfcHV0X2NwdXM6XG4tXHRjcHVzX3JlYWRfdW5sb2NrKCk7XG4tXHRkZXN0cm95X3dvcmtxdWV1ZShwaW5zdC1cdTAwM2VwYXJhbGxlbF93cSk7XG4tZXJyX2ZyZWVfaW5zdDpcbi1cdGtmcmVlKHBpbnN0KTtcbi1lcnI6XG4tXHRyZXR1cm4gTlVMTDtcbi19XG4tRVhQT1JUX1NZTUJPTChwYWRhdGFfYWxsb2MpO1xuLVxuLS8qKlxuLSAqIHBhZGF0YV9mcmVlIC0gZnJlZSBhIHBhZGF0YSBpbnN0YW5jZVxuLSAqXG4tICogQHBpbnN0OiBwYWRhdGEgaW5zdGFuY2UgdG8gZnJlZVxuLSAqL1xuLXZvaWQgcGFkYXRhX2ZyZWUoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpXG4te1xuLVx0a29iamVjdF9wdXQoXHUwMDI2cGluc3QtXHUwMDNla29iaik7XG4tfVxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX2ZyZWUpO1xuLVxuLS8qKlxuLSAqIHBhZGF0YV9hbGxvY19zaGVsbCAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHBhZGF0YSBzaGVsbC5cbi0gKlxuLSAqIEBwaW5zdDogUGFyZW50IHBhZGF0YV9pbnN0YW5jZSBvYmplY3QuXG4tICpcbi0gKiBSZXR1cm46IG5ldyBzaGVsbCBvbiBzdWNjZXNzLCBOVUxMIG9uIGVycm9yXG4tICovXG4tc3RydWN0IHBhZGF0YV9zaGVsbCAqcGFkYXRhX2FsbG9jX3NoZWxsKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KVxuLXtcbi1cdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDtcbi1cdHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzO1xuLVxuLVx0cHMgPSBremFsbG9jX29iaigqcHMpO1xuLVx0aWYgKCFwcylcbi1cdFx0Z290byBvdXQ7XG4tXG4tXHRwcy1cdTAwM2VwaW5zdCA9IHBpbnN0O1xuLVxuLVx0Y3B1c19yZWFkX2xvY2soKTtcbi1cdHBkID0gcGFkYXRhX2FsbG9jX3BkKHBzLCAtMSk7XG4tXHRjcHVzX3JlYWRfdW5sb2NrKCk7XG4tXG4tXHRpZiAoIXBkKVxuLVx0XHRnb3RvIG91dF9mcmVlX3BzO1xuLVxuLVx0bXV0ZXhfbG9jayhcdTAwMjZwaW5zdC1cdTAwM2Vsb2NrKTtcbi1cdFJDVV9JTklUX1BPSU5URVIocHMtXHUwMDNlcGQsIHBkKTtcbi1cdGxpc3RfYWRkKFx1MDAyNnBzLVx1MDAzZWxpc3QsIFx1MDAyNnBpbnN0LVx1MDAzZXBzbGlzdCk7XG4tXHRtdXRleF91bmxvY2soXHUwMDI2cGluc3QtXHUwMDNlbG9jayk7XG4tXG4tXHRyZXR1cm4gcHM7XG4tXG4tb3V0X2ZyZWVfcHM6XG4tXHRrZnJlZShwcyk7XG4tb3V0OlxuLVx0cmV0dXJuIE5VTEw7XG4tfVxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX2FsbG9jX3NoZWxsKTtcbi1cbi0vKipcbi0gKiBwYWRhdGFfZnJlZV9zaGVsbCAtIGZyZWUgYSBwYWRhdGEgc2hlbGxcbi0gKlxuLSAqIEBwczogcGFkYXRhIHNoZWxsIHRvIGZyZWVcbi0gKi9cbi12b2lkIHBhZGF0YV9mcmVlX3NoZWxsKHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzKVxuLXtcbi1cdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDtcbi1cbi1cdGlmICghcHMpXG4tXHRcdHJldHVybjtcbi1cbi1cdG11dGV4X2xvY2soXHUwMDI2cHMtXHUwMDNlcGluc3QtXHUwMDNlbG9jayk7XG4tXHRsaXN0X2RlbChcdTAwMjZwcy1cdTAwM2VsaXN0KTtcbi1cdHBkID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChwcy1cdTAwM2VwZCwgMSk7XG4tXHRwYWRhdGFfcHV0X3BkKHBkKTtcbi1cdG11dGV4X3VubG9jayhcdTAwMjZwcy1cdTAwM2VwaW5zdC1cdTAwM2Vsb2NrKTtcbi1cbi1cdGtmcmVlKHBzKTtcbi19XG4tRVhQT1JUX1NZTUJPTChwYWRhdGFfZnJlZV9zaGVsbCk7XG4tXG4gdm9pZCBfX2luaXQgcGFkYXRhX2luaXQodm9pZClcbiB7XG4gXHR1bnNpZ25lZCBpbnQgaSwgcG9zc2libGVfY3B1cztcbi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVXG4tXHRpbnQgcmV0O1xuLVxuLVx0cmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkoQ1BVSFBfQVBfT05MSU5FX0RZTiwgXCYjMzQ7cGFkYXRhOm9ubGluZVwmIzM0Oyxcbi1cdFx0XHRcdCAgICAgIHBhZGF0YV9jcHVfb25saW5lLCBwYWRhdGFfY3B1X29mZmxpbmUpO1xuLVx0aWYgKHJldCBcdTAwM2MgMClcbi1cdFx0Z290byBlcnI7XG4tXHRocF9vbmxpbmUgPSByZXQ7XG4tI2VuZGlmXG4gXG4gXHRwb3NzaWJsZV9jcHVzID0gbnVtX3Bvc3NpYmxlX2NwdXMoKTtcbiBcdHBhZGF0YV93b3JrcyA9IGttYWxsb2Nfb2JqcyhzdHJ1Y3QgcGFkYXRhX3dvcmssIHBvc3NpYmxlX2NwdXMpO1xuLVx0aWYgKCFwYWRhdGFfd29ya3MpXG4tXHRcdGdvdG8gcmVtb3ZlX29ubGluZV9zdGF0ZTtcbiYjNDM7XHRpZiAoIXBhZGF0YV93b3Jrcykge1xuJiM0MztcdFx0cHJfd2FybihcJiMzNDtwYWRhdGE6IGluaXRpYWxpemF0aW9uIGZhaWxlZFxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuIFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgcG9zc2libGVfY3B1czsgJiM0MzsmIzQzO2kpXG4gXHRcdGxpc3RfYWRkKFx1MDAyNnBhZGF0YV93b3Jrc1tpXS5wd19saXN0LCBcdTAwMjZwYWRhdGFfZnJlZV93b3Jrcyk7XG4tXG4tXHRyZXR1cm47XG4tXG4tcmVtb3ZlX29ubGluZV9zdGF0ZTpcbi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVXG4tXHRjcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUoaHBfb25saW5lKTtcbi1lcnI6XG4tI2VuZGlmXG4tXHRwcl93YXJuKFwmIzM0O3BhZGF0YTogaW5pdGlhbGl6YXRpb24gZmFpbGVkXFxuXCYjMzQ7KTtcbiB9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvY3J5cHRvL3RjcnlwdC90Y3J5cHRfc3BlZWRfY29tcGFyZS5weSBiL3Rvb2xzL2NyeXB0by90Y3J5cHQvdGNyeXB0X3NwZWVkX2NvbXBhcmUucHlcbmluZGV4IGYzZjU3ODNjZGMwNjZiLi4wYmYzOGMwNzNkYmMwMyAxMDA3NTVcbi0tLSBhL3Rvb2xzL2NyeXB0by90Y3J5cHQvdGNyeXB0X3NwZWVkX2NvbXBhcmUucHlcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2NyeXB0by90Y3J5cHQvdGNyeXB0X3NwZWVkX2NvbXBhcmUucHlcbkBAIC0yOCwxOSAmIzQzOzI4LDE2IEBAIG51bV9tYj04XG4gbW9kZT0yMTFcbiBcbiAjIGJhc2Ugc3BlZWQgdGVzdFxuLWxzbW9kIHwgZ3JlcCBwY3J5cHQgXHUwMDI2XHUwMDI2IG1vZHByb2JlIC1yIHBjcnlwdFxuIGRtZXNnIC1DXG4tbW9kcHJvYmUgdGNyeXB0IGFsZz1cJiMzNDtwY3J5cHQocmZjNDEwNihnY20oYWVzKSkpXCYjMzQ7IHR5cGU9M1xuJiM0Mzttb2Rwcm9iZSB0Y3J5cHQgYWxnPVwmIzM0O3JmYzQxMDYoZ2NtKGFlcykpXCYjMzQ7IHR5cGU9M1xuIG1vZHByb2JlIHRjcnlwdCBtb2RlPSR7bW9kZX0gc2VjPSR7c2VjfSBudW1fbWI9JHtudW1fbWJ9XG4gZG1lc2cgXHUwMDNlICR7c2VxX251bX1fYmFzZV9kbWVzZy5sb2dcbiBcbiAjIG5ldyBzcGVlZCB0ZXN0XG4tbHNtb2QgfCBncmVwIHBjcnlwdCBcdTAwMjZcdTAwMjYgbW9kcHJvYmUgLXIgcGNyeXB0XG4gZG1lc2cgLUNcbi1tb2Rwcm9iZSB0Y3J5cHQgYWxnPVwmIzM0O3BjcnlwdChyZmM0MTA2KGdjbShhZXMpKSlcJiMzNDsgdHlwZT0zXG4mIzQzO21vZHByb2JlIHRjcnlwdCBhbGc9XCYjMzQ7cmZjNDEwNihnY20oYWVzKSlcJiMzNDsgdHlwZT0zXG4gbW9kcHJvYmUgdGNyeXB0IG1vZGU9JHttb2RlfSBzZWM9JHtzZWN9IG51bV9tYj0ke251bV9tYn1cbiBkbWVzZyBcdTAwM2UgJHtzZXFfbnVtfV9uZXdfZG1lc2cubG9nXG4tbHNtb2QgfCBncmVwIHBjcnlwdCBcdTAwMjZcdTAwMjYgbW9kcHJvYmUgLXIgcGNyeXB0XG4gXG4gdG9vbHMvY3J5cHRvL3RjcnlwdC90Y3J5cHRfc3BlZWRfY29tcGFyZS5weSBcXFxuICAgICAke3NlcV9udW19X2Jhc2VfZG1lc2cubG9nIFxcXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTQgMDM6MzU8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVtb3ZlcyB0aGUgcGNyeXB0IHBhcmFsbGVsIGNyeXB0byBlbmdpbmUgYW5kIHRoZSBhc3NvY2lhdGVkIHNlcmlhbGl6ZWQgam9iIHN1cHBvcnQgZnJvbSBwYWRhdGEuIEl0IGlzIGEgcHVyZSBjbGVhbnVwL3JlbW92YWwgcGF0Y2ggYW5kIGRvZXMgbm90IGludHJvZHVjZSBhbnkgbmV3IGZ1bmN0aW9uYWwgY29kZSBvciBsb2dpYyB0aGF0IHJlcXVpcmVzIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdAogICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksCiAgIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBjYzM5NGNjOWNlMWRjY2M0MTViYzhmYzY1ZmU2NTY3YWE4Yzc1MzQ0CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFR1ZSBKdWwgMTQgMDM6MzU6MTIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3BhZGF0YS5yc3QgYi9Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3BhZGF0YS5yc3QKaW5kZXggMDViNzNjNmMxMDVmMDQuLmQ3ZGM3ZTMzMDU0ZGJkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3BhZGF0YS5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9wYWRhdGEucnN0CkBAIC03LDE1MiAmIzQzOzcsMTEgQEAgVGhlIHBhZGF0YSBwYXJhbGxlbCBleGVjdXRpb24gbWVjaGFuaXNtCiA6RGF0ZTogTWF5IDIwMjAKIAogUGFkYXRhIGlzIGEgbWVjaGFuaXNtIGJ5IHdoaWNoIHRoZSBrZXJuZWwgY2FuIGZhcm0gam9icyBvdXQgdG8gYmUgZG9uZSBpbgotcGFyYWxsZWwgb24gbXVsdGlwbGUgQ1BVcyB3aGlsZSBvcHRpb25hbGx5IHJldGFpbmluZyB0aGVpciBvcmRlcmluZy4KJiM0MztwYXJhbGxlbCBvbiBtdWx0aXBsZSBDUFVzIHdoaWxlIGNvb3JkaW5hdGluZyBiZXR3ZWVuIHRocmVhZHMuCiAKLUl0IHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCBmb3IgSVBzZWMsIHdoaWNoIG5lZWRzIHRvIHBlcmZvcm0gZW5jcnlwdGlvbiBhbmQKLWRlY3J5cHRpb24gb24gbGFyZ2UgbnVtYmVycyBvZiBwYWNrZXRzIHdpdGhvdXQgcmVvcmRlcmluZyB0aG9zZSBwYWNrZXRzLiAgVGhpcwotaXMgY3VycmVudGx5IHRoZSBzb2xlIGNvbnN1bWVyIG9mIHBhZGF0YSYjMzk7cyBzZXJpYWxpemVkIGpvYiBzdXBwb3J0LgotCi1QYWRhdGEgYWxzbyBzdXBwb3J0cyBtdWx0aXRocmVhZGVkIGpvYnMsIHNwbGl0dGluZyB1cCB0aGUgam9iIGV2ZW5seSB3aGlsZSBsb2FkCiYjNDM7UGFkYXRhIHN1cHBvcnRzIG11bHRpdGhyZWFkZWQgam9icywgc3BsaXR0aW5nIHVwIHRoZSBqb2IgZXZlbmx5IHdoaWxlIGxvYWQKIGJhbGFuY2luZyBhbmQgY29vcmRpbmF0aW5nIGJldHdlZW4gdGhyZWFkcy4KIAotUnVubmluZyBTZXJpYWxpemVkIEpvYnMKLT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUluaXRpYWxpemluZwotLS0tLS0tLS0tLS0tCi0KLVRoZSBmaXJzdCBzdGVwIGluIHVzaW5nIHBhZGF0YSB0byBydW4gc2VyaWFsaXplZCBqb2JzIGlzIHRvIHNldCB1cCBhCi1wYWRhdGFfaW5zdGFuY2Ugc3RydWN0dXJlIGZvciBvdmVyYWxsIGNvbnRyb2wgb2YgaG93IGpvYnMgYXJlIHRvIGJlIHJ1bjo6Ci0KLSAgICAjaW5jbHVkZSAmbHQ7bGludXgvcGFkYXRhLmgmZ3Q7Ci0KLSAgICBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwYWRhdGFfYWxsb2MoY29uc3QgY2hhciAqbmFtZSk7Ci0KLSYjMzk7bmFtZSYjMzk7IHNpbXBseSBpZGVudGlmaWVzIHRoZSBpbnN0YW5jZS4KLQotVGhlbiwgY29tcGxldGUgcGFkYXRhIGluaXRpYWxpemF0aW9uIGJ5IGFsbG9jYXRpbmcgYSBwYWRhdGFfc2hlbGw6OgotCi0gICBzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwYWRhdGFfYWxsb2Nfc2hlbGwoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpOwotCi1BIHBhZGF0YV9zaGVsbCBpcyB1c2VkIHRvIHN1Ym1pdCBhIGpvYiB0byBwYWRhdGEgYW5kIGFsbG93cyBhIHNlcmllcyBvZiBzdWNoCi1qb2JzIHRvIGJlIHNlcmlhbGl6ZWQgaW5kZXBlbmRlbnRseS4gIEEgcGFkYXRhX2luc3RhbmNlIG1heSBoYXZlIG9uZSBvciBtb3JlCi1wYWRhdGFfc2hlbGxzIGFzc29jaWF0ZWQgd2l0aCBpdCwgZWFjaCBhbGxvd2luZyBhIHNlcGFyYXRlIHNlcmllcyBvZiBqb2JzLgotCi1Nb2RpZnlpbmcgY3B1bWFza3MKLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgQ1BVcyB1c2VkIHRvIHJ1biBqb2JzIGNhbiBiZSBjaGFuZ2VkIGluIHR3byB3YXlzLCBwcm9ncmFtbWF0aWNhbGx5IHdpdGgKLXBhZGF0YV9zZXRfY3B1bWFzaygpIG9yIHZpYSBzeXNmcy4gIFRoZSBmb3JtZXIgaXMgZGVmaW5lZDo6Ci0KLSAgICBpbnQgcGFkYXRhX3NldF9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgY3B1bWFza190eXBlLAotCQkJICAgY3B1bWFza192YXJfdCBjcHVtYXNrKTsKLQotSGVyZSBjcHVtYXNrX3R5cGUgaXMgb25lIG9mIFBBREFUQV9DUFVfUEFSQUxMRUwgb3IgUEFEQVRBX0NQVV9TRVJJQUwsIHdoZXJlIGEKLXBhcmFsbGVsIGNwdW1hc2sgZGVzY3JpYmVzIHdoaWNoIHByb2Nlc3NvcnMgd2lsbCBiZSB1c2VkIHRvIGV4ZWN1dGUgam9icwotc3VibWl0dGVkIHRvIHRoaXMgaW5zdGFuY2UgaW4gcGFyYWxsZWwgYW5kIGEgc2VyaWFsIGNwdW1hc2sgZGVmaW5lcyB3aGljaAotcHJvY2Vzc29ycyBhcmUgYWxsb3dlZCB0byBiZSB1c2VkIGFzIHRoZSBzZXJpYWxpemF0aW9uIGNhbGxiYWNrIHByb2Nlc3Nvci4KLWNwdW1hc2sgc3BlY2lmaWVzIHRoZSBuZXcgY3B1bWFzayB0byB1c2UuCi0KLVRoZXJlIG1heSBiZSBzeXNmcyBmaWxlcyBmb3IgYW4gaW5zdGFuY2UmIzM5O3MgY3B1bWFza3MuICBGb3IgZXhhbXBsZSwgcGNyeXB0JiMzOTtzCi1saXZlIGluIC9zeXMva2VybmVsL3BjcnlwdC8mbHQ7aW5zdGFuY2UtbmFtZSZndDsuICBXaXRoaW4gYW4gaW5zdGFuY2UmIzM5O3MgZGlyZWN0b3J5Ci10aGVyZSBhcmUgdHdvIGZpbGVzLCBwYXJhbGxlbF9jcHVtYXNrIGFuZCBzZXJpYWxfY3B1bWFzaywgYW5kIGVpdGhlciBjcHVtYXNrCi1tYXkgYmUgY2hhbmdlZCBieSBlY2hvaW5nIGEgYml0bWFzayBpbnRvIHRoZSBmaWxlLCBmb3IgZXhhbXBsZTo6Ci0KLSAgICBlY2hvIGYgJmd0OyAvc3lzL2tlcm5lbC9wY3J5cHQvcGVuY3J5cHQvcGFyYWxsZWxfY3B1bWFzawotCi1SZWFkaW5nIG9uZSBvZiB0aGVzZSBmaWxlcyBzaG93cyB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrLCB3aGljaCBtYXkgYmUKLWRpZmZlcmVudCBmcm9tIHRoZSAmIzM5O3VzYWJsZSYjMzk7IGNwdW1hc2suCi0KLVBhZGF0YSBtYWludGFpbnMgdHdvIHBhaXJzIG9mIGNwdW1hc2tzIGludGVybmFsbHksIHRoZSB1c2VyLXN1cHBsaWVkIGNwdW1hc2tzCi1hbmQgdGhlICYjMzk7dXNhYmxlJiMzOTsgY3B1bWFza3MuICAoRWFjaCBwYWlyIGNvbnNpc3RzIG9mIGEgcGFyYWxsZWwgYW5kIGEgc2VyaWFsCi1jcHVtYXNrLikgIFRoZSB1c2VyLXN1cHBsaWVkIGNwdW1hc2tzIGRlZmF1bHQgdG8gYWxsIHBvc3NpYmxlIENQVXMgb24gaW5zdGFuY2UKLWFsbG9jYXRpb24gYW5kIG1heSBiZSBjaGFuZ2VkIGFzIGFib3ZlLiAgVGhlIHVzYWJsZSBjcHVtYXNrcyBhcmUgYWx3YXlzIGEKLXN1YnNldCBvZiB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrcyBhbmQgY29udGFpbiBvbmx5IHRoZSBvbmxpbmUgQ1BVcyBpbiB0aGUKLXVzZXItc3VwcGxpZWQgbWFza3M7IHRoZXNlIGFyZSB0aGUgY3B1bWFza3MgcGFkYXRhIGFjdHVhbGx5IHVzZXMuICBTbyBpdCBpcwotbGVnYWwgdG8gc3VwcGx5IGEgY3B1bWFzayB0byBwYWRhdGEgdGhhdCBjb250YWlucyBvZmZsaW5lIENQVXMuICBPbmNlIGFuCi1vZmZsaW5lIENQVSBpbiB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrIGNvbWVzIG9ubGluZSwgcGFkYXRhIGlzIGdvaW5nIHRvIHVzZQotaXQuCi0KLUNoYW5naW5nIHRoZSBDUFUgbWFza3MgYXJlIGV4cGVuc2l2ZSBvcGVyYXRpb25zLCBzbyBpdCBzaG91bGQgbm90IGJlIGRvbmUgd2l0aAotZ3JlYXQgZnJlcXVlbmN5LgotCi1SdW5uaW5nIEEgSm9iCi0tLS0tLS0tLS0tLS0tCi0KLUFjdHVhbGx5IHN1Ym1pdHRpbmcgd29yayB0byB0aGUgcGFkYXRhIGluc3RhbmNlIHJlcXVpcmVzIHRoZSBjcmVhdGlvbiBvZiBhCi1wYWRhdGFfcHJpdiBzdHJ1Y3R1cmUsIHdoaWNoIHJlcHJlc2VudHMgb25lIGpvYjo6Ci0KLSAgICBzdHJ1Y3QgcGFkYXRhX3ByaXYgewotICAgICAgICAvKiBPdGhlciBzdHVmZiBoZXJlLi4uICovCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgKCpwYXJhbGxlbCkoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICgqc2VyaWFsKShzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSk7Ci0gICAgfTsKLQotVGhpcyBzdHJ1Y3R1cmUgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGVtYmVkZGVkIHdpdGhpbiBzb21lIGxhcmdlcgotc3RydWN0dXJlIHNwZWNpZmljIHRvIHRoZSB3b3JrIHRvIGJlIGRvbmUuICBNb3N0IG9mIGl0cyBmaWVsZHMgYXJlIHByaXZhdGUgdG8KLXBhZGF0YSwgYnV0IHRoZSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIHplcm9lZCBhdCBpbml0aWFsaXNhdGlvbiB0aW1lLCBhbmQgdGhlCi1wYXJhbGxlbCgpIGFuZCBzZXJpYWwoKSBmdW5jdGlvbnMgc2hvdWxkIGJlIHByb3ZpZGVkLiAgVGhvc2UgZnVuY3Rpb25zIHdpbGwKLWJlIGNhbGxlZCBpbiB0aGUgcHJvY2VzcyBvZiBnZXR0aW5nIHRoZSB3b3JrIGRvbmUgYXMgd2Ugd2lsbCBzZWUKLW1vbWVudGFyaWx5LgotCi1UaGUgc3VibWlzc2lvbiBvZiB0aGUgam9iIGlzIGRvbmUgd2l0aDo6Ci0KLSAgICBpbnQgcGFkYXRhX2RvX3BhcmFsbGVsKHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzLAotCQkgICAgICAgICAgIHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhLCBpbnQgKmNiX2NwdSk7Ci0KLVRoZSBwcyBhbmQgcGFkYXRhIHN0cnVjdHVyZXMgbXVzdCBiZSBzZXQgdXAgYXMgZGVzY3JpYmVkIGFib3ZlOyBjYl9jcHUKLXBvaW50cyB0byB0aGUgcHJlZmVycmVkIENQVSB0byBiZSB1c2VkIGZvciB0aGUgZmluYWwgY2FsbGJhY2sgd2hlbiB0aGUgam9iIGlzCi1kb25lOyBpdCBtdXN0IGJlIGluIHRoZSBjdXJyZW50IGluc3RhbmNlJiMzOTtzIENQVSBtYXNrIChpZiBub3QgdGhlIGNiX2NwdSBwb2ludGVyCi1pcyB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBDUFUgYWN0dWFsbHkgY2hvc2VuKS4gIFRoZSByZXR1cm4gdmFsdWUgZnJvbQotcGFkYXRhX2RvX3BhcmFsbGVsKCkgaXMgemVybyBvbiBzdWNjZXNzLCBpbmRpY2F0aW5nIHRoYXQgdGhlIGpvYiBpcyBpbgotcHJvZ3Jlc3MuIC1FQlVTWSBtZWFucyB0aGF0IHNvbWVib2R5LCBzb21ld2hlcmUgZWxzZSBpcyBtZXNzaW5nIHdpdGggdGhlCi1pbnN0YW5jZSYjMzk7cyBDUFUgbWFzaywgd2hpbGUgLUVJTlZBTCBpcyBhIGNvbXBsYWludCBhYm91dCBjYl9jcHUgbm90IGJlaW5nIGluIHRoZQotc2VyaWFsIGNwdW1hc2ssIG5vIG9ubGluZSBDUFVzIGluIHRoZSBwYXJhbGxlbCBvciBzZXJpYWwgY3B1bWFza3MsIG9yIGEgc3RvcHBlZAotaW5zdGFuY2UuCi0KLUVhY2ggam9iIHN1Ym1pdHRlZCB0byBwYWRhdGFfZG9fcGFyYWxsZWwoKSB3aWxsLCBpbiB0dXJuLCBiZSBwYXNzZWQgdG8KLWV4YWN0bHkgb25lIGNhbGwgdG8gdGhlIGFib3ZlLW1lbnRpb25lZCBwYXJhbGxlbCgpIGZ1bmN0aW9uLCBvbiBvbmUgQ1BVLCBzbwotdHJ1ZSBwYXJhbGxlbGlzbSBpcyBhY2hpZXZlZCBieSBzdWJtaXR0aW5nIG11bHRpcGxlIGpvYnMuICBwYXJhbGxlbCgpIHJ1bnMgd2l0aAotc29mdHdhcmUgaW50ZXJydXB0cyBkaXNhYmxlZCBhbmQgdGh1cyBjYW5ub3Qgc2xlZXAuICBUaGUgcGFyYWxsZWwoKQotZnVuY3Rpb24gZ2V0cyB0aGUgcGFkYXRhX3ByaXYgc3RydWN0dXJlIHBvaW50ZXIgYXMgaXRzIGxvbmUgcGFyYW1ldGVyOwotaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjdHVhbCB3b3JrIHRvIGJlIGRvbmUgaXMgcHJvYmFibHkgb2J0YWluZWQgYnkgdXNpbmcKLWNvbnRhaW5lcl9vZigpIHRvIGZpbmQgdGhlIGVuY2xvc2luZyBzdHJ1Y3R1cmUuCi0KLU5vdGUgdGhhdCBwYXJhbGxlbCgpIGhhcyBubyByZXR1cm4gdmFsdWU7IHRoZSBwYWRhdGEgc3Vic3lzdGVtIGFzc3VtZXMgdGhhdAotcGFyYWxsZWwoKSB3aWxsIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBqb2IgZnJvbSB0aGlzIHBvaW50LiAgVGhlIGpvYgotbmVlZCBub3QgYmUgY29tcGxldGVkIGR1cmluZyB0aGlzIGNhbGwsIGJ1dCwgaWYgcGFyYWxsZWwoKSBsZWF2ZXMgd29yawotb3V0c3RhbmRpbmcsIGl0IHNob3VsZCBiZSBwcmVwYXJlZCB0byBiZSBjYWxsZWQgYWdhaW4gd2l0aCBhIG5ldyBqb2IgYmVmb3JlCi10aGUgcHJldmlvdXMgb25lIGNvbXBsZXRlcy4KLQotU2VyaWFsaXppbmcgSm9icwotLS0tLS0tLS0tLS0tLS0tLQotCi1XaGVuIGEgam9iIGRvZXMgY29tcGxldGUsIHBhcmFsbGVsKCkgKG9yIHdoYXRldmVyIGZ1bmN0aW9uIGFjdHVhbGx5IGZpbmlzaGVzCi10aGUgd29yaykgc2hvdWxkIGluZm9ybSBwYWRhdGEgb2YgdGhlIGZhY3Qgd2l0aCBhIGNhbGwgdG86OgotCi0gICAgdm9pZCBwYWRhdGFfZG9fc2VyaWFsKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTsKLQotQXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLCBwYWRhdGFfZG9fc2VyaWFsKCkgd2lsbCB0cmlnZ2VyIGEgY2FsbCB0byB0aGUKLXNlcmlhbCgpIGZ1bmN0aW9uIGluIHRoZSBwYWRhdGFfcHJpdiBzdHJ1Y3R1cmUuICBUaGF0IGNhbGwgd2lsbCBoYXBwZW4gb24KLXRoZSBDUFUgcmVxdWVzdGVkIGluIHRoZSBpbml0aWFsIGNhbGwgdG8gcGFkYXRhX2RvX3BhcmFsbGVsKCk7IGl0LCB0b28sIGlzCi1ydW4gd2l0aCBsb2NhbCBzb2Z0d2FyZSBpbnRlcnJ1cHRzIGRpc2FibGVkLgotTm90ZSB0aGF0IHRoaXMgY2FsbCBtYXkgYmUgZGVmZXJyZWQgZm9yIGEgd2hpbGUgc2luY2UgdGhlIHBhZGF0YSBjb2RlIHRha2VzCi1wYWlucyB0byBlbnN1cmUgdGhhdCBqb2JzIGFyZSBjb21wbGV0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZQotc3VibWl0dGVkLgotCi1EZXN0cm95aW5nCi0tLS0tLS0tLS0tCi0KLUNsZWFuaW5nIHVwIGEgcGFkYXRhIGluc3RhbmNlIHByZWRpY3RhYmx5IGludm9sdmVzIGNhbGxpbmcgdGhlIHR3byBmcmVlCi1mdW5jdGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBhbGxvY2F0aW9uIGluIHJldmVyc2U6OgotCi0gICAgdm9pZCBwYWRhdGFfZnJlZV9zaGVsbChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcyk7Ci0gICAgdm9pZCBwYWRhdGFfZnJlZShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCk7Ci0KLUl0IGlzIHRoZSB1c2VyJiMzOTtzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSBhbGwgb3V0c3RhbmRpbmcgam9icyBhcmUgY29tcGxldGUKLWJlZm9yZSBhbnkgb2YgdGhlIGFib3ZlIGFyZSBjYWxsZWQuCi0KIFJ1bm5pbmcgTXVsdGl0aHJlYWRlZCBKb2JzCiA9PT09PT09PT09PT09PT09PT09PT09PT09PQogCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDgwNmJkMmQ4MGQxNTM1Li4yNjBiM2JkYzc2MTQ4YyAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKJiM0MzsmIzQzOyYjNDM7IGIvTUFJTlRBSU5FUlMKQEAgLTIxMDg1LDEzICYjNDM7MjEwODUsNiBAQCBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvcGNuZXQzMi5jCiAKLVBDUllQVCBQQVJBTExFTCBDUllQVE8gRU5HSU5FCi1NOglTdGVmZmVuIEtsYXNzZXJ0ICZsdDtzdGVmZmVuLmtsYXNzZXJ0QHNlY3VuZXQuY29tJmd0OwotTDoJbGludXgtY3J5cHRvQHZnZXIua2VybmVsLm9yZwotUzoJTWFpbnRhaW5lZAotRjoJY3J5cHRvL3BjcnlwdC5jCi1GOglpbmNsdWRlL2NyeXB0by9wY3J5cHQuaAotCiBQRFMgRFNDIFZJUlRJTyBEQVRBIFBBVEggQUNDRUxFUkFUT1IKIFI6CUJyZXR0IENyZWVsZXkgJmx0O2JyZXR0LmNyZWVsZXlAYW1kLmNvbSZndDsKIEY6CWRyaXZlcnMvdmRwYS9wZHMvCmRpZmYgLS1naXQgYS9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uMzJfZGVmY29uZmlnIGIvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjMyX2RlZmNvbmZpZwppbmRleCA3YzhmMDE1MTNlZDI3Yy4uY2Y5N2Y0NDkzNTczNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbG9vbmdhcmNoL2NvbmZpZ3MvbG9vbmdzb24zMl9kZWZjb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjMyX2RlZmNvbmZpZwpAQCAtMTA2Myw3ICYjNDM7MTA2Myw2IEBAIENPTkZJR19TRUNVUklUWV9ZQU1BPXkKIENPTkZJR19ERUZBVUxUX1NFQ1VSSVRZX0RBQz15CiBDT05GSUdfQ1JZUFRPX1VTRVI9bQogQ09ORklHX0NSWVBUT19TRUxGVEVTVFM9eQotQ09ORklHX0NSWVBUT19QQ1JZUFQ9bQogQ09ORklHX0NSWVBUT19DUllQVEQ9bQogQ09ORklHX0NSWVBUT19BTlVCSVM9bQogQ09ORklHX0NSWVBUT19CTE9XRklTSD1tCmRpZmYgLS1naXQgYS9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uNjRfZGVmY29uZmlnIGIvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjY0X2RlZmNvbmZpZwppbmRleCA4ZTM5MDZkM2JkNzBjYS4uZDBlY2U3OTIwZjIxNTggMTAwNjQ0Ci0tLSBhL2FyY2gvbG9vbmdhcmNoL2NvbmZpZ3MvbG9vbmdzb242NF9kZWZjb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjY0X2RlZmNvbmZpZwpAQCAtMTA5Niw3ICYjNDM7MTA5Niw2IEBAIENPTkZJR19TRUNVUklUWV9ZQU1BPXkKIENPTkZJR19ERUZBVUxUX1NFQ1VSSVRZX0RBQz15CiBDT05GSUdfQ1JZUFRPX1VTRVI9bQogQ09ORklHX0NSWVBUT19TRUxGVEVTVFM9eQotQ09ORklHX0NSWVBUT19QQ1JZUFQ9bQogQ09ORklHX0NSWVBUT19DUllQVEQ9bQogQ09ORklHX0NSWVBUT19BTlVCSVM9bQogQ09ORklHX0NSWVBUT19CTE9XRklTSD1tCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY29uZmlncy9kZWJ1Z19kZWZjb25maWcgYi9hcmNoL3MzOTAvY29uZmlncy9kZWJ1Z19kZWZjb25maWcKaW5kZXggNTQ2MzdiZTg3ZmI3MzUuLjE1ZjUxY2I5MjRkYmYwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY29uZmlncy9kZWJ1Z19kZWZjb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9zMzkwL2NvbmZpZ3MvZGVidWdfZGVmY29uZmlnCkBAIC03NjUsNyAmIzQzOzc2NSw2IEBAIENPTkZJR19DUllQVE9fVVNFUj1tCiBDT05GSUdfQ1JZUFRPX1NFTEZURVNUUz15CiBDT05GSUdfQ1JZUFRPX1NFTEZURVNUU19GVUxMPXkKIENPTkZJR19DUllQVE9fTlVMTD15Ci1DT05GSUdfQ1JZUFRPX1BDUllQVD1tCiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tCiBDT05GSUdfQ1JZUFRPX0JFTkNITUFSSz1tCiBDT05GSUdfQ1JZUFRPX0RIPW0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jb25maWdzL2RlZmNvbmZpZyBiL2FyY2gvczM5MC9jb25maWdzL2RlZmNvbmZpZwppbmRleCA1ZjUxMTRhMjUzY2Y3Yy4uODgyNTdmZjNjMmM2YWEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jb25maWdzL2RlZmNvbmZpZwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3MzOTAvY29uZmlncy9kZWZjb25maWcKQEAgLTc0OSw3ICYjNDM7NzQ5LDYgQEAgQ09ORklHX0NSWVBUT19GSVBTPXkKIENPTkZJR19DUllQVE9fVVNFUj1tCiBDT05GSUdfQ1JZUFRPX1NFTEZURVNUUz15CiBDT05GSUdfQ1JZUFRPX05VTEw9eQotQ09ORklHX0NSWVBUT19QQ1JZUFQ9bQogQ09ORklHX0NSWVBUT19DUllQVEQ9bQogQ09ORklHX0NSWVBUT19CRU5DSE1BUks9bQogQ09ORklHX0NSWVBUT19ESD1tCmRpZmYgLS1naXQgYS9jcnlwdG8vS2NvbmZpZyBiL2NyeXB0by9LY29uZmlnCmluZGV4IGYxZTM3MjE5NTI3MzE2Li4yMjhhN2FjOWYwNjNhMiAxMDA2NDQKLS0tIGEvY3J5cHRvL0tjb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvY3J5cHRvL0tjb25maWcKQEAgLTIwMSwxNiAmIzQzOzIwMSw2IEBAIGNvbmZpZyBDUllQVE9fTlVMTAogCWhlbHAKIAkgIFRoZXNlIGFyZSAmIzM5O051bGwmIzM5OyBhbGdvcml0aG1zLCB1c2VkIGJ5IElQc2VjLCB3aGljaCBkbyBub3RoaW5nLgogCi1jb25maWcgQ1JZUFRPX1BDUllQVAotCXRyaXN0YXRlICYjMzQ7UGFyYWxsZWwgY3J5cHRvIGVuZ2luZSYjMzQ7Ci0JZGVwZW5kcyBvbiBTTVAKLQlzZWxlY3QgUEFEQVRBCi0Jc2VsZWN0IENSWVBUT19NQU5BR0VSCi0Jc2VsZWN0IENSWVBUT19BRUFECi0JaGVscAotCSAgVGhpcyBjb252ZXJ0cyBhbiBhcmJpdHJhcnkgY3J5cHRvIGFsZ29yaXRobSBpbnRvIGEgcGFyYWxsZWwKLQkgIGFsZ29yaXRobSB0aGF0IGV4ZWN1dGVzIGluIGtlcm5lbCB0aHJlYWRzLgotCiBjb25maWcgQ1JZUFRPX0NSWVBURAogCXRyaXN0YXRlICYjMzQ7U29mdHdhcmUgYXN5bmMgY3J5cHRvIGRhZW1vbiYjMzQ7CiAJc2VsZWN0IENSWVBUT19BRUFECmRpZmYgLS1naXQgYS9jcnlwdG8vTWFrZWZpbGUgYi9jcnlwdG8vTWFrZWZpbGUKaW5kZXggODM4NmQ1NWE5NzU1ZTcuLjJlNDg3Yzk0NmU2M2Q3IDEwMDY0NAotLS0gYS9jcnlwdG8vTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvY3J5cHRvL01ha2VmaWxlCkBAIC0xMjAsNyAmIzQzOzEyMCw2IEBAIENGTEFHU19hZWdpczEyOC1uZW9uLWlubmVyLm8gJiM0Mzs9ICQoYWVnaXMxMjgtY2ZsYWdzLXkpCiBhZWdpczEyOC0kKENPTkZJR19DUllQVE9fQUVHSVMxMjhfU0lNRCkgJiM0Mzs9IGFlZ2lzMTI4LW5lb24ubyBhZWdpczEyOC1uZW9uLWlubmVyLm8KIGVuZGlmCiAKLW9iai0kKENPTkZJR19DUllQVE9fUENSWVBUKSAmIzQzOz0gcGNyeXB0Lm8KIG9iai0kKENPTkZJR19DUllQVE9fQ1JZUFREKSAmIzQzOz0gY3J5cHRkLm8KIG9iai0kKENPTkZJR19DUllQVE9fREVTKSAmIzQzOz0gZGVzX2dlbmVyaWMubwogb2JqLSQoQ09ORklHX0NSWVBUT19CTE9XRklTSCkgJiM0Mzs9IGJsb3dmaXNoX2dlbmVyaWMubwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3BjcnlwdC5jIGIvY3J5cHRvL3BjcnlwdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjM3MjQ0Mjk4MWU2NS4uMDAwMDAwMDAwMDAwMDAKLS0tIGEvY3J5cHRvL3BjcnlwdC5jCiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGwKQEAgLTEsMzk0ICYjNDM7MCwwIEBACi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Ci0vKgotICogcGNyeXB0IC0gUGFyYWxsZWwgY3J5cHRvIHdyYXBwZXIuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5IHNlY3VuZXQgU2VjdXJpdHkgTmV0d29ya3MgQUcKLSAqIENvcHlyaWdodCAoQykgMjAwOSBTdGVmZmVuIEtsYXNzZXJ0ICZsdDtzdGVmZmVuLmtsYXNzZXJ0QHNlY3VuZXQuY29tJmd0OwotICovCi0KLSNpbmNsdWRlICZsdDtjcnlwdG8vYWxnYXBpLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7Y3J5cHRvL2ludGVybmFsL2FlYWQuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9hdG9taWMuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9lcnIuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9pbml0LmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvbW9kdWxlLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvc2xhYi5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2tvYmplY3QuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9jcHUuaCZndDsKLSNpbmNsdWRlICZsdDtjcnlwdG8vcGNyeXB0LmgmZ3Q7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwZW5jcnlwdDsKLXN0YXRpYyBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwZGVjcnlwdDsKLXN0YXRpYyBzdHJ1Y3Qga3NldCAgICAgICAgICAgKnBjcnlwdF9rc2V0OwotCi1zdHJ1Y3QgcGNyeXB0X2luc3RhbmNlX2N0eCB7Ci0Jc3RydWN0IGNyeXB0b19hZWFkX3NwYXduIHNwYXduOwotCXN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzZW5jOwotCXN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzZGVjOwotCWF0b21pY190IHRmbV9jb3VudDsKLX07Ci0KLXN0cnVjdCBwY3J5cHRfYWVhZF9jdHggewotCXN0cnVjdCBjcnlwdG9fYWVhZCAqY2hpbGQ7Ci0JdW5zaWduZWQgaW50IGNiX2NwdTsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHBjcnlwdF9pbnN0YW5jZV9jdHggKnBjcnlwdF90Zm1faWN0eCgKLQlzdHJ1Y3QgY3J5cHRvX2FlYWQgKnRmbSkKLXsKLQlyZXR1cm4gYWVhZF9pbnN0YW5jZV9jdHgoYWVhZF9hbGdfaW5zdGFuY2UodGZtKSk7Ci19Ci0KLXN0YXRpYyBpbnQgcGNyeXB0X2FlYWRfc2V0a2V5KHN0cnVjdCBjcnlwdG9fYWVhZCAqcGFyZW50LAotCQkJICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKLXsKLQlzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgocGFyZW50KTsKLQotCXJldHVybiBjcnlwdG9fYWVhZF9zZXRrZXkoY3R4LSZndDtjaGlsZCwga2V5LCBrZXlsZW4pOwotfQotCi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX3NldGF1dGhzaXplKHN0cnVjdCBjcnlwdG9fYWVhZCAqcGFyZW50LAotCQkJCSAgIHVuc2lnbmVkIGludCBhdXRoc2l6ZSkKLXsKLQlzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgocGFyZW50KTsKLQotCXJldHVybiBjcnlwdG9fYWVhZF9zZXRhdXRoc2l6ZShjdHgtJmd0O2NoaWxkLCBhdXRoc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjcnlwdF9hZWFkX3NlcmlhbChzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSkKLXsKLQlzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnByZXEgPSBwY3J5cHRfcGFkYXRhX3JlcXVlc3QocGFkYXRhKTsKLQlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBwY3J5cHRfcmVxdWVzdF9jdHgocHJlcSk7Ci0KLQlhZWFkX3JlcXVlc3RfY29tcGxldGUocmVxLSZndDtiYXNlLmRhdGEsIHBhZGF0YS0mZ3Q7aW5mbyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjcnlwdF9hZWFkX2RvbmUodm9pZCAqZGF0YSwgaW50IGVycikKLXsKLQlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBkYXRhOwotCXN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IGFlYWRfcmVxdWVzdF9jdHgocmVxKTsKLQlzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSA9IHBjcnlwdF9yZXF1ZXN0X3BhZGF0YShwcmVxKTsKLQotCWlmIChlcnIgPT0gLUVJTlBST0dSRVNTKQotCQlyZXR1cm47Ci0KLQlwYWRhdGEtJmd0O2luZm8gPSBlcnI7Ci0KLQlwYWRhdGFfZG9fc2VyaWFsKHBhZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjcnlwdF9hZWFkX2VuYyhzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSkKLXsKLQlzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnByZXEgPSBwY3J5cHRfcGFkYXRhX3JlcXVlc3QocGFkYXRhKTsKLQlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBwY3J5cHRfcmVxdWVzdF9jdHgocHJlcSk7Ci0JaW50IHJldDsKLQotCXJldCA9IGNyeXB0b19hZWFkX2VuY3J5cHQocmVxKTsKLQotCWlmIChyZXQgPT0gLUVJTlBST0dSRVNTIHx8IHJldCA9PSAtRUJVU1kpCi0JCXJldHVybjsKLQotCXBhZGF0YS0mZ3Q7aW5mbyA9IHJldDsKLQlwYWRhdGFfZG9fc2VyaWFsKHBhZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgcGNyeXB0X2FlYWRfZW5jcnlwdChzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnByZXEgPSBhZWFkX3JlcXVlc3RfY3R4KHJlcSk7Ci0Jc3RydWN0IGFlYWRfcmVxdWVzdCAqY3JlcSA9IHBjcnlwdF9yZXF1ZXN0X2N0eChwcmVxKTsKLQlzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSA9IHBjcnlwdF9yZXF1ZXN0X3BhZGF0YShwcmVxKTsKLQlzdHJ1Y3QgY3J5cHRvX2FlYWQgKmFlYWQgPSBjcnlwdG9fYWVhZF9yZXF0Zm0ocmVxKTsKLQlzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgoYWVhZCk7Ci0JdTMyIGZsYWdzID0gYWVhZF9yZXF1ZXN0X2ZsYWdzKHJlcSk7Ci0Jc3RydWN0IHBjcnlwdF9pbnN0YW5jZV9jdHggKmljdHg7Ci0KLQlpY3R4ID0gcGNyeXB0X3RmbV9pY3R4KGFlYWQpOwotCi0JbWVtc2V0KHBhZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBwYWRhdGFfcHJpdikpOwotCi0JcGFkYXRhLSZndDtwYXJhbGxlbCA9IHBjcnlwdF9hZWFkX2VuYzsKLQlwYWRhdGEtJmd0O3NlcmlhbCA9IHBjcnlwdF9hZWFkX3NlcmlhbDsKLQotCWFlYWRfcmVxdWVzdF9zZXRfdGZtKGNyZXEsIGN0eC0mZ3Q7Y2hpbGQpOwotCWFlYWRfcmVxdWVzdF9zZXRfY2FsbGJhY2soY3JlcSwgZmxhZ3MgJmFtcDsgfkNSWVBUT19URk1fUkVRX01BWV9TTEVFUCwKLQkJCQkgIHBjcnlwdF9hZWFkX2RvbmUsIHJlcSk7Ci0JYWVhZF9yZXF1ZXN0X3NldF9jcnlwdChjcmVxLCByZXEtJmd0O3NyYywgcmVxLSZndDtkc3QsCi0JCQkgICAgICAgcmVxLSZndDtjcnlwdGxlbiwgcmVxLSZndDtpdik7Ci0JYWVhZF9yZXF1ZXN0X3NldF9hZChjcmVxLCByZXEtJmd0O2Fzc29jbGVuKTsKLQotCWVyciA9IHBhZGF0YV9kb19wYXJhbGxlbChpY3R4LSZndDtwc2VuYywgcGFkYXRhLCAmYW1wO2N0eC0mZ3Q7Y2JfY3B1KTsKLQlpZiAoIWVycikKLQkJcmV0dXJuIC1FSU5QUk9HUkVTUzsKLQlpZiAoZXJyID09IC1FQlVTWSkgewotCQkvKiB0cnkgbm9uLXBhcmFsbGVsIG1vZGUgKi8KLQkJYWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhjcmVxLCBmbGFncywgcmVxLSZndDtiYXNlLmNvbXBsZXRlLAotCQkJCQkgIHJlcS0mZ3Q7YmFzZS5kYXRhKTsKLQkJcmV0dXJuIGNyeXB0b19hZWFkX2VuY3J5cHQoY3JlcSk7Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgcGNyeXB0X2FlYWRfZGVjKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKQotewotCXN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IHBjcnlwdF9wYWRhdGFfcmVxdWVzdChwYWRhdGEpOwotCXN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSA9IHBjcnlwdF9yZXF1ZXN0X2N0eChwcmVxKTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gY3J5cHRvX2FlYWRfZGVjcnlwdChyZXEpOwotCi0JaWYgKHJldCA9PSAtRUlOUFJPR1JFU1MgfHwgcmV0ID09IC1FQlVTWSkKLQkJcmV0dXJuOwotCi0JcGFkYXRhLSZndDtpbmZvID0gcmV0OwotCXBhZGF0YV9kb19zZXJpYWwocGFkYXRhKTsKLX0KLQotc3RhdGljIGludCBwY3J5cHRfYWVhZF9kZWNyeXB0KHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IGFlYWRfcmVxdWVzdF9jdHgocmVxKTsKLQlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpjcmVxID0gcGNyeXB0X3JlcXVlc3RfY3R4KHByZXEpOwotCXN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhID0gcGNyeXB0X3JlcXVlc3RfcGFkYXRhKHByZXEpOwotCXN0cnVjdCBjcnlwdG9fYWVhZCAqYWVhZCA9IGNyeXB0b19hZWFkX3JlcXRmbShyZXEpOwotCXN0cnVjdCBwY3J5cHRfYWVhZF9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eChhZWFkKTsKLQl1MzIgZmxhZ3MgPSBhZWFkX3JlcXVlc3RfZmxhZ3MocmVxKTsKLQlzdHJ1Y3QgcGNyeXB0X2luc3RhbmNlX2N0eCAqaWN0eDsKLQotCWljdHggPSBwY3J5cHRfdGZtX2ljdHgoYWVhZCk7Ci0KLQltZW1zZXQocGFkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHBhZGF0YV9wcml2KSk7Ci0KLQlwYWRhdGEtJmd0O3BhcmFsbGVsID0gcGNyeXB0X2FlYWRfZGVjOwotCXBhZGF0YS0mZ3Q7c2VyaWFsID0gcGNyeXB0X2FlYWRfc2VyaWFsOwotCi0JYWVhZF9yZXF1ZXN0X3NldF90Zm0oY3JlcSwgY3R4LSZndDtjaGlsZCk7Ci0JYWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhjcmVxLCBmbGFncyAmYW1wOyB+Q1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQLAotCQkJCSAgcGNyeXB0X2FlYWRfZG9uZSwgcmVxKTsKLQlhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KGNyZXEsIHJlcS0mZ3Q7c3JjLCByZXEtJmd0O2RzdCwKLQkJCSAgICAgICByZXEtJmd0O2NyeXB0bGVuLCByZXEtJmd0O2l2KTsKLQlhZWFkX3JlcXVlc3Rfc2V0X2FkKGNyZXEsIHJlcS0mZ3Q7YXNzb2NsZW4pOwotCi0JZXJyID0gcGFkYXRhX2RvX3BhcmFsbGVsKGljdHgtJmd0O3BzZGVjLCBwYWRhdGEsICZhbXA7Y3R4LSZndDtjYl9jcHUpOwotCWlmICghZXJyKQotCQlyZXR1cm4gLUVJTlBST0dSRVNTOwotCWlmIChlcnIgPT0gLUVCVVNZKSB7Ci0JCS8qIHRyeSBub24tcGFyYWxsZWwgbW9kZSAqLwotCQlhZWFkX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKGNyZXEsIGZsYWdzLCByZXEtJmd0O2Jhc2UuY29tcGxldGUsCi0JCQkJCSAgcmVxLSZndDtiYXNlLmRhdGEpOwotCQlyZXR1cm4gY3J5cHRvX2FlYWRfZGVjcnlwdChjcmVxKTsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX2luaXRfdGZtKHN0cnVjdCBjcnlwdG9fYWVhZCAqdGZtKQotewotCWludCBjcHVfaW5kZXg7Ci0Jc3RydWN0IGFlYWRfaW5zdGFuY2UgKmluc3QgPSBhZWFkX2FsZ19pbnN0YW5jZSh0Zm0pOwotCXN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4ICppY3R4ID0gYWVhZF9pbnN0YW5jZV9jdHgoaW5zdCk7Ci0Jc3RydWN0IHBjcnlwdF9hZWFkX2N0eCAqY3R4ID0gY3J5cHRvX2FlYWRfY3R4KHRmbSk7Ci0Jc3RydWN0IGNyeXB0b19hZWFkICpjaXBoZXI7Ci0KLQljcHVfaW5kZXggPSAodW5zaWduZWQgaW50KWF0b21pY19pbmNfcmV0dXJuKCZhbXA7aWN0eC0mZ3Q7dGZtX2NvdW50KSAlCi0JCSAgICBjcHVtYXNrX3dlaWdodChjcHVfb25saW5lX21hc2spOwotCi0JY3R4LSZndDtjYl9jcHUgPSBjcHVtYXNrX250aChjcHVfaW5kZXgsIGNwdV9vbmxpbmVfbWFzayk7Ci0JY2lwaGVyID0gY3J5cHRvX3NwYXduX2FlYWQoJmFtcDtpY3R4LSZndDtzcGF3bik7Ci0KLQlpZiAoSVNfRVJSKGNpcGhlcikpCi0JCXJldHVybiBQVFJfRVJSKGNpcGhlcik7Ci0KLQljdHgtJmd0O2NoaWxkID0gY2lwaGVyOwotCWNyeXB0b19hZWFkX3NldF9yZXFzaXplKHRmbSwgc2l6ZW9mKHN0cnVjdCBwY3J5cHRfcmVxdWVzdCkgJiM0MzsKLQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgYWVhZF9yZXF1ZXN0KSAmIzQzOwotCQkJCSAgICAgY3J5cHRvX2FlYWRfcmVxc2l6ZShjaXBoZXIpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwY3J5cHRfYWVhZF9leGl0X3RmbShzdHJ1Y3QgY3J5cHRvX2FlYWQgKnRmbSkKLXsKLQlzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgodGZtKTsKLQotCWNyeXB0b19mcmVlX2FlYWQoY3R4LSZndDtjaGlsZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjcnlwdF9mcmVlKHN0cnVjdCBhZWFkX2luc3RhbmNlICppbnN0KQotewotCXN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4ICpjdHggPSBhZWFkX2luc3RhbmNlX2N0eChpbnN0KTsKLQotCWNyeXB0b19kcm9wX2FlYWQoJmFtcDtjdHgtJmd0O3NwYXduKTsKLQlwYWRhdGFfZnJlZV9zaGVsbChjdHgtJmd0O3BzZGVjKTsKLQlwYWRhdGFfZnJlZV9zaGVsbChjdHgtJmd0O3BzZW5jKTsKLQlrZnJlZShpbnN0KTsKLX0KLQotc3RhdGljIGludCBwY3J5cHRfaW5pdF9pbnN0YW5jZShzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICppbnN0LAotCQkJCXN0cnVjdCBjcnlwdG9fYWxnICphbGcpCi17Ci0JaWYgKHNucHJpbnRmKGluc3QtJmd0O2FsZy5jcmFfZHJpdmVyX25hbWUsIENSWVBUT19NQVhfQUxHX05BTUUsCi0JCSAgICAgJiMzNDtwY3J5cHQoJXMpJiMzNDssIGFsZy0mZ3Q7Y3JhX2RyaXZlcl9uYW1lKSAmZ3Q7PSBDUllQVE9fTUFYX0FMR19OQU1FKQotCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKLQotCW1lbWNweShpbnN0LSZndDthbGcuY3JhX25hbWUsIGFsZy0mZ3Q7Y3JhX25hbWUsIENSWVBUT19NQVhfQUxHX05BTUUpOwotCi0JaW5zdC0mZ3Q7YWxnLmNyYV9wcmlvcml0eSA9IGFsZy0mZ3Q7Y3JhX3ByaW9yaXR5ICYjNDM7IDEwMDsKLQlpbnN0LSZndDthbGcuY3JhX2Jsb2Nrc2l6ZSA9IGFsZy0mZ3Q7Y3JhX2Jsb2Nrc2l6ZTsKLQlpbnN0LSZndDthbGcuY3JhX2FsaWdubWFzayA9IGFsZy0mZ3Q7Y3JhX2FsaWdubWFzazsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBjcnlwdF9jcmVhdGVfYWVhZChzdHJ1Y3QgY3J5cHRvX3RlbXBsYXRlICp0bXBsLCBzdHJ1Y3QgcnRhdHRyICoqdGIsCi0JCQkgICAgICBzdHJ1Y3QgY3J5cHRvX2F0dHJfdHlwZSAqYWxndCkKLXsKLQlzdHJ1Y3QgcGNyeXB0X2luc3RhbmNlX2N0eCAqY3R4OwotCXN0cnVjdCBhZWFkX2luc3RhbmNlICppbnN0OwotCXN0cnVjdCBhZWFkX2FsZyAqYWxnOwotCXUzMiBtYXNrID0gY3J5cHRvX2FsZ3RfaW5oZXJpdGVkX21hc2soYWxndCk7Ci0JaW50IGVycjsKLQotCWluc3QgPSBremFsbG9jKHNpemVvZigqaW5zdCkgJiM0Mzsgc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWluc3QpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZXJyID0gLUVOT01FTTsKLQotCWN0eCA9IGFlYWRfaW5zdGFuY2VfY3R4KGluc3QpOwotCWN0eC0mZ3Q7cHNlbmMgPSBwYWRhdGFfYWxsb2Nfc2hlbGwocGVuY3J5cHQpOwotCWlmICghY3R4LSZndDtwc2VuYykKLQkJZ290byBlcnJfZnJlZV9pbnN0OwotCi0JY3R4LSZndDtwc2RlYyA9IHBhZGF0YV9hbGxvY19zaGVsbChwZGVjcnlwdCk7Ci0JaWYgKCFjdHgtJmd0O3BzZGVjKQotCQlnb3RvIGVycl9mcmVlX2luc3Q7Ci0KLQllcnIgPSBjcnlwdG9fZ3JhYl9hZWFkKCZhbXA7Y3R4LSZndDtzcGF3biwgYWVhZF9jcnlwdG9faW5zdGFuY2UoaW5zdCksCi0JCQkgICAgICAgY3J5cHRvX2F0dHJfYWxnX25hbWUodGJbMV0pLCAwLCBtYXNrKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9mcmVlX2luc3Q7Ci0KLQlhbGcgPSBjcnlwdG9fc3Bhd25fYWVhZF9hbGcoJmFtcDtjdHgtJmd0O3NwYXduKTsKLQllcnIgPSBwY3J5cHRfaW5pdF9pbnN0YW5jZShhZWFkX2NyeXB0b19pbnN0YW5jZShpbnN0KSwgJmFtcDthbGctJmd0O2Jhc2UpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX2ZyZWVfaW5zdDsKLQotCWluc3QtJmd0O2FsZy5iYXNlLmNyYV9mbGFncyB8PSBDUllQVE9fQUxHX0FTWU5DOwotCi0JaW5zdC0mZ3Q7YWxnLml2c2l6ZSA9IGNyeXB0b19hZWFkX2FsZ19pdnNpemUoYWxnKTsKLQlpbnN0LSZndDthbGcubWF4YXV0aHNpemUgPSBjcnlwdG9fYWVhZF9hbGdfbWF4YXV0aHNpemUoYWxnKTsKLQotCWluc3QtJmd0O2FsZy5iYXNlLmNyYV9jdHhzaXplID0gc2l6ZW9mKHN0cnVjdCBwY3J5cHRfYWVhZF9jdHgpOwotCi0JaW5zdC0mZ3Q7YWxnLmluaXQgPSBwY3J5cHRfYWVhZF9pbml0X3RmbTsKLQlpbnN0LSZndDthbGcuZXhpdCA9IHBjcnlwdF9hZWFkX2V4aXRfdGZtOwotCi0JaW5zdC0mZ3Q7YWxnLnNldGtleSA9IHBjcnlwdF9hZWFkX3NldGtleTsKLQlpbnN0LSZndDthbGcuc2V0YXV0aHNpemUgPSBwY3J5cHRfYWVhZF9zZXRhdXRoc2l6ZTsKLQlpbnN0LSZndDthbGcuZW5jcnlwdCA9IHBjcnlwdF9hZWFkX2VuY3J5cHQ7Ci0JaW5zdC0mZ3Q7YWxnLmRlY3J5cHQgPSBwY3J5cHRfYWVhZF9kZWNyeXB0OwotCi0JaW5zdC0mZ3Q7ZnJlZSA9IHBjcnlwdF9mcmVlOwotCi0JZXJyID0gYWVhZF9yZWdpc3Rlcl9pbnN0YW5jZSh0bXBsLCBpbnN0KTsKLQlpZiAoZXJyKSB7Ci1lcnJfZnJlZV9pbnN0OgotCQlwY3J5cHRfZnJlZShpbnN0KTsKLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBwY3J5cHRfY3JlYXRlKHN0cnVjdCBjcnlwdG9fdGVtcGxhdGUgKnRtcGwsIHN0cnVjdCBydGF0dHIgKip0YikKLXsKLQlzdHJ1Y3QgY3J5cHRvX2F0dHJfdHlwZSAqYWxndDsKLQotCWFsZ3QgPSBjcnlwdG9fZ2V0X2F0dHJfdHlwZSh0Yik7Ci0JaWYgKElTX0VSUihhbGd0KSkKLQkJcmV0dXJuIFBUUl9FUlIoYWxndCk7Ci0KLQlzd2l0Y2ggKGFsZ3QtJmd0O3R5cGUgJmFtcDsgYWxndC0mZ3Q7bWFzayAmYW1wOyBDUllQVE9fQUxHX1RZUEVfTUFTSykgewotCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0FFQUQ6Ci0JCXJldHVybiBwY3J5cHRfY3JlYXRlX2FlYWQodG1wbCwgdGIsIGFsZ3QpOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHBjcnlwdF9zeXNmc19hZGQoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JaW50IHJldDsKLQotCXBpbnN0LSZndDtrb2JqLmtzZXQgPSBwY3J5cHRfa3NldDsKLQlyZXQgPSBrb2JqZWN0X2FkZCgmYW1wO3BpbnN0LSZndDtrb2JqLCBOVUxMLCAmIzM0OyVzJiMzNDssIG5hbWUpOwotCWlmICghcmV0KQotCQlrb2JqZWN0X3VldmVudCgmYW1wO3BpbnN0LSZndDtrb2JqLCBLT0JKX0FERCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHBjcnlwdF9pbml0X3BhZGF0YShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICoqcGluc3QsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JaW50IHJldCA9IC1FTk9NRU07Ci0KLQkqcGluc3QgPSBwYWRhdGFfYWxsb2MobmFtZSk7Ci0JaWYgKCEqcGluc3QpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBwY3J5cHRfc3lzZnNfYWRkKCpwaW5zdCwgbmFtZSk7Ci0JaWYgKHJldCkKLQkJcGFkYXRhX2ZyZWUoKnBpbnN0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY3J5cHRvX3RlbXBsYXRlIHBjcnlwdF90bXBsID0gewotCS5uYW1lID0gJiMzNDtwY3J5cHQmIzM0OywKLQkuY3JlYXRlID0gcGNyeXB0X2NyZWF0ZSwKLQkubW9kdWxlID0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBwY3J5cHRfaW5pdCh2b2lkKQotewotCWludCBlcnIgPSAtRU5PTUVNOwotCi0JcGNyeXB0X2tzZXQgPSBrc2V0X2NyZWF0ZV9hbmRfYWRkKCYjMzQ7cGNyeXB0JiMzNDssIE5VTEwsIGtlcm5lbF9rb2JqKTsKLQlpZiAoIXBjcnlwdF9rc2V0KQotCQlnb3RvIGVycjsKLQotCWVyciA9IHBjcnlwdF9pbml0X3BhZGF0YSgmYW1wO3BlbmNyeXB0LCAmIzM0O3BlbmNyeXB0JiMzNDspOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3VucmVnX2tzZXQ7Ci0KLQllcnIgPSBwY3J5cHRfaW5pdF9wYWRhdGEoJmFtcDtwZGVjcnlwdCwgJiMzNDtwZGVjcnlwdCYjMzQ7KTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9kZWluaXRfcGVuY3J5cHQ7Ci0KLQlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX3RlbXBsYXRlKCZhbXA7cGNyeXB0X3RtcGwpOwotCi1lcnJfZGVpbml0X3BlbmNyeXB0OgotCXBhZGF0YV9mcmVlKHBlbmNyeXB0KTsKLWVycl91bnJlZ19rc2V0OgotCWtzZXRfdW5yZWdpc3RlcihwY3J5cHRfa3NldCk7Ci1lcnI6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHBjcnlwdF9leGl0KHZvaWQpCi17Ci0JY3J5cHRvX3VucmVnaXN0ZXJfdGVtcGxhdGUoJmFtcDtwY3J5cHRfdG1wbCk7Ci0KLQlwYWRhdGFfZnJlZShwZW5jcnlwdCk7Ci0JcGFkYXRhX2ZyZWUocGRlY3J5cHQpOwotCi0Ja3NldF91bnJlZ2lzdGVyKHBjcnlwdF9rc2V0KTsKLX0KLQotbW9kdWxlX2luaXQocGNyeXB0X2luaXQpOwotbW9kdWxlX2V4aXQocGNyeXB0X2V4aXQpOwotCi1NT0RVTEVfTElDRU5TRSgmIzM0O0dQTCYjMzQ7KTsKLU1PRFVMRV9BVVRIT1IoJiMzNDtTdGVmZmVuIEtsYXNzZXJ0ICZsdDtzdGVmZmVuLmtsYXNzZXJ0QHNlY3VuZXQuY29tJmd0OyYjMzQ7KTsKLU1PRFVMRV9ERVNDUklQVElPTigmIzM0O1BhcmFsbGVsIGNyeXB0byB3cmFwcGVyJiMzNDspOwotTU9EVUxFX0FMSUFTX0NSWVBUTygmIzM0O3BjcnlwdCYjMzQ7KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3J5cHRvL3BjcnlwdC5oIGIvaW5jbHVkZS9jcnlwdG8vcGNyeXB0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNGQ3Y2YzY2Y1ZWFkLi4wMDAwMDAwMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NyeXB0by9wY3J5cHQuaAomIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsCkBAIC0xLDM5ICYjNDM7MCwwIEBACi0vKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovCi0vKgotICogcGNyeXB0IC0gUGFyYWxsZWwgY3J5cHRvIGVuZ2luZS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgc2VjdW5ldCBTZWN1cml0eSBOZXR3b3JrcyBBRwotICogQ29weXJpZ2h0IChDKSAyMDA5IFN0ZWZmZW4gS2xhc3NlcnQgJmx0O3N0ZWZmZW4ua2xhc3NlcnRAc2VjdW5ldC5jb20mZ3Q7Ci0gKi8KLQotI2lmbmRlZiBfQ1JZUFRPX1BDUllQVF9ICi0jZGVmaW5lIF9DUllQVE9fUENSWVBUX0gKLQotI2luY2x1ZGUgJmx0O2xpbnV4L2NvbnRhaW5lcl9vZi5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2NyeXB0by5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3BhZGF0YS5oJmd0OwotCi1zdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgewotCXN0cnVjdCBwYWRhdGFfcHJpdglwYWRhdGE7Ci0Jdm9pZAkJCSpkYXRhOwotCXZvaWQJCQkqX19jdHhbXSBDUllQVE9fTUlOQUxJR05fQVRUUjsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqcGNyeXB0X3JlcXVlc3RfY3R4KHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcmVxKQotewotCXJldHVybiByZXEtJmd0O19fY3R4OwotfQotCi1zdGF0aWMgaW5saW5lCi1zdHJ1Y3QgcGFkYXRhX3ByaXYgKnBjcnlwdF9yZXF1ZXN0X3BhZGF0YShzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnJlcSkKLXsKLQlyZXR1cm4gJmFtcDtyZXEtJmd0O3BhZGF0YTsKLX0KLQotc3RhdGljIGlubGluZQotc3RydWN0IHBjcnlwdF9yZXF1ZXN0ICpwY3J5cHRfcGFkYXRhX3JlcXVlc3Qoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihwYWRhdGEsIHN0cnVjdCBwY3J5cHRfcmVxdWVzdCwgcGFkYXRhKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oIGIvaW5jbHVkZS9saW51eC9wYWRhdGEuaAppbmRleCBiNjIzMmJlYTZlZGY1OS4uZWE0NWVhNjgwY2I3OTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGFkYXRhLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9wYWRhdGEuaApAQCAtMTIsMTEyICYjNDM7MTIsOCBAQAogI2lmbmRlZiBQQURBVEFfSAogI2RlZmluZSBQQURBVEFfSAogCi0jaW5jbHVkZSAmbHQ7bGludXgvcmVmY291bnQuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9jb21waWxlcl90eXBlcy5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3dvcmtxdWV1ZS5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3NwaW5sb2NrLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvbGlzdC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2tvYmplY3QuaCZndDsKLQotI2RlZmluZSBQQURBVEFfQ1BVX1NFUklBTCAgIDB4MDEKLSNkZWZpbmUgUEFEQVRBX0NQVV9QQVJBTExFTCAweDAyCi0KLS8qKgotICogc3RydWN0IHBhZGF0YV9wcml2IC0gUmVwcmVzZW50cyBvbmUgam9iCi0gKgotICogQGxpc3Q6IExpc3QgZW50cnksIHRvIGF0dGFjaCB0byB0aGUgcGFkYXRhIGxpc3RzLgotICogQHBkOiBQb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBjb250cm9sIHN0cnVjdHVyZS4KLSAqIEBjYl9jcHU6IENhbGxiYWNrIGNwdSBmb3Igc2VyaWFsaXphdGlvb24uCi0gKiBAc2VxX25yOiBTZXF1ZW5jZSBudW1iZXIgb2YgdGhlIHBhcmFsbGVsaXplZCBkYXRhIG9iamVjdC4KLSAqIEBpbmZvOiBVc2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGFyYWxsZWwgdG8gdGhlIHNlcmlhbCBmdW5jdGlvbi4KLSAqIEBwYXJhbGxlbDogUGFyYWxsZWwgZXhlY3V0aW9uIGZ1bmN0aW9uLgotICogQHNlcmlhbDogU2VyaWFsIGNvbXBsZXRlIGZ1bmN0aW9uLgotICovCi1zdHJ1Y3QgcGFkYXRhX3ByaXYgewotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKLQlzdHJ1Y3QgcGFyYWxsZWxfZGF0YQkqcGQ7Ci0JaW50CQkJY2JfY3B1OwotCXVuc2lnbmVkIGludAkJc2VxX25yOwotCWludAkJCWluZm87Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgKCpwYXJhbGxlbCkoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICgqc2VyaWFsKShzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSk7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBwYWRhdGFfbGlzdCAtIG9uZSBwZXIgd29yayB0eXBlIHBlciBDUFUKLSAqCi0gKiBAbGlzdDogTGlzdCBoZWFkLgotICogQGxvY2s6IExpc3QgbG9jay4KLSAqLwotc3RydWN0IHBhZGF0YV9saXN0IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBsaXN0OwotCXNwaW5sb2NrX3QgICAgICAgICAgICAgIGxvY2s7Ci19OwotCi0vKioKLSogc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUgLSBUaGUgcGVyY3B1IHBhZGF0YSBzZXJpYWwgcXVldWUKLSoKLSogQHNlcmlhbDogTGlzdCB0byB3YWl0IGZvciBzZXJpYWxpemF0aW9uIGFmdGVyIHJlb3JkZXJpbmcuCi0qIEB3b3JrOiB3b3JrIHN0cnVjdCBmb3Igc2VyaWFsaXphdGlvbi4KLSogQHBkOiBCYWNrcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgY29udHJvbCBzdHJ1Y3R1cmUuCi0qLwotc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUgewotICAgICAgIHN0cnVjdCBwYWRhdGFfbGlzdCAgICBzZXJpYWw7Ci0gICAgICAgc3RydWN0IHdvcmtfc3RydWN0ICAgIHdvcms7Ci0gICAgICAgc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgcGFkYXRhX2NwdW1hc2sgLSBUaGUgY3B1bWFza3MgZm9yIHRoZSBwYXJhbGxlbC9zZXJpYWwgd29ya2VycwotICoKLSAqIEBwY3B1OiBjcHVtYXNrIGZvciB0aGUgcGFyYWxsZWwgd29ya2Vycy4KLSAqIEBjYmNwdTogY3B1bWFzayBmb3IgdGhlIHNlcmlhbCAoY2FsbGJhY2spIHdvcmtlcnMuCi0gKi8KLXN0cnVjdCBwYWRhdGFfY3B1bWFzayB7Ci0JY3B1bWFza192YXJfdAlwY3B1OwotCWNwdW1hc2tfdmFyX3QJY2JjcHU7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBwYXJhbGxlbF9kYXRhIC0gSW50ZXJuYWwgY29udHJvbCBzdHJ1Y3R1cmUsIGNvdmVycyBldmVyeXRoaW5nCi0gKiB0aGF0IGRlcGVuZHMgb24gdGhlIGNwdW1hc2sgaW4gdXNlLgotICoKLSAqIEBwczogcGFkYXRhX3NoZWxsIG9iamVjdC4KLSAqIEByZW9yZGVyX2xpc3Q6IHBlcmNwdSByZW9yZGVyIGxpc3RzCi0gKiBAc3F1ZXVlOiBwZXJjcHUgcGFkYXRhIHF1ZXVlcyB1c2VkIGZvciBzZXJpYWx1emF0aW9uLgotICogQHJlZmNudDogTnVtYmVyIG9mIG9iamVjdHMgaG9sZGluZyBhIHJlZmVyZW5jZSBvbiB0aGlzIHBhcmFsbGVsX2RhdGEuCi0gKiBAc2VxX25yOiBTZXF1ZW5jZSBudW1iZXIgb2YgdGhlIHBhcmFsbGVsaXplZCBkYXRhIG9iamVjdC4KLSAqIEBwcm9jZXNzZWQ6IE51bWJlciBvZiBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RzLgotICogQGNwdTogTmV4dCBDUFUgdG8gYmUgcHJvY2Vzc2VkLgotICogQGNwdW1hc2s6IFRoZSBjcHVtYXNrcyBpbiB1c2UgZm9yIHBhcmFsbGVsIGFuZCBzZXJpYWwgd29ya2Vycy4KLSAqLwotc3RydWN0IHBhcmFsbGVsX2RhdGEgewotCXN0cnVjdCBwYWRhdGFfc2hlbGwJCSpwczsKLQlzdHJ1Y3QgcGFkYXRhX2xpc3QJCV9fcGVyY3B1ICpyZW9yZGVyX2xpc3Q7Ci0Jc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUJX19wZXJjcHUgKnNxdWV1ZTsKLQlyZWZjb3VudF90CQkJcmVmY250OwotCXVuc2lnbmVkIGludAkJCXNlcV9ucjsKLQl1bnNpZ25lZCBpbnQJCQlwcm9jZXNzZWQ7Ci0JaW50CQkJCWNwdTsKLQlzdHJ1Y3QgcGFkYXRhX2NwdW1hc2sJCWNwdW1hc2s7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBwYWRhdGFfc2hlbGwgLSBXcmFwcGVyIGFyb3VuZCBzdHJ1Y3QgcGFyYWxsZWxfZGF0YSwgaXRzCi0gKiBwdXJwb3NlIGlzIHRvIGFsbG93IHRoZSB1bmRlcmx5aW5nIGNvbnRyb2wgc3RydWN0dXJlIHRvIGJlIHJlcGxhY2VkCi0gKiBvbiB0aGUgZmx5IHVzaW5nIFJDVS4KLSAqCi0gKiBAcGluc3Q6IHBhZGF0IGluc3RhbmNlLgotICogQHBkOiBBY3R1YWwgcGFyYWxsZWxfZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggbWF5IGJlIHN1YnN0aXR1dGVkIG9uIHRoZSBmbHkuCi0gKiBAb3BkOiBQb2ludGVyIHRvIG9sZCBwZCB0byBiZSBmcmVlZCBieSBwYWRhdGFfcmVwbGFjZS4KLSAqIEBsaXN0OiBMaXN0IGVudHJ5IGluIHBhZGF0YV9pbnN0YW5jZSBsaXN0LgotICovCi1zdHJ1Y3QgcGFkYXRhX3NoZWxsIHsKLQlzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlCQkqcGluc3Q7Ci0Jc3RydWN0IHBhcmFsbGVsX2RhdGEgX19yY3UJKnBkOwotCXN0cnVjdCBwYXJhbGxlbF9kYXRhCQkqb3BkOwotCXN0cnVjdCBsaXN0X2hlYWQJCWxpc3Q7Ci19OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9pbml0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7CiAKIC8qKgogICogc3RydWN0IHBhZGF0YV9tdF9qb2IgLSByZXByZXNlbnRzIG9uZSBtdWx0aXRocmVhZGVkIGpvYgpAQCAtMTQ2LDQ2ICYjNDM7NDIsOSBAQCBzdHJ1Y3QgcGFkYXRhX210X2pvYiB7CiAJYm9vbAkJCW51bWFfYXdhcmU7CiB9OwogCi0vKioKLSAqIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgLSBUaGUgb3ZlcmFsbCBjb250cm9sIHN0cnVjdHVyZS4KLSAqCi0gKiBAY3B1aHBfbm9kZTogTGlua2FnZSBmb3IgQ1BVIGhvdHBsdWcgY2FsbGJhY2tzLgotICogQHBhcmFsbGVsX3dxOiBUaGUgd29ya3F1ZXVlIHVzZWQgZm9yIHBhcmFsbGVsIHdvcmsuCi0gKiBAc2VyaWFsX3dxOiBUaGUgd29ya3F1ZXVlIHVzZWQgZm9yIHNlcmlhbCB3b3JrLgotICogQHBzbGlzdDogTGlzdCBvZiBwYWRhdGFfc2hlbGwgb2JqZWN0cyBhdHRhY2hlZCB0byB0aGlzIGluc3RhbmNlLgotICogQGNwdW1hc2s6IFVzZXIgc3VwcGxpZWQgY3B1bWFza3MgZm9yIHBhcmFsbGVsIGFuZCBzZXJpYWwgd29ya3MuCi0gKiBAdmFsaWRhdGVfY3B1bWFzazogSW50ZXJuYWwgY3B1bWFzayB1c2VkIHRvIHZhbGlkYXRlIEBjcHVtYXNrIGR1cmluZyBob3RwbHVnLgotICogQGtvYmo6IHBhZGF0YSBpbnN0YW5jZSBrZXJuZWwgb2JqZWN0LgotICogQGxvY2s6IHBhZGF0YSBpbnN0YW5jZSBsb2NrLgotICogQGZsYWdzOiBwYWRhdGEgZmxhZ3MuCi0gKi8KLXN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgewotCXN0cnVjdCBobGlzdF9ub2RlCQljcHVocF9ub2RlOwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0CQkqcGFyYWxsZWxfd3E7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJCSpzZXJpYWxfd3E7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJcHNsaXN0OwotCXN0cnVjdCBwYWRhdGFfY3B1bWFzawkJY3B1bWFzazsKLQljcHVtYXNrX3Zhcl90CQkJdmFsaWRhdGVfY3B1bWFzazsKLQlzdHJ1Y3Qga29iamVjdCAgICAgICAgICAgICAgICAgICBrb2JqOwotCXN0cnVjdCBtdXRleAkJCSBsb2NrOwotCXU4CQkJCSBmbGFnczsKLSNkZWZpbmUJUEFEQVRBX0lOSVQJMQotI2RlZmluZQlQQURBVEFfUkVTRVQJMgotI2RlZmluZQlQQURBVEFfSU5WQUxJRAk0Ci19OwotCiAjaWZkZWYgQ09ORklHX1BBREFUQQogZXh0ZXJuIHZvaWQgX19pbml0IHBhZGF0YV9pbml0KHZvaWQpOwotZXh0ZXJuIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBhZGF0YV9hbGxvYyhjb25zdCBjaGFyICpuYW1lKTsKLWV4dGVybiB2b2lkIHBhZGF0YV9mcmVlKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KTsKLWV4dGVybiBzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwYWRhdGFfYWxsb2Nfc2hlbGwoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpOwotZXh0ZXJuIHZvaWQgcGFkYXRhX2ZyZWVfc2hlbGwoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMpOwotZXh0ZXJuIGludCBwYWRhdGFfZG9fcGFyYWxsZWwoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsCi0JCQkgICAgICBzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSwgaW50ICpjYl9jcHUpOwotZXh0ZXJuIHZvaWQgcGFkYXRhX2RvX3NlcmlhbChzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSk7CiBleHRlcm4gdm9pZCBfX2luaXQgcGFkYXRhX2RvX211bHRpdGhyZWFkZWQoc3RydWN0IHBhZGF0YV9tdF9qb2IgKmpvYik7Ci1leHRlcm4gaW50IHBhZGF0YV9zZXRfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdW1hc2tfdHlwZSwKLQkJCSAgICAgIGNwdW1hc2tfdmFyX3QgY3B1bWFzayk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBwYWRhdGFfaW5pdCh2b2lkKSB7fQogc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBwYWRhdGFfZG9fbXVsdGl0aHJlYWRlZChzdHJ1Y3QgcGFkYXRhX210X2pvYiAqam9iKQpkaWZmIC0tZ2l0IGEva2VybmVsL3BhZGF0YS5jIGIva2VybmVsL3BhZGF0YS5jCmluZGV4IDBkM2VhMWI2OGIxZjcwLi42ZWIxMzBkMzEwMjRjNSAxMDA2NDQKLS0tIGEva2VybmVsL3BhZGF0YS5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9wYWRhdGEuYwpAQCAtMSw2ICYjNDM7MSw2IEBACiAvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAogLyoKLSAqIHBhZGF0YS5jIC0gZ2VuZXJpYyBpbnRlcmZhY2UgdG8gcHJvY2VzcyBkYXRhIHN0cmVhbXMgaW4gcGFyYWxsZWwKJiM0MzsgKiBwYWRhdGEuYyAtIGdlbmVyaWMgaW50ZXJmYWNlIHRvIHJ1biBtdWx0aXRocmVhZGVkIGpvYnMKICAqCiAgKiBTZWUgRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9wYWRhdGEucnN0IGZvciBtb3JlIGluZm9ybWF0aW9uLgogICoKQEAgLTExLDE3ICYjNDM7MTEsMTcgQEAKICAqIEF1dGhvcjogRGFuaWVsIEpvcmRhbiAmbHQ7ZGFuaWVsLm0uam9yZGFuQG9yYWNsZS5jb20mZ3Q7CiAgKi8KIAomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9hdG9taWMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9jb21wbGV0aW9uLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvZXhwb3J0LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvY3B1bWFzay5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2Vyci5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2NwdS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9pbml0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2tlcm5lbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9saXN0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L25vZGVtYXNrLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvcGFkYXRhLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvbXV0ZXguaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9zY2hlZC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9zeXNmcy5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3JjdXBkYXRlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NwaW5sb2NrLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3dvcmtxdWV1ZS5oJmd0OwogCiAjZGVmaW5lCVBBREFUQV9XT1JLX09OU1RBQ0sJMQkvKiBXb3JrJiMzOTtzIG1lbW9yeSBpcyBvbiBzdGFjayAqLwogCkBAIC00NCwzNiAmIzQzOzQ0LDggQEAgc3RydWN0IHBhZGF0YV9tdF9qb2Jfc3RhdGUgewogCXVuc2lnbmVkIGxvbmcJCWNodW5rX3NpemU7CiB9OwogCi1zdGF0aWMgdm9pZCBwYWRhdGFfZnJlZV9wZChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQpOwogc3RhdGljIHZvaWQgX19pbml0IHBhZGF0YV9tdF9oZWxwZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAotc3RhdGljIGlubGluZSB2b2lkIHBhZGF0YV9nZXRfcGQoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKQotewotCXJlZmNvdW50X2luYygmYW1wO3BkLSZndDtyZWZjbnQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcGFkYXRhX3B1dF9wZF9jbnQoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkLCBpbnQgY250KQotewotCWlmIChyZWZjb3VudF9zdWJfYW5kX3Rlc3QoY250LCAmYW1wO3BkLSZndDtyZWZjbnQpKQotCQlwYWRhdGFfZnJlZV9wZChwZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwYWRhdGFfcHV0X3BkKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCkKLXsKLQlwYWRhdGFfcHV0X3BkX2NudChwZCwgMSk7Ci19Ci0KLXN0YXRpYyBpbnQgcGFkYXRhX2NwdV9oYXNoKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCwgdW5zaWduZWQgaW50IHNlcV9ucikKLXsKLQkvKgotCSAqIEhhc2ggdGhlIHNlcXVlbmNlIG51bWJlcnMgdG8gdGhlIGNwdXMgYnkgdGFraW5nCi0JICogc2VxX25yIG1vZC4gbnVtYmVyIG9mIGNwdXMgaW4gdXNlLgotCSAqLwotCWludCBjcHVfaW5kZXggPSBzZXFfbnIgJSBjcHVtYXNrX3dlaWdodChwZC0mZ3Q7Y3B1bWFzay5wY3B1KTsKLQotCXJldHVybiBjcHVtYXNrX250aChjcHVfaW5kZXgsIHBkLSZndDtjcHVtYXNrLnBjcHUpOwotfQotCiBzdGF0aWMgc3RydWN0IHBhZGF0YV93b3JrICpwYWRhdGFfd29ya19hbGxvYyh2b2lkKQogewogCXN0cnVjdCBwYWRhdGFfd29yayAqcHc7CkBAIC0xNDcsMjYwICYjNDM7MTE5LDYgQEAgc3RhdGljIHZvaWQgX19pbml0IHBhZGF0YV93b3Jrc19mcmVlKHN0cnVjdCBsaXN0X2hlYWQgKndvcmtzKQogCXNwaW5fdW5sb2NrX2JoKCZhbXA7cGFkYXRhX3dvcmtzX2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCBwYWRhdGFfcGFyYWxsZWxfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqcGFyYWxsZWxfd29yaykKLXsKLQlzdHJ1Y3QgcGFkYXRhX3dvcmsgKnB3ID0gY29udGFpbmVyX29mKHBhcmFsbGVsX3dvcmssIHN0cnVjdCBwYWRhdGFfd29yaywKLQkJCQkJICAgICAgcHdfd29yayk7Ci0Jc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEgPSBwdy0mZ3Q7cHdfZGF0YTsKLQotCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQlwYWRhdGEtJmd0O3BhcmFsbGVsKHBhZGF0YSk7Ci0Jc3Bpbl9sb2NrKCZhbXA7cGFkYXRhX3dvcmtzX2xvY2spOwotCXBhZGF0YV93b3JrX2ZyZWUocHcpOwotCXNwaW5fdW5sb2NrKCZhbXA7cGFkYXRhX3dvcmtzX2xvY2spOwotCWxvY2FsX2JoX2VuYWJsZSgpOwotfQotCi0vKioKLSAqIHBhZGF0YV9kb19wYXJhbGxlbCAtIHBhZGF0YSBwYXJhbGxlbGl6YXRpb24gZnVuY3Rpb24KLSAqCi0gKiBAcHM6IHBhZGF0YXNoZWxsCi0gKiBAcGFkYXRhOiBvYmplY3QgdG8gYmUgcGFyYWxsZWxpemVkCi0gKiBAY2JfY3B1OiBwb2ludGVyIHRvIHRoZSBDUFUgdGhhdCB0aGUgc2VyaWFsaXphdGlvbiBjYWxsYmFjayBmdW5jdGlvbiBzaG91bGQKLSAqICAgICAgICAgIHJ1biBvbi4gIElmIGl0JiMzOTtzIG5vdCBpbiB0aGUgc2VyaWFsIGNwdW1hc2sgb2YgQHBpbnN0Ci0gKiAgICAgICAgICAoaS5lLiBjcHVtYXNrLmNiY3B1KSwgdGhpcyBmdW5jdGlvbiBzZWxlY3RzIGEgZmFsbGJhY2sgQ1BVIGFuZCBpZgotICogICAgICAgICAgbm9uZSBmb3VuZCwgcmV0dXJucyAtRUlOVkFMLgotICoKLSAqIFRoZSBwYXJhbGxlbGl6YXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBydW4gd2l0aCBCSHMgb2ZmLgotICogTm90ZTogRXZlcnkgb2JqZWN0IHdoaWNoIGlzIHBhcmFsbGVsaXplZCBieSBwYWRhdGFfZG9fcGFyYWxsZWwKLSAqIG11c3QgYmUgc2VlbiBieSBwYWRhdGFfZG9fc2VyaWFsLgotICoKLSAqIFJldHVybjogMCBvbiBzdWNjZXNzIG9yIGVsc2UgbmVnYXRpdmUgZXJyb3IgY29kZS4KLSAqLwotaW50IHBhZGF0YV9kb19wYXJhbGxlbChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcywKLQkJICAgICAgIHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhLCBpbnQgKmNiX2NwdSkKLXsKLQlzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCA9IHBzLSZndDtwaW5zdDsKLQlzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQ7Ci0Jc3RydWN0IHBhZGF0YV93b3JrICpwdzsKLQlpbnQgY3B1X2luZGV4LCBlcnI7Ci0KLQlyY3VfcmVhZF9sb2NrX2JoKCk7Ci0KLQlwZCA9IHJjdV9kZXJlZmVyZW5jZV9iaChwcy0mZ3Q7cGQpOwotCi0JZXJyID0gLUVJTlZBTDsKLQlpZiAoIShwaW5zdC0mZ3Q7ZmxhZ3MgJmFtcDsgUEFEQVRBX0lOSVQpIHx8IHBpbnN0LSZndDtmbGFncyAmYW1wOyBQQURBVEFfSU5WQUxJRCkKLQkJZ290byBvdXQ7Ci0KLQlpZiAoIWNwdW1hc2tfdGVzdF9jcHUoKmNiX2NwdSwgcGQtJmd0O2NwdW1hc2suY2JjcHUpKSB7Ci0JCWlmIChjcHVtYXNrX2VtcHR5KHBkLSZndDtjcHVtYXNrLmNiY3B1KSkKLQkJCWdvdG8gb3V0OwotCi0JCS8qIFNlbGVjdCBhbiBhbHRlcm5hdGUgZmFsbGJhY2sgQ1BVIGFuZCBub3RpZnkgdGhlIGNhbGxlci4gKi8KLQkJY3B1X2luZGV4ID0gKmNiX2NwdSAlIGNwdW1hc2tfd2VpZ2h0KHBkLSZndDtjcHVtYXNrLmNiY3B1KTsKLQkJKmNiX2NwdSA9IGNwdW1hc2tfbnRoKGNwdV9pbmRleCwgcGQtJmd0O2NwdW1hc2suY2JjcHUpOwotCX0KLQotCWVyciA9IC1FQlVTWTsKLQlpZiAoKHBpbnN0LSZndDtmbGFncyAmYW1wOyBQQURBVEFfUkVTRVQpKQotCQlnb3RvIG91dDsKLQotCXBhZGF0YV9nZXRfcGQocGQpOwotCXBhZGF0YS0mZ3Q7cGQgPSBwZDsKLQlwYWRhdGEtJmd0O2NiX2NwdSA9ICpjYl9jcHU7Ci0KLQlzcGluX2xvY2soJmFtcDtwYWRhdGFfd29ya3NfbG9jayk7Ci0JcGFkYXRhLSZndDtzZXFfbnIgPSAmIzQzOyYjNDM7cGQtJmd0O3NlcV9ucjsKLQlwdyA9IHBhZGF0YV93b3JrX2FsbG9jKCk7Ci0Jc3Bpbl91bmxvY2soJmFtcDtwYWRhdGFfd29ya3NfbG9jayk7Ci0KLQlpZiAoIXB3KSB7Ci0JCS8qIE1heGltdW0gd29ya3MgbGltaXQgZXhjZWVkZWQsIHJ1biBpbiB0aGUgY3VycmVudCB0YXNrLiAqLwotCQlwYWRhdGEtJmd0O3BhcmFsbGVsKHBhZGF0YSk7Ci0JfQotCi0JcmN1X3JlYWRfdW5sb2NrX2JoKCk7Ci0KLQlpZiAocHcpIHsKLQkJcGFkYXRhX3dvcmtfaW5pdChwdywgcGFkYXRhX3BhcmFsbGVsX3dvcmtlciwgcGFkYXRhLCAwKTsKLQkJcXVldWVfd29yayhwaW5zdC0mZ3Q7cGFyYWxsZWxfd3EsICZhbXA7cHctJmd0O3B3X3dvcmspOwotCX0KLQotCXJldHVybiAwOwotb3V0OgotCXJjdV9yZWFkX3VubG9ja19iaCgpOwotCi0JcmV0dXJuIGVycjsKLX0KLUVYUE9SVF9TWU1CT0wocGFkYXRhX2RvX3BhcmFsbGVsKTsKLQotLyoKLSAqIHBhZGF0YV9maW5kX25leHQgLSBGaW5kIHRoZSBuZXh0IG9iamVjdCB0aGF0IG5lZWRzIHNlcmlhbGl6YXRpb24uCi0gKgotICogUmV0dXJuOgotICogKiBBIHBvaW50ZXIgdG8gdGhlIGNvbnRyb2wgc3RydWN0IG9mIHRoZSBuZXh0IG9iamVjdCB0aGF0IG5lZWRzCi0gKiAgIHNlcmlhbGl6YXRpb24sIGlmIHByZXNlbnQgaW4gb25lIG9mIHRoZSBwZXJjcHUgcmVvcmRlciBxdWV1ZXMuCi0gKiAqIE5VTEwsIGlmIHRoZSBuZXh0IG9iamVjdCB0aGF0IG5lZWRzIHNlcmlhbGl6YXRpb24gd2lsbAotICogICBiZSBwYXJhbGxlbCBwcm9jZXNzZWQgYnkgYW5vdGhlciBjcHUgYW5kIGlzIG5vdCB5ZXQgcHJlc2VudCBpbgotICogICB0aGUgY3B1JiMzOTtzIHJlb3JkZXIgcXVldWUuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YV9maW5kX25leHQoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkLCBpbnQgY3B1LAotCQkJCQkgICAgdW5zaWduZWQgaW50IHByb2Nlc3NlZCkKLXsKLQlzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YTsKLQlzdHJ1Y3QgcGFkYXRhX2xpc3QgKnJlb3JkZXI7Ci0KLQlyZW9yZGVyID0gcGVyX2NwdV9wdHIocGQtJmd0O3Jlb3JkZXJfbGlzdCwgY3B1KTsKLQotCXNwaW5fbG9jaygmYW1wO3Jlb3JkZXItJmd0O2xvY2spOwotCWlmIChsaXN0X2VtcHR5KCZhbXA7cmVvcmRlci0mZ3Q7bGlzdCkpCi0JCWdvdG8gbm90Zm91bmQ7Ci0KLQlwYWRhdGEgPSBsaXN0X2VudHJ5KHJlb3JkZXItJmd0O2xpc3QubmV4dCwgc3RydWN0IHBhZGF0YV9wcml2LCBsaXN0KTsKLQotCS8qCi0JICogQ2hlY2tzIHRoZSByYXJlIGNhc2Ugd2hlcmUgdHdvIG9yIG1vcmUgcGFyYWxsZWwgam9icyBoYXZlIGhhc2hlZCB0bwotCSAqIHRoZSBzYW1lIENQVSBhbmQgb25lIG9mIHRoZSBsYXRlciBvbmVzIGZpbmlzaGVzIGZpcnN0LgotCSAqLwotCWlmIChwYWRhdGEtJmd0O3NlcV9uciAhPSBwcm9jZXNzZWQpCi0JCWdvdG8gbm90Zm91bmQ7Ci0KLQlsaXN0X2RlbF9pbml0KCZhbXA7cGFkYXRhLSZndDtsaXN0KTsKLQlzcGluX3VubG9jaygmYW1wO3Jlb3JkZXItJmd0O2xvY2spOwotCXJldHVybiBwYWRhdGE7Ci0KLW5vdGZvdW5kOgotCXBkLSZndDtwcm9jZXNzZWQgPSBwcm9jZXNzZWQ7Ci0JcGQtJmd0O2NwdSA9IGNwdTsKLQlzcGluX3VubG9jaygmYW1wO3Jlb3JkZXItJmd0O2xvY2spOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBwYWRhdGFfcmVvcmRlcihzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSkKLXsKLQlzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQgPSBwYWRhdGEtJmd0O3BkOwotCXN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0ID0gcGQtJmd0O3BzLSZndDtwaW5zdDsKLQl1bnNpZ25lZCBpbnQgcHJvY2Vzc2VkOwotCWludCBjcHU7Ci0KLQlwcm9jZXNzZWQgPSBwZC0mZ3Q7cHJvY2Vzc2VkOwotCWNwdSA9IHBkLSZndDtjcHU7Ci0KLQlkbyB7Ci0JCXN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlICpzcXVldWU7Ci0JCWludCBjYl9jcHU7Ci0KLQkJcHJvY2Vzc2VkJiM0MzsmIzQzOzsKLQkJLyogV2hlbiBzZXF1ZW5jZSB3cmFwcyBhcm91bmQsIHJlc2V0IHRvIHRoZSBmaXJzdCBDUFUuICovCi0JCWlmICh1bmxpa2VseShwcm9jZXNzZWQgPT0gMCkpCi0JCQljcHUgPSBjcHVtYXNrX2ZpcnN0KHBkLSZndDtjcHVtYXNrLnBjcHUpOwotCQllbHNlCi0JCQljcHUgPSBjcHVtYXNrX25leHRfd3JhcChjcHUsIHBkLSZndDtjcHVtYXNrLnBjcHUpOwotCi0JCWNiX2NwdSA9IHBhZGF0YS0mZ3Q7Y2JfY3B1OwotCQlzcXVldWUgPSBwZXJfY3B1X3B0cihwZC0mZ3Q7c3F1ZXVlLCBjYl9jcHUpOwotCi0JCXNwaW5fbG9jaygmYW1wO3NxdWV1ZS0mZ3Q7c2VyaWFsLmxvY2spOwotCQlsaXN0X2FkZF90YWlsKCZhbXA7cGFkYXRhLSZndDtsaXN0LCAmYW1wO3NxdWV1ZS0mZ3Q7c2VyaWFsLmxpc3QpOwotCQlxdWV1ZV93b3JrX29uKGNiX2NwdSwgcGluc3QtJmd0O3NlcmlhbF93cSwgJmFtcDtzcXVldWUtJmd0O3dvcmspOwotCi0JCS8qCi0JCSAqIElmIHRoZSBuZXh0IG9iamVjdCB0aGF0IG5lZWRzIHNlcmlhbGl6YXRpb24gaXMgcGFyYWxsZWwKLQkJICogcHJvY2Vzc2VkIGJ5IGFub3RoZXIgY3B1IGFuZCBpcyBzdGlsbCBvbiBpdCYjMzk7cyB3YXkgdG8gdGhlCi0JCSAqIGNwdSYjMzk7cyByZW9yZGVyIHF1ZXVlLCBlbmQgdGhlIGxvb3AuCi0JCSAqLwotCQlwYWRhdGEgPSBwYWRhdGFfZmluZF9uZXh0KHBkLCBjcHUsIHByb2Nlc3NlZCk7Ci0JCXNwaW5fdW5sb2NrKCZhbXA7c3F1ZXVlLSZndDtzZXJpYWwubG9jayk7Ci0JfSB3aGlsZSAocGFkYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgcGFkYXRhX3NlcmlhbF93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICpzZXJpYWxfd29yaykKLXsKLQlzdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZSAqc3F1ZXVlOwotCXN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDsKLQlMSVNUX0hFQUQobG9jYWxfbGlzdCk7Ci0JaW50IGNudDsKLQotCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQlzcXVldWUgPSBjb250YWluZXJfb2Yoc2VyaWFsX3dvcmssIHN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlLCB3b3JrKTsKLQlwZCA9IHNxdWV1ZS0mZ3Q7cGQ7Ci0KLQlzcGluX2xvY2soJmFtcDtzcXVldWUtJmd0O3NlcmlhbC5sb2NrKTsKLQlsaXN0X3JlcGxhY2VfaW5pdCgmYW1wO3NxdWV1ZS0mZ3Q7c2VyaWFsLmxpc3QsICZhbXA7bG9jYWxfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmFtcDtzcXVldWUtJmd0O3NlcmlhbC5sb2NrKTsKLQotCWNudCA9IDA7Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmFtcDtsb2NhbF9saXN0KSkgewotCQlzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YTsKLQotCQlwYWRhdGEgPSBsaXN0X2VudHJ5KGxvY2FsX2xpc3QubmV4dCwKLQkJCQkgICAgc3RydWN0IHBhZGF0YV9wcml2LCBsaXN0KTsKLQotCQlsaXN0X2RlbF9pbml0KCZhbXA7cGFkYXRhLSZndDtsaXN0KTsKLQotCQlwYWRhdGEtJmd0O3NlcmlhbChwYWRhdGEpOwotCQljbnQmIzQzOyYjNDM7OwotCX0KLQlsb2NhbF9iaF9lbmFibGUoKTsKLQotCXBhZGF0YV9wdXRfcGRfY250KHBkLCBjbnQpOwotfQotCi0vKioKLSAqIHBhZGF0YV9kb19zZXJpYWwgLSBwYWRhdGEgc2VyaWFsaXphdGlvbiBmdW5jdGlvbgotICoKLSAqIEBwYWRhdGE6IG9iamVjdCB0byBiZSBzZXJpYWxpemVkLgotICoKLSAqIHBhZGF0YV9kb19zZXJpYWwgbXVzdCBiZSBjYWxsZWQgZm9yIGV2ZXJ5IHBhcmFsbGVsaXplZCBvYmplY3QuCi0gKiBUaGUgc2VyaWFsaXphdGlvbiBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIHJ1biB3aXRoIEJIcyBvZmYuCi0gKi8KLXZvaWQgcGFkYXRhX2RvX3NlcmlhbChzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSkKLXsKLQlzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQgPSBwYWRhdGEtJmd0O3BkOwotCWludCBoYXNoZWRfY3B1ID0gcGFkYXRhX2NwdV9oYXNoKHBkLCBwYWRhdGEtJmd0O3NlcV9ucik7Ci0Jc3RydWN0IHBhZGF0YV9saXN0ICpyZW9yZGVyID0gcGVyX2NwdV9wdHIocGQtJmd0O3Jlb3JkZXJfbGlzdCwgaGFzaGVkX2NwdSk7Ci0Jc3RydWN0IHBhZGF0YV9wcml2ICpjdXI7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zOwotCWJvb2wgZ290aXQgPSB0cnVlOwotCi0Jc3Bpbl9sb2NrKCZhbXA7cmVvcmRlci0mZ3Q7bG9jayk7Ci0JLyogU29ydCBpbiBhc2NlbmRpbmcgb3JkZXIgb2Ygc2VxdWVuY2UgbnVtYmVyLiAqLwotCWxpc3RfZm9yX2VhY2hfcHJldihwb3MsICZhbXA7cmVvcmRlci0mZ3Q7bGlzdCkgewotCQljdXIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHBhZGF0YV9wcml2LCBsaXN0KTsKLQkJLyogQ29tcGFyZSBieSBkaWZmZXJlbmNlIHRvIGNvbnNpZGVyIGludGVnZXIgd3JhcCBhcm91bmQgKi8KLQkJaWYgKChzaWduZWQgaW50KShjdXItJmd0O3NlcV9uciAtIHBhZGF0YS0mZ3Q7c2VxX25yKSAmbHQ7IDApCi0JCQlicmVhazsKLQl9Ci0JaWYgKHBhZGF0YS0mZ3Q7c2VxX25yICE9IHBkLSZndDtwcm9jZXNzZWQpIHsKLQkJZ290aXQgPSBmYWxzZTsKLQkJbGlzdF9hZGQoJmFtcDtwYWRhdGEtJmd0O2xpc3QsIHBvcyk7Ci0JfQotCXNwaW5fdW5sb2NrKCZhbXA7cmVvcmRlci0mZ3Q7bG9jayk7Ci0KLQlpZiAoZ290aXQpCi0JCXBhZGF0YV9yZW9yZGVyKHBhZGF0YSk7Ci19Ci1FWFBPUlRfU1lNQk9MKHBhZGF0YV9kb19zZXJpYWwpOwotCi1zdGF0aWMgaW50IHBhZGF0YV9zZXR1cF9jcHVtYXNrcyhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCkKLXsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX2F0dHJzICphdHRyczsKLQlpbnQgZXJyOwotCi0JYXR0cnMgPSBhbGxvY193b3JrcXVldWVfYXR0cnMoKTsKLQlpZiAoIWF0dHJzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIFJlc3RyaWN0IHBhcmFsbGVsX3dxIHdvcmtlcnMgdG8gcGQtJmd0O2NwdW1hc2sucGNwdS4gKi8KLQljcHVtYXNrX2NvcHkoYXR0cnMtJmd0O2NwdW1hc2ssIHBpbnN0LSZndDtjcHVtYXNrLnBjcHUpOwotCWVyciA9IGFwcGx5X3dvcmtxdWV1ZV9hdHRycyhwaW5zdC0mZ3Q7cGFyYWxsZWxfd3EsIGF0dHJzKTsKLQlmcmVlX3dvcmtxdWV1ZV9hdHRycyhhdHRycyk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQgcGFkYXRhX210X2hlbHBlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpCiB7CiAJc3RydWN0IHBhZGF0YV93b3JrICpwdyA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgcGFkYXRhX3dvcmssIHB3X3dvcmspOwpAQCAtNTA2LDYxMyAmIzQzOzIyNCwxNyBAQCB2b2lkIF9faW5pdCBwYWRhdGFfZG9fbXVsdGl0aHJlYWRlZChzdHJ1Y3QgcGFkYXRhX210X2pvYiAqam9iKQogCXBhZGF0YV93b3Jrc19mcmVlKCZhbXA7d29ya3MpOwogfQogCi0vKiBJbml0aWFsaXplIGFsbCBwZXJjcHUgcXVldWVzIHVzZWQgYnkgc2VyaWFsIHdvcmtlcnMgKi8KLXN0YXRpYyB2b2lkIHBhZGF0YV9pbml0X3NxdWV1ZXMoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKQotewotCWludCBjcHU7Ci0Jc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUgKnNxdWV1ZTsKLQotCWZvcl9lYWNoX2NwdShjcHUsIHBkLSZndDtjcHVtYXNrLmNiY3B1KSB7Ci0JCXNxdWV1ZSA9IHBlcl9jcHVfcHRyKHBkLSZndDtzcXVldWUsIGNwdSk7Ci0JCXNxdWV1ZS0mZ3Q7cGQgPSBwZDsKLQkJSU5JVF9MSVNUX0hFQUQoJmFtcDtzcXVldWUtJmd0O3NlcmlhbC5saXN0KTsKLQkJc3Bpbl9sb2NrX2luaXQoJmFtcDtzcXVldWUtJmd0O3NlcmlhbC5sb2NrKTsKLQkJSU5JVF9XT1JLKCZhbXA7c3F1ZXVlLSZndDt3b3JrLCBwYWRhdGFfc2VyaWFsX3dvcmtlcik7Ci0JfQotfQotCi0vKiBJbml0aWFsaXplIHBlci1DUFUgcmVvcmRlciBsaXN0cyAqLwotc3RhdGljIHZvaWQgcGFkYXRhX2luaXRfcmVvcmRlcl9saXN0KHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCkKLXsKLQlpbnQgY3B1OwotCXN0cnVjdCBwYWRhdGFfbGlzdCAqbGlzdDsKLQotCWZvcl9lYWNoX2NwdShjcHUsIHBkLSZndDtjcHVtYXNrLnBjcHUpIHsKLQkJbGlzdCA9IHBlcl9jcHVfcHRyKHBkLSZndDtyZW9yZGVyX2xpc3QsIGNwdSk7Ci0JCUlOSVRfTElTVF9IRUFEKCZhbXA7bGlzdC0mZ3Q7bGlzdCk7Ci0JCXNwaW5fbG9ja19pbml0KCZhbXA7bGlzdC0mZ3Q7bG9jayk7Ci0JfQotfQotCi0vKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgY3B1bWFzayBkZXBlbmRlbmQgcmVzb3VyY2VzLiAqLwotc3RhdGljIHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwYWRhdGFfYWxsb2NfcGQoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsCi0JCQkJCSAgICAgaW50IG9mZmxpbmluZ19jcHUpCi17Ci0Jc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QgPSBwcy0mZ3Q7cGluc3Q7Ci0Jc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkOwotCi0JcGQgPSBremFsbG9jX29iaihzdHJ1Y3QgcGFyYWxsZWxfZGF0YSk7Ci0JaWYgKCFwZCkKLQkJZ290byBlcnI7Ci0KLQlwZC0mZ3Q7cmVvcmRlcl9saXN0ID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBwYWRhdGFfbGlzdCk7Ci0JaWYgKCFwZC0mZ3Q7cmVvcmRlcl9saXN0KQotCQlnb3RvIGVycl9mcmVlX3BkOwotCi0JcGQtJmd0O3NxdWV1ZSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZSk7Ci0JaWYgKCFwZC0mZ3Q7c3F1ZXVlKQotCQlnb3RvIGVycl9mcmVlX3Jlb3JkZXJfbGlzdDsKLQotCXBkLSZndDtwcyA9IHBzOwotCi0JaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmYW1wO3BkLSZndDtjcHVtYXNrLnBjcHUsIEdGUF9LRVJORUwpKQotCQlnb3RvIGVycl9mcmVlX3NxdWV1ZTsKLQlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZhbXA7cGQtJmd0O2NwdW1hc2suY2JjcHUsIEdGUF9LRVJORUwpKQotCQlnb3RvIGVycl9mcmVlX3BjcHU7Ci0KLQljcHVtYXNrX2FuZChwZC0mZ3Q7Y3B1bWFzay5wY3B1LCBwaW5zdC0mZ3Q7Y3B1bWFzay5wY3B1LCBjcHVfb25saW5lX21hc2spOwotCWNwdW1hc2tfYW5kKHBkLSZndDtjcHVtYXNrLmNiY3B1LCBwaW5zdC0mZ3Q7Y3B1bWFzay5jYmNwdSwgY3B1X29ubGluZV9tYXNrKTsKLQlpZiAob2ZmbGluaW5nX2NwdSAmZ3Q7PSAwKSB7Ci0JCV9fY3B1bWFza19jbGVhcl9jcHUob2ZmbGluaW5nX2NwdSwgcGQtJmd0O2NwdW1hc2sucGNwdSk7Ci0JCV9fY3B1bWFza19jbGVhcl9jcHUob2ZmbGluaW5nX2NwdSwgcGQtJmd0O2NwdW1hc2suY2JjcHUpOwotCX0KLQotCXBhZGF0YV9pbml0X3Jlb3JkZXJfbGlzdChwZCk7Ci0JcGFkYXRhX2luaXRfc3F1ZXVlcyhwZCk7Ci0JcGQtJmd0O3NlcV9uciA9IC0xOwotCXJlZmNvdW50X3NldCgmYW1wO3BkLSZndDtyZWZjbnQsIDEpOwotCXBkLSZndDtjcHUgPSBjcHVtYXNrX2ZpcnN0KHBkLSZndDtjcHVtYXNrLnBjcHUpOwotCi0JcmV0dXJuIHBkOwotCi1lcnJfZnJlZV9wY3B1OgotCWZyZWVfY3B1bWFza192YXIocGQtJmd0O2NwdW1hc2sucGNwdSk7Ci1lcnJfZnJlZV9zcXVldWU6Ci0JZnJlZV9wZXJjcHUocGQtJmd0O3NxdWV1ZSk7Ci1lcnJfZnJlZV9yZW9yZGVyX2xpc3Q6Ci0JZnJlZV9wZXJjcHUocGQtJmd0O3Jlb3JkZXJfbGlzdCk7Ci1lcnJfZnJlZV9wZDoKLQlrZnJlZShwZCk7Ci1lcnI6Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhZGF0YV9mcmVlX3BkKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCkKLXsKLQlmcmVlX2NwdW1hc2tfdmFyKHBkLSZndDtjcHVtYXNrLnBjcHUpOwotCWZyZWVfY3B1bWFza192YXIocGQtJmd0O2NwdW1hc2suY2JjcHUpOwotCWZyZWVfcGVyY3B1KHBkLSZndDtyZW9yZGVyX2xpc3QpOwotCWZyZWVfcGVyY3B1KHBkLSZndDtzcXVldWUpOwotCWtmcmVlKHBkKTsKLX0KLQotc3RhdGljIHZvaWQgX19wYWRhdGFfc3RhcnQoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpCi17Ci0JcGluc3QtJmd0O2ZsYWdzIHw9IFBBREFUQV9JTklUOwotfQotCi1zdGF0aWMgdm9pZCBfX3BhZGF0YV9zdG9wKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KQotewotCWlmICghKHBpbnN0LSZndDtmbGFncyAmYW1wOyBQQURBVEFfSU5JVCkpCi0JCXJldHVybjsKLQotCXBpbnN0LSZndDtmbGFncyAmYW1wOz0gflBBREFUQV9JTklUOwotCi0Jc3luY2hyb25pemVfcmN1KCk7Ci19Ci0KLS8qIFJlcGxhY2UgdGhlIGludGVybmFsIGNvbnRyb2wgc3RydWN0dXJlIHdpdGggYSBuZXcgb25lLiAqLwotc3RhdGljIGludCBwYWRhdGFfcmVwbGFjZV9vbmUoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsIGludCBvZmZsaW5pbmdfY3B1KQotewotCXN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZF9uZXc7Ci0KLQlwZF9uZXcgPSBwYWRhdGFfYWxsb2NfcGQocHMsIG9mZmxpbmluZ19jcHUpOwotCWlmICghcGRfbmV3KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBzLSZndDtvcGQgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHBzLSZndDtwZCwgMSk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKHBzLSZndDtwZCwgcGRfbmV3KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBhZGF0YV9yZXBsYWNlKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgb2ZmbGluaW5nX2NwdSkKLXsKLQlzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwczsKLQlpbnQgZXJyID0gMDsKLQotCXBpbnN0LSZndDtmbGFncyB8PSBQQURBVEFfUkVTRVQ7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBzLCAmYW1wO3BpbnN0LSZndDtwc2xpc3QsIGxpc3QpIHsKLQkJZXJyID0gcGFkYXRhX3JlcGxhY2Vfb25lKHBzLCBvZmZsaW5pbmdfY3B1KTsKLQkJaWYgKGVycikKLQkJCWJyZWFrOwotCX0KLQotCXN5bmNocm9uaXplX3JjdSgpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZV9yZXZlcnNlKHBzLCAmYW1wO3BpbnN0LSZndDtwc2xpc3QsIGxpc3QpCi0JCXBhZGF0YV9wdXRfcGQocHMtJmd0O29wZCk7Ci0KLQlwaW5zdC0mZ3Q7ZmxhZ3MgJmFtcDs9IH5QQURBVEFfUkVTRVQ7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0vKiBJZiBjcHVtYXNrIGNvbnRhaW5zIG5vIGFjdGl2ZSBjcHUsIHdlIG1hcmsgdGhlIGluc3RhbmNlIGFzIGludmFsaWQuICovCi1zdGF0aWMgYm9vbCBwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwKLQkJCQkgICAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2ssCi0JCQkJICAgIGludCBvZmZsaW5pbmdfY3B1KQotewotCWNwdW1hc2tfY29weShwaW5zdC0mZ3Q7dmFsaWRhdGVfY3B1bWFzaywgY3B1X29ubGluZV9tYXNrKTsKLQotCS8qCi0JICogQG9mZmxpbmluZ19jcHUgaXMgc3RpbGwgaW4gY3B1X29ubGluZV9tYXNrLCBzbyByZW1vdmUgaXQgaGVyZSBmb3IKLQkgKiB2YWxpZGF0aW9uLiAgVXNpbmcgYSBzdWItQ1BVSFBfVEVBUkRPV05fQ1BVIGhvdHBsdWcgc3RhdGUgd2hlcmUKLQkgKiBAb2ZmbGluaW5nX2NwdSB3b3VsZG4mIzM5O3QgYmUgaW4gdGhlIG9ubGluZSBtYXNrIGRvZXNuJiMzOTt0IHdvcmsgYmVjYXVzZQotCSAqIHBhZGF0YV9jcHVfb2ZmbGluZSgpIGNhbiBmYWlsIGJ1dCBzdWNoIGEgc3RhdGUgZG9lc24mIzM5O3QgYWxsb3cgZmFpbHVyZS4KLQkgKi8KLQlpZiAob2ZmbGluaW5nX2NwdSAmZ3Q7PSAwKQotCQlfX2NwdW1hc2tfY2xlYXJfY3B1KG9mZmxpbmluZ19jcHUsIHBpbnN0LSZndDt2YWxpZGF0ZV9jcHVtYXNrKTsKLQotCWlmICghY3B1bWFza19pbnRlcnNlY3RzKGNwdW1hc2ssIHBpbnN0LSZndDt2YWxpZGF0ZV9jcHVtYXNrKSkgewotCQlwaW5zdC0mZ3Q7ZmxhZ3MgfD0gUEFEQVRBX0lOVkFMSUQ7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwaW5zdC0mZ3Q7ZmxhZ3MgJmFtcDs9IH5QQURBVEFfSU5WQUxJRDsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludCBfX3BhZGF0YV9zZXRfY3B1bWFza3Moc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsCi0JCQkJIGNwdW1hc2tfdmFyX3QgcGNwdW1hc2ssCi0JCQkJIGNwdW1hc2tfdmFyX3QgY2JjcHVtYXNrKQotewotCWludCB2YWxpZDsKLQlpbnQgZXJyOwotCi0JdmFsaWQgPSBwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGNwdW1hc2ssIC0xKTsKLQlpZiAoIXZhbGlkKSB7Ci0JCV9fcGFkYXRhX3N0b3AocGluc3QpOwotCQlnb3RvIG91dF9yZXBsYWNlOwotCX0KLQotCXZhbGlkID0gcGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2socGluc3QsIGNiY3B1bWFzaywgLTEpOwotCWlmICghdmFsaWQpCi0JCV9fcGFkYXRhX3N0b3AocGluc3QpOwotCi1vdXRfcmVwbGFjZToKLQljcHVtYXNrX2NvcHkocGluc3QtJmd0O2NwdW1hc2sucGNwdSwgcGNwdW1hc2spOwotCWNwdW1hc2tfY29weShwaW5zdC0mZ3Q7Y3B1bWFzay5jYmNwdSwgY2JjcHVtYXNrKTsKLQotCWVyciA9IHBhZGF0YV9zZXR1cF9jcHVtYXNrcyhwaW5zdCkgPzogcGFkYXRhX3JlcGxhY2UocGluc3QsIC0xKTsKLQotCWlmICh2YWxpZCkKLQkJX19wYWRhdGFfc3RhcnQocGluc3QpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKiBwYWRhdGFfc2V0X2NwdW1hc2sgLSBTZXRzIHNwZWNpZmllZCBieSBAY3B1bWFza190eXBlIGNwdW1hc2sgdG8gdGhlIHZhbHVlCi0gKiAgICAgICAgICAgICAgICAgICAgICBlcXVpdmFsZW50IHRvIEBjcHVtYXNrLgotICogQHBpbnN0OiBwYWRhdGEgaW5zdGFuY2UKLSAqIEBjcHVtYXNrX3R5cGU6IFBBREFUQV9DUFVfU0VSSUFMIG9yIFBBREFUQV9DUFVfUEFSQUxMRUwgY29ycmVzcG9uZGluZwotICogICAgICAgICAgICAgICAgdG8gcGFyYWxsZWwgYW5kIHNlcmlhbCBjcHVtYXNrcyByZXNwZWN0aXZlbHkuCi0gKiBAY3B1bWFzazogdGhlIGNwdW1hc2sgdG8gdXNlCi0gKgotICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZQotICovCi1pbnQgcGFkYXRhX3NldF9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgY3B1bWFza190eXBlLAotCQkgICAgICAgY3B1bWFza192YXJfdCBjcHVtYXNrKQotewotCXN0cnVjdCBjcHVtYXNrICpzZXJpYWxfbWFzaywgKnBhcmFsbGVsX21hc2s7Ci0JaW50IGVyciA9IC1FSU5WQUw7Ci0KLQljcHVzX3JlYWRfbG9jaygpOwotCW11dGV4X2xvY2soJmFtcDtwaW5zdC0mZ3Q7bG9jayk7Ci0KLQlzd2l0Y2ggKGNwdW1hc2tfdHlwZSkgewotCWNhc2UgUEFEQVRBX0NQVV9QQVJBTExFTDoKLQkJc2VyaWFsX21hc2sgPSBwaW5zdC0mZ3Q7Y3B1bWFzay5jYmNwdTsKLQkJcGFyYWxsZWxfbWFzayA9IGNwdW1hc2s7Ci0JCWJyZWFrOwotCWNhc2UgUEFEQVRBX0NQVV9TRVJJQUw6Ci0JCXBhcmFsbGVsX21hc2sgPSBwaW5zdC0mZ3Q7Y3B1bWFzay5wY3B1OwotCQlzZXJpYWxfbWFzayA9IGNwdW1hc2s7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCSBnb3RvIG91dDsKLQl9Ci0KLQllcnIgPSAgX19wYWRhdGFfc2V0X2NwdW1hc2tzKHBpbnN0LCBwYXJhbGxlbF9tYXNrLCBzZXJpYWxfbWFzayk7Ci0KLW91dDoKLQltdXRleF91bmxvY2soJmFtcDtwaW5zdC0mZ3Q7bG9jayk7Ci0JY3B1c19yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIGVycjsKLX0KLUVYUE9SVF9TWU1CT0wocGFkYXRhX3NldF9jcHVtYXNrKTsKLQotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCi1zdGF0aWMgaW5saW5lIGludCBwaW5zdF9oYXNfY3B1KHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgY3B1KQotewotCXJldHVybiBjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgcGluc3QtJmd0O2NwdW1hc2sucGNwdSkgfHwKLQkJY3B1bWFza190ZXN0X2NwdShjcHUsIHBpbnN0LSZndDtjcHVtYXNrLmNiY3B1KTsKLX0KLQotc3RhdGljIGludCBwYWRhdGFfY3B1X29ubGluZSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKLXsKLQlzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdDsKLQlpbnQgcmV0OwotCi0JcGluc3QgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UsIGNwdWhwX25vZGUpOwotCWlmICghcGluc3RfaGFzX2NwdShwaW5zdCwgY3B1KSkKLQkJcmV0dXJuIDA7Ci0KLQltdXRleF9sb2NrKCZhbXA7cGluc3QtJmd0O2xvY2spOwotCi0JcmV0ID0gcGFkYXRhX3JlcGxhY2UocGluc3QsIC0xKTsKLQotCWlmIChwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGluc3QtJmd0O2NwdW1hc2sucGNwdSwgLTEpICZhbXA7JmFtcDsKLQkgICAgcGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2socGluc3QsIHBpbnN0LSZndDtjcHVtYXNrLmNiY3B1LCAtMSkpCi0JCV9fcGFkYXRhX3N0YXJ0KHBpbnN0KTsKLQotCW11dGV4X3VubG9jaygmYW1wO3BpbnN0LSZndDtsb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHBhZGF0YV9jcHVfb2ZmbGluZSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKLXsKLQlzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdDsKLQlpbnQgcmV0OwotCi0JcGluc3QgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UsIGNwdWhwX25vZGUpOwotCWlmICghcGluc3RfaGFzX2NwdShwaW5zdCwgY3B1KSkKLQkJcmV0dXJuIDA7Ci0KLQltdXRleF9sb2NrKCZhbXA7cGluc3QtJmd0O2xvY2spOwotCi0JaWYgKCFwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGluc3QtJmd0O2NwdW1hc2sucGNwdSwgY3B1KSB8fAotCSAgICAhcGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2socGluc3QsIHBpbnN0LSZndDtjcHVtYXNrLmNiY3B1LCBjcHUpKQotCQlfX3BhZGF0YV9zdG9wKHBpbnN0KTsKLQotCXJldCA9IHBhZGF0YV9yZXBsYWNlKHBpbnN0LCBjcHUpOwotCi0JbXV0ZXhfdW5sb2NrKCZhbXA7cGluc3QtJmd0O2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBlbnVtIGNwdWhwX3N0YXRlIGhwX29ubGluZTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBfX3BhZGF0YV9mcmVlKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KQotewotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCWNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzKGhwX29ubGluZSwgJmFtcDtwaW5zdC0mZ3Q7Y3B1aHBfbm9kZSk7Ci0jZW5kaWYKLQotCVdBUk5fT04oIWxpc3RfZW1wdHkoJmFtcDtwaW5zdC0mZ3Q7cHNsaXN0KSk7Ci0KLQlmcmVlX2NwdW1hc2tfdmFyKHBpbnN0LSZndDtjcHVtYXNrLnBjcHUpOwotCWZyZWVfY3B1bWFza192YXIocGluc3QtJmd0O2NwdW1hc2suY2JjcHUpOwotCWZyZWVfY3B1bWFza192YXIocGluc3QtJmd0O3ZhbGlkYXRlX2NwdW1hc2spOwotCWRlc3Ryb3lfd29ya3F1ZXVlKHBpbnN0LSZndDtzZXJpYWxfd3EpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKHBpbnN0LSZndDtwYXJhbGxlbF93cSk7Ci0Ja2ZyZWUocGluc3QpOwotfQotCi0jZGVmaW5lIGtvYmoycGluc3QoX2tvYmopCQkJCQlcCi0JY29udGFpbmVyX29mKF9rb2JqLCBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlLCBrb2JqKQotI2RlZmluZSBhdHRyMnBlbnRyeShfYXR0cikJCQkJCVwKLQljb250YWluZXJfb2ZfY29uc3QoX2F0dHIsIHN0cnVjdCBwYWRhdGFfc3lzZnNfZW50cnksIGF0dHIpCi0KLXN0YXRpYyB2b2lkIHBhZGF0YV9zeXNmc19yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQotewotCXN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0ID0ga29iajJwaW5zdChrb2JqKTsKLQlfX3BhZGF0YV9mcmVlKHBpbnN0KTsKLX0KLQotc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSB7Ci0Jc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKiwgY2hhciAqKTsKLQlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKiwgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqLAotCQkJIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKLX07Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCAgY2hhciAqYnVmKQotewotCXN0cnVjdCBjcHVtYXNrICpjcHVtYXNrOwotCXNzaXplX3QgbGVuOwotCi0JbXV0ZXhfbG9jaygmYW1wO3BpbnN0LSZndDtsb2NrKTsKLQlpZiAoIXN0cmNtcChhdHRyLSZndDtuYW1lLCAmIzM0O3NlcmlhbF9jcHVtYXNrJiMzNDspKQotCQljcHVtYXNrID0gcGluc3QtJmd0O2NwdW1hc2suY2JjcHU7Ci0JZWxzZQotCQljcHVtYXNrID0gcGluc3QtJmd0O2NwdW1hc2sucGNwdTsKLQotCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAmIzM0OyUqcGJcbiYjMzQ7LAotCQkgICAgICAgbnJfY3B1X2lkcywgY3B1bWFza19iaXRzKGNwdW1hc2spKTsKLQltdXRleF91bmxvY2soJmFtcDtwaW5zdC0mZ3Q7bG9jayk7Ci0JcmV0dXJuIGxlbiAmbHQ7IFBBR0VfU0laRSA/IGxlbiA6IC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2NwdW1hc2soc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCWNwdW1hc2tfdmFyX3QgbmV3X2NwdW1hc2s7Ci0Jc3NpemVfdCByZXQ7Ci0JaW50IG1hc2tfdHlwZTsKLQotCWlmICghYWxsb2NfY3B1bWFza192YXIoJmFtcDtuZXdfY3B1bWFzaywgR0ZQX0tFUk5FTCkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmV0ID0gYml0bWFwX3BhcnNlKGJ1ZiwgY291bnQsIGNwdW1hc2tfYml0cyhuZXdfY3B1bWFzayksCi0JCQkgICBucl9jcHVtYXNrX2JpdHMpOwotCWlmIChyZXQgJmx0OyAwKQotCQlnb3RvIG91dDsKLQotCW1hc2tfdHlwZSA9ICFzdHJjbXAoYXR0ci0mZ3Q7bmFtZSwgJiMzNDtzZXJpYWxfY3B1bWFzayYjMzQ7KSA/Ci0JCVBBREFUQV9DUFVfU0VSSUFMIDogUEFEQVRBX0NQVV9QQVJBTExFTDsKLQlyZXQgPSBwYWRhdGFfc2V0X2NwdW1hc2socGluc3QsIG1hc2tfdHlwZSwgbmV3X2NwdW1hc2spOwotCWlmICghcmV0KQotCQlyZXQgPSBjb3VudDsKLQotb3V0OgotCWZyZWVfY3B1bWFza192YXIobmV3X2NwdW1hc2spOwotCXJldHVybiByZXQ7Ci19Ci0KLSNkZWZpbmUgUEFEQVRBX0FUVFJfUlcoX25hbWUsIF9zaG93X25hbWUsIF9zdG9yZV9uYW1lKQkJXAotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGFkYXRhX3N5c2ZzX2VudHJ5IF9uYW1lIyNfYXR0ciA9CVwKLQkJX19BVFRSKF9uYW1lLCAwNjQ0LCBfc2hvd19uYW1lLCBfc3RvcmVfbmFtZSkKLSNkZWZpbmUgUEFEQVRBX0FUVFJfUk8oX25hbWUsIF9zaG93X25hbWUpCQkJXAotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGFkYXRhX3N5c2ZzX2VudHJ5IF9uYW1lIyNfYXR0ciA9CVwKLQkJX19BVFRSKF9uYW1lLCAwNDAwLCBfc2hvd19uYW1lLCBOVUxMKQotCi1QQURBVEFfQVRUUl9SVyhzZXJpYWxfY3B1bWFzaywgc2hvd19jcHVtYXNrLCBzdG9yZV9jcHVtYXNrKTsKLVBBREFUQV9BVFRSX1JXKHBhcmFsbGVsX2NwdW1hc2ssIHNob3dfY3B1bWFzaywgc3RvcmVfY3B1bWFzayk7Ci0KLS8qCi0gKiBQYWRhdGEgc3lzZnMgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBvYmplY3RzOgotICogc2VyaWFsX2NwdW1hc2sgICBbUlddIC0gY3B1bWFzayBmb3Igc2VyaWFsIHdvcmtlcnMKLSAqIHBhcmFsbGVsX2NwdW1hc2sgW1JXXSAtIGNwdW1hc2sgZm9yIHBhcmFsbGVsIHdvcmtlcnMKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmNvbnN0IHBhZGF0YV9kZWZhdWx0X2F0dHJzW10gPSB7Ci0JJmFtcDtzZXJpYWxfY3B1bWFza19hdHRyLmF0dHIsCi0JJmFtcDtwYXJhbGxlbF9jcHVtYXNrX2F0dHIuYXR0ciwKLQlOVUxMLAotfTsKLUFUVFJJQlVURV9HUk9VUFMocGFkYXRhX2RlZmF1bHQpOwotCi1zdGF0aWMgc3NpemVfdCBwYWRhdGFfc3lzZnNfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCWNvbnN0IHN0cnVjdCBwYWRhdGFfc3lzZnNfZW50cnkgKnBlbnRyeTsKLQlzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdDsKLQlzc2l6ZV90IHJldCA9IC1FSU87Ci0KLQlwaW5zdCA9IGtvYmoycGluc3Qoa29iaik7Ci0JcGVudHJ5ID0gYXR0cjJwZW50cnkoYXR0cik7Ci0JaWYgKHBlbnRyeS0mZ3Q7c2hvdykKLQkJcmV0ID0gcGVudHJ5LSZndDtzaG93KHBpbnN0LCBhdHRyLCBidWYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgcGFkYXRhX3N5c2ZzX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JY29uc3Qgc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSAqcGVudHJ5OwotCXN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0OwotCXNzaXplX3QgcmV0ID0gLUVJTzsKLQotCXBpbnN0ID0ga29iajJwaW5zdChrb2JqKTsKLQlwZW50cnkgPSBhdHRyMnBlbnRyeShhdHRyKTsKLQlpZiAocGVudHJ5LSZndDtzdG9yZSkKLQkJcmV0ID0gcGVudHJ5LSZndDtzdG9yZShwaW5zdCwgYXR0ciwgYnVmLCBjb3VudCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN5c2ZzX29wcyBwYWRhdGFfc3lzZnNfb3BzID0gewotCS5zaG93ID0gcGFkYXRhX3N5c2ZzX3Nob3csCi0JLnN0b3JlID0gcGFkYXRhX3N5c2ZzX3N0b3JlLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBrb2JqX3R5cGUgcGFkYXRhX2F0dHJfdHlwZSA9IHsKLQkuc3lzZnNfb3BzID0gJmFtcDtwYWRhdGFfc3lzZnNfb3BzLAotCS5kZWZhdWx0X2dyb3VwcyA9IHBhZGF0YV9kZWZhdWx0X2dyb3VwcywKLQkucmVsZWFzZSA9IHBhZGF0YV9zeXNmc19yZWxlYXNlLAotfTsKLQotLyoqCi0gKiBwYWRhdGFfYWxsb2MgLSBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIHBhZGF0YSBpbnN0YW5jZQotICogQG5hbWU6IHVzZWQgdG8gaWRlbnRpZnkgdGhlIGluc3RhbmNlCi0gKgotICogUmV0dXJuOiBuZXcgaW5zdGFuY2Ugb24gc3VjY2VzcywgTlVMTCBvbiBlcnJvcgotICovCi1zdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwYWRhdGFfYWxsb2MoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdDsKLQotCXBpbnN0ID0ga3phbGxvY19vYmooc3RydWN0IHBhZGF0YV9pbnN0YW5jZSk7Ci0JaWYgKCFwaW5zdCkKLQkJZ290byBlcnI7Ci0KLQlwaW5zdC0mZ3Q7cGFyYWxsZWxfd3EgPSBhbGxvY193b3JrcXVldWUoJiMzNDslc19wYXJhbGxlbCYjMzQ7LCBXUV9VTkJPVU5ELCAwLAotCQkJCQkgICAgIG5hbWUpOwotCWlmICghcGluc3QtJmd0O3BhcmFsbGVsX3dxKQotCQlnb3RvIGVycl9mcmVlX2luc3Q7Ci0KLQljcHVzX3JlYWRfbG9jaygpOwotCi0JcGluc3QtJmd0O3NlcmlhbF93cSA9IGFsbG9jX3dvcmtxdWV1ZSgmIzM0OyVzX3NlcmlhbCYjMzQ7LAotCQkJCQkgICBXUV9NRU1fUkVDTEFJTSB8IFdRX0NQVV9JTlRFTlNJVkUgfCBXUV9QRVJDUFUsCi0JCQkJCSAgIDEsIG5hbWUpOwotCWlmICghcGluc3QtJmd0O3NlcmlhbF93cSkKLQkJZ290byBlcnJfcHV0X2NwdXM7Ci0KLQlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZhbXA7cGluc3QtJmd0O2NwdW1hc2sucGNwdSwgR0ZQX0tFUk5FTCkpCi0JCWdvdG8gZXJyX2ZyZWVfc2VyaWFsX3dxOwotCWlmICghYWxsb2NfY3B1bWFza192YXIoJmFtcDtwaW5zdC0mZ3Q7Y3B1bWFzay5jYmNwdSwgR0ZQX0tFUk5FTCkpCi0JCWdvdG8gZXJyX2ZyZWVfcF9tYXNrOwotCWlmICghYWxsb2NfY3B1bWFza192YXIoJmFtcDtwaW5zdC0mZ3Q7dmFsaWRhdGVfY3B1bWFzaywgR0ZQX0tFUk5FTCkpCi0JCWdvdG8gZXJyX2ZyZWVfY2JfbWFzazsKLQotCUlOSVRfTElTVF9IRUFEKCZhbXA7cGluc3QtJmd0O3BzbGlzdCk7Ci0KLQljcHVtYXNrX2NvcHkocGluc3QtJmd0O2NwdW1hc2sucGNwdSwgY3B1X3Bvc3NpYmxlX21hc2spOwotCWNwdW1hc2tfY29weShwaW5zdC0mZ3Q7Y3B1bWFzay5jYmNwdSwgY3B1X3Bvc3NpYmxlX21hc2spOwotCi0JaWYgKHBhZGF0YV9zZXR1cF9jcHVtYXNrcyhwaW5zdCkpCi0JCWdvdG8gZXJyX2ZyZWVfdl9tYXNrOwotCi0JX19wYWRhdGFfc3RhcnQocGluc3QpOwotCi0Ja29iamVjdF9pbml0KCZhbXA7cGluc3QtJmd0O2tvYmosICZhbXA7cGFkYXRhX2F0dHJfdHlwZSk7Ci0JbXV0ZXhfaW5pdCgmYW1wO3BpbnN0LSZndDtsb2NrKTsKLQotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCWNwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZV9ub2NhbGxzX2NwdXNsb2NrZWQoaHBfb25saW5lLAotCQkJCQkJICAgICZhbXA7cGluc3QtJmd0O2NwdWhwX25vZGUpOwotI2VuZGlmCi0KLQljcHVzX3JlYWRfdW5sb2NrKCk7Ci0KLQlyZXR1cm4gcGluc3Q7Ci0KLWVycl9mcmVlX3ZfbWFzazoKLQlmcmVlX2NwdW1hc2tfdmFyKHBpbnN0LSZndDt2YWxpZGF0ZV9jcHVtYXNrKTsKLWVycl9mcmVlX2NiX21hc2s6Ci0JZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC0mZ3Q7Y3B1bWFzay5jYmNwdSk7Ci1lcnJfZnJlZV9wX21hc2s6Ci0JZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC0mZ3Q7Y3B1bWFzay5wY3B1KTsKLWVycl9mcmVlX3NlcmlhbF93cToKLQlkZXN0cm95X3dvcmtxdWV1ZShwaW5zdC0mZ3Q7c2VyaWFsX3dxKTsKLWVycl9wdXRfY3B1czoKLQljcHVzX3JlYWRfdW5sb2NrKCk7Ci0JZGVzdHJveV93b3JrcXVldWUocGluc3QtJmd0O3BhcmFsbGVsX3dxKTsKLWVycl9mcmVlX2luc3Q6Ci0Ja2ZyZWUocGluc3QpOwotZXJyOgotCXJldHVybiBOVUxMOwotfQotRVhQT1JUX1NZTUJPTChwYWRhdGFfYWxsb2MpOwotCi0vKioKLSAqIHBhZGF0YV9mcmVlIC0gZnJlZSBhIHBhZGF0YSBpbnN0YW5jZQotICoKLSAqIEBwaW5zdDogcGFkYXRhIGluc3RhbmNlIHRvIGZyZWUKLSAqLwotdm9pZCBwYWRhdGFfZnJlZShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCkKLXsKLQlrb2JqZWN0X3B1dCgmYW1wO3BpbnN0LSZndDtrb2JqKTsKLX0KLUVYUE9SVF9TWU1CT0wocGFkYXRhX2ZyZWUpOwotCi0vKioKLSAqIHBhZGF0YV9hbGxvY19zaGVsbCAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHBhZGF0YSBzaGVsbC4KLSAqCi0gKiBAcGluc3Q6IFBhcmVudCBwYWRhdGFfaW5zdGFuY2Ugb2JqZWN0LgotICoKLSAqIFJldHVybjogbmV3IHNoZWxsIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZXJyb3IKLSAqLwotc3RydWN0IHBhZGF0YV9zaGVsbCAqcGFkYXRhX2FsbG9jX3NoZWxsKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KQotewotCXN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDsKLQlzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwczsKLQotCXBzID0ga3phbGxvY19vYmooKnBzKTsKLQlpZiAoIXBzKQotCQlnb3RvIG91dDsKLQotCXBzLSZndDtwaW5zdCA9IHBpbnN0OwotCi0JY3B1c19yZWFkX2xvY2soKTsKLQlwZCA9IHBhZGF0YV9hbGxvY19wZChwcywgLTEpOwotCWNwdXNfcmVhZF91bmxvY2soKTsKLQotCWlmICghcGQpCi0JCWdvdG8gb3V0X2ZyZWVfcHM7Ci0KLQltdXRleF9sb2NrKCZhbXA7cGluc3QtJmd0O2xvY2spOwotCVJDVV9JTklUX1BPSU5URVIocHMtJmd0O3BkLCBwZCk7Ci0JbGlzdF9hZGQoJmFtcDtwcy0mZ3Q7bGlzdCwgJmFtcDtwaW5zdC0mZ3Q7cHNsaXN0KTsKLQltdXRleF91bmxvY2soJmFtcDtwaW5zdC0mZ3Q7bG9jayk7Ci0KLQlyZXR1cm4gcHM7Ci0KLW91dF9mcmVlX3BzOgotCWtmcmVlKHBzKTsKLW91dDoKLQlyZXR1cm4gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0wocGFkYXRhX2FsbG9jX3NoZWxsKTsKLQotLyoqCi0gKiBwYWRhdGFfZnJlZV9zaGVsbCAtIGZyZWUgYSBwYWRhdGEgc2hlbGwKLSAqCi0gKiBAcHM6IHBhZGF0YSBzaGVsbCB0byBmcmVlCi0gKi8KLXZvaWQgcGFkYXRhX2ZyZWVfc2hlbGwoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMpCi17Ci0Jc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkOwotCi0JaWYgKCFwcykKLQkJcmV0dXJuOwotCi0JbXV0ZXhfbG9jaygmYW1wO3BzLSZndDtwaW5zdC0mZ3Q7bG9jayk7Ci0JbGlzdF9kZWwoJmFtcDtwcy0mZ3Q7bGlzdCk7Ci0JcGQgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHBzLSZndDtwZCwgMSk7Ci0JcGFkYXRhX3B1dF9wZChwZCk7Ci0JbXV0ZXhfdW5sb2NrKCZhbXA7cHMtJmd0O3BpbnN0LSZndDtsb2NrKTsKLQotCWtmcmVlKHBzKTsKLX0KLUVYUE9SVF9TWU1CT0wocGFkYXRhX2ZyZWVfc2hlbGwpOwotCiB2b2lkIF9faW5pdCBwYWRhdGFfaW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGludCBpLCBwb3NzaWJsZV9jcHVzOwotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCWludCByZXQ7Ci0KLQlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9tdWx0aShDUFVIUF9BUF9PTkxJTkVfRFlOLCAmIzM0O3BhZGF0YTpvbmxpbmUmIzM0OywKLQkJCQkgICAgICBwYWRhdGFfY3B1X29ubGluZSwgcGFkYXRhX2NwdV9vZmZsaW5lKTsKLQlpZiAocmV0ICZsdDsgMCkKLQkJZ290byBlcnI7Ci0JaHBfb25saW5lID0gcmV0OwotI2VuZGlmCiAKIAlwb3NzaWJsZV9jcHVzID0gbnVtX3Bvc3NpYmxlX2NwdXMoKTsKIAlwYWRhdGFfd29ya3MgPSBrbWFsbG9jX29ianMoc3RydWN0IHBhZGF0YV93b3JrLCBwb3NzaWJsZV9jcHVzKTsKLQlpZiAoIXBhZGF0YV93b3JrcykKLQkJZ290byByZW1vdmVfb25saW5lX3N0YXRlOwomIzQzOwlpZiAoIXBhZGF0YV93b3JrcykgewomIzQzOwkJcHJfd2FybigmIzM0O3BhZGF0YTogaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4mIzM0Oyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KIAogCWZvciAoaSA9IDA7IGkgJmx0OyBwb3NzaWJsZV9jcHVzOyAmIzQzOyYjNDM7aSkKIAkJbGlzdF9hZGQoJmFtcDtwYWRhdGFfd29ya3NbaV0ucHdfbGlzdCwgJmFtcDtwYWRhdGFfZnJlZV93b3Jrcyk7Ci0KLQlyZXR1cm47Ci0KLXJlbW92ZV9vbmxpbmVfc3RhdGU6Ci0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0JY3B1aHBfcmVtb3ZlX211bHRpX3N0YXRlKGhwX29ubGluZSk7Ci1lcnI6Ci0jZW5kaWYKLQlwcl93YXJuKCYjMzQ7cGFkYXRhOiBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiYjMzQ7KTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2NyeXB0by90Y3J5cHQvdGNyeXB0X3NwZWVkX2NvbXBhcmUucHkgYi90b29scy9jcnlwdG8vdGNyeXB0L3RjcnlwdF9zcGVlZF9jb21wYXJlLnB5CmluZGV4IGYzZjU3ODNjZGMwNjZiLi4wYmYzOGMwNzNkYmMwMyAxMDA3NTUKLS0tIGEvdG9vbHMvY3J5cHRvL3RjcnlwdC90Y3J5cHRfc3BlZWRfY29tcGFyZS5weQomIzQzOyYjNDM7JiM0MzsgYi90b29scy9jcnlwdG8vdGNyeXB0L3RjcnlwdF9zcGVlZF9jb21wYXJlLnB5CkBAIC0yOCwxOSAmIzQzOzI4LDE2IEBAIG51bV9tYj04CiBtb2RlPTIxMQogCiAjIGJhc2Ugc3BlZWQgdGVzdAotbHNtb2QgfCBncmVwIHBjcnlwdCAmYW1wOyZhbXA7IG1vZHByb2JlIC1yIHBjcnlwdAogZG1lc2cgLUMKLW1vZHByb2JlIHRjcnlwdCBhbGc9JiMzNDtwY3J5cHQocmZjNDEwNihnY20oYWVzKSkpJiMzNDsgdHlwZT0zCiYjNDM7bW9kcHJvYmUgdGNyeXB0IGFsZz0mIzM0O3JmYzQxMDYoZ2NtKGFlcykpJiMzNDsgdHlwZT0zCiBtb2Rwcm9iZSB0Y3J5cHQgbW9kZT0ke21vZGV9IHNlYz0ke3NlY30gbnVtX21iPSR7bnVtX21ifQogZG1lc2cgJmd0OyAke3NlcV9udW19X2Jhc2VfZG1lc2cubG9nCiAKICMgbmV3IHNwZWVkIHRlc3QKLWxzbW9kIHwgZ3JlcCBwY3J5cHQgJmFtcDsmYW1wOyBtb2Rwcm9iZSAtciBwY3J5cHQKIGRtZXNnIC1DCi1tb2Rwcm9iZSB0Y3J5cHQgYWxnPSYjMzQ7cGNyeXB0KHJmYzQxMDYoZ2NtKGFlcykpKSYjMzQ7IHR5cGU9MwomIzQzO21vZHByb2JlIHRjcnlwdCBhbGc9JiMzNDtyZmM0MTA2KGdjbShhZXMpKSYjMzQ7IHR5cGU9MwogbW9kcHJvYmUgdGNyeXB0IG1vZGU9JHttb2RlfSBzZWM9JHtzZWN9IG51bV9tYj0ke251bV9tYn0KIGRtZXNnICZndDsgJHtzZXFfbnVtfV9uZXdfZG1lc2cubG9nCi1sc21vZCB8IGdyZXAgcGNyeXB0ICZhbXA7JmFtcDsgbW9kcHJvYmUgLXIgcGNyeXB0CiAKIHRvb2xzL2NyeXB0by90Y3J5cHQvdGNyeXB0X3NwZWVkX2NvbXBhcmUucHkgXAogICAgICR7c2VxX251bX1fYmFzZV9kbWVzZy5sb2cgXAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNCAwMzozNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTkwOAoJCQkJCQkJb3V0cHV0OiA3MwoJCQkJCQkJdGhvdWdodHM6IDEwMjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyBBc3Nlc3NtZW50OiBgcGNyeXB0YCBSZW1vdmFsKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBhIHBhdGNoIHRoYXQgZXNzZW50aWFsbHkgZ3V0cyB0aGUgYHBjcnlwdGAgZW5naW5lIGFuZCBpdHMgc2VyaWFsaXplZCBqb2IgY2FwYWJpbGl0aWVzIHdpdGhpbiBgcGFkYXRhYC4gIE15IGluaXRpYWwgdGhvdWdodCBpcywgJiMzNDtUaGlzIGlzIGEgKnJlbW92YWwqIHBhdGNoIOKAkyBnb29kLiYjMzQ7ICBObyBuZXcgY29kZSBtZWFucyBwb3RlbnRpYWxseSBsZXNzIHdvcmsgZm9yIG1lLgoKTXkgZm9jdXMgaXMgd2hldGhlciB0aGVyZSYjMzk7cyBhbnl0aGluZyAqbmV3KiB0byBmdXp6LiBUaGUgcGF0Y2ggY2xlYW5zIHVwIHRoZSBgRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9wYWRhdGEucnN0YCwgYE1BSU5UQUlORVJTYCwgcmVtb3ZlcyB0aGUgYGNyeXB0by9wY3J5cHQuY2AsIGBpbmNsdWRlL2NyeXB0by9wY3J5cHQuaGAsIGFuZCBtb2RpZmllcyBgaW5jbHVkZS9saW51eC9wYWRhdGEuaGAgYW5kIGBrZXJuZWwvcGFkYXRhLmNgLiAgU3BlY2lmaWNhbGx5LCB0aGUgZGVsZXRlZCBjb2RlIGluY2x1ZGVzIGBwYWRhdGFfZG9fcGFyYWxsZWxgLCBgcGFkYXRhX2RvX3NlcmlhbGAsIGFuZCBhIGhvc3Qgb2YgYXNzb2NpYXRlZCBmdW5jdGlvbnMuICBJdCBhbHNvIHJlbW92ZXMgdGhlIGBDT05GSUdfQ1JZUFRPX1BDUllQVGAgY29uZmlnIG9wdGlvbi4KClNpbmNlIHRoZSBmdW5jdGlvbmFsaXR5IHJlbW92ZWQgaXMgdGhlIHBhcmFsbGVsIGNyeXB0byBlbmdpbmUgYW5kIHRoZSBzZXJpYWxpemVkIGpvYiBzdXBwb3J0IGZyb20gcGFkYXRhLCBteSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhpcyBkb2VzbiYjMzk7dCBuZWNlc3NpdGF0ZSBmdXp6aW5nLiBNeSBtYWluIGNvbmNlcm4gaXMgdGhhdCBwZXJoYXBzIHRoZSBtdWx0aXRocmVhZGVkIGpvYiBzdXBwb3J0IGhhZCBiZWVuIGFmZmVjdGVkIGluIGEgd2F5IHRoYXQgcmVxdWlyZXMgZnV6emluZy4KCkkmIzM5O20gY2hlY2tpbmcgYGtlcm5lbC9wYWRhdGEuY2AuIGBwYWRhdGFfZG9fbXVsdGl0aHJlYWRlZGAgcmVtYWlucy4gYHBhZGF0YV9pbml0YCBoYXMgYmVlbiBhZGp1c3RlZCwgYnV0IGl0JiMzOTtzICpyZW1vdmluZyogQ1BVIGhvdHBsdWcgc3RhdGUgcmVnaXN0cmF0aW9uIChgY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGlgKS4gVGhpcyB3YXMgZXhjbHVzaXZlbHkgdXNlZCBieSB0aGUgc2VyaWFsaXplZCBqb2Igc3VwcG9ydCwgd2hpY2ggY29uZmlybXMgbXkgYXNzdW1wdGlvbi4gIEZ1bmN0aW9ucyBsaWtlIGBwYWRhdGFfYWxsb2NfcGRgLCBgcGFkYXRhX2ZyZWVfcGRgLCBgcGFkYXRhX3JlcGxhY2VgLCBgcGFkYXRhX3NldF9jcHVtYXNrYCBhcmUgYmVpbmcgcmVtb3ZlZCBhcyB3ZWxsLgoKSSYjMzk7bSB2ZXJ5IGNvbmZpZGVudCBhdCB0aGlzIHBvaW50IHRoYXQgdGhpcyBpcyBhIHB1cmVseSBhZGRpdGl2ZSByZW1vdmFsIHBhdGNoLiAgVGhlcmUmIzM5O3Mgbm8gbmV3IGNvZGUgdG8gdGVzdCwgd2hpY2ggbWVhbnMgdGhlcmUmIzM5O3Mgbm8gbmV3IGF0dGFjayBzdXJmYWNlIHRvIGZ1enouCgpJJiMzOTttIGRvdWJsZS1jaGVja2luZyB0aGUgYGtlcm5lbC9wYWRhdGEuY2AgZGlmZiwgYW5kIGNvbmZpcm0gdGhhdCB0aGUgYWRkaXRpb25zIGluIGBrZXJuZWwvcGFkYXRhLmNgIGFyZSBzaW1wbHkgYCNpbmNsdWRlYHMsIHdoaWNoIHdlcmUgcHJldmlvdXNseSBpbXBsaWNpdGx5IGluY2x1ZGVkIG9yIHJlb3JkZXJlZCwgYXMgd2VsbCBhcyBtaW5vciBhZGp1c3RtZW50cyB0byBgcGFkYXRhX2luaXRgLgoKVGhlcmVmb3JlLCBJJiMzOTttIHNldHRpbmcgYFdvcnRoRnV6emluZz1mYWxzZWAuIFRoZSByZWFzb25pbmcgaXMgdGhhdCB0aGUgcGF0Y2ggKnJlbW92ZXMqIGBwY3J5cHRgIGFuZCBpdHMgcmVsYXRlZCBmdW5jdGlvbmFsaXR5LiBJdCBkb2VzICpub3QqIGludHJvZHVjZSBuZXcgZnVuY3Rpb25hbGl0eSB0byB0ZXN0LgoKSSB3aWxsIGNhbGwgYHNldC1yZXN1bHRzYCB3aXRoIGBXb3J0aEZ1enppbmc9ZmFsc2VgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDAzOjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVtb3ZlcyB0aGUgcGNyeXB0IHBhcmFsbGVsIGNyeXB0byBlbmdpbmUgYW5kIHRoZSBhc3NvY2lhdGVkIHNlcmlhbGl6ZWQgam9iIHN1cHBvcnQgZnJvbSBwYWRhdGEuIEl0IGlzIGEgcHVyZSBjbGVhbnVwL3JlbW92YWwgcGF0Y2ggYW5kIGRvZXMgbm90IGludHJvZHVjZSBhbnkgbmV3IGZ1bmN0aW9uYWwgY29kZSBvciBsb2dpYyB0aGF0IHJlcXVpcmVzIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZW1vdmVzIHRoZSBwY3J5cHQgcGFyYWxsZWwgY3J5cHRvIGVuZ2luZSBhbmQgdGhlIGFzc29jaWF0ZWQgc2VyaWFsaXplZCBqb2Igc3VwcG9ydCBmcm9tIHBhZGF0YS4gSXQgaXMgYSBwdXJlIGNsZWFudXAvcmVtb3ZhbCBwYXRjaCBhbmQgZG9lcyBub3QgaW50cm9kdWNlIGFueSBuZXcgZnVuY3Rpb25hbCBjb2RlIG9yIGxvZ2ljIHRoYXQgcmVxdWlyZXMgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wNy0xNFQwMzozNToxNC43MjkxNjkxMjNaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzQ2MDkzOTI1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVtb3ZlcyB0aGUgcGNyeXB0IHBhcmFsbGVsIGNyeXB0byBlbmdpbmUgYW5kIHRoZSBhc3NvY2lhdGVkIHNlcmlhbGl6ZWQgam9iIHN1cHBvcnQgZnJvbSBwYWRhdGEuIEl0IGlzIGEgcHVyZSBjbGVhbnVwL3JlbW92YWwgcGF0Y2ggYW5kIGRvZXMgbm90IGludHJvZHVjZSBhbnkgbmV3IGZ1bmN0aW9uYWwgY29kZSBvciBsb2dpYyB0aGF0IHJlcXVpcmVzIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNFQwMzozNToxNC43MjkxNzM1OTRaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc4Njc4MzQyMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGNjMzk0Y2M5Y2UxZGNjYzQxNWJjOGZjNjVmZTY1NjdhYThjNzUzNDRcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFR1ZSBKdWwgMTQgMDM6MzU6MTIgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9wYWRhdGEucnN0IGIvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9wYWRhdGEucnN0XFxuaW5kZXggMDViNzNjNmMxMDVmMDQuLmQ3ZGM3ZTMzMDU0ZGJkIDEwMDY0NFxcbi0tLSBhL0RvY3VtZW50YXRpb24vY29yZS1hcGkvcGFkYXRhLnJzdFxcbisrKyBiL0RvY3VtZW50YXRpb24vY29yZS1hcGkvcGFkYXRhLnJzdFxcbkBAIC03LDE1MiArNywxMSBAQCBUaGUgcGFkYXRhIHBhcmFsbGVsIGV4ZWN1dGlvbiBtZWNoYW5pc21cXG4gOkRhdGU6IE1heSAyMDIwXFxuIFxcbiBQYWRhdGEgaXMgYSBtZWNoYW5pc20gYnkgd2hpY2ggdGhlIGtlcm5lbCBjYW4gZmFybSBqb2JzIG91dCB0byBiZSBkb25lIGluXFxuLXBhcmFsbGVsIG9uIG11bHRpcGxlIENQVXMgd2hpbGUgb3B0aW9uYWxseSByZXRhaW5pbmcgdGhlaXIgb3JkZXJpbmcuXFxuK3BhcmFsbGVsIG9uIG11bHRpcGxlIENQVXMgd2hpbGUgY29vcmRpbmF0aW5nIGJldHdlZW4gdGhyZWFkcy5cXG4gXFxuLUl0IHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCBmb3IgSVBzZWMsIHdoaWNoIG5lZWRzIHRvIHBlcmZvcm0gZW5jcnlwdGlvbiBhbmRcXG4tZGVjcnlwdGlvbiBvbiBsYXJnZSBudW1iZXJzIG9mIHBhY2tldHMgd2l0aG91dCByZW9yZGVyaW5nIHRob3NlIHBhY2tldHMuICBUaGlzXFxuLWlzIGN1cnJlbnRseSB0aGUgc29sZSBjb25zdW1lciBvZiBwYWRhdGEncyBzZXJpYWxpemVkIGpvYiBzdXBwb3J0Llxcbi1cXG4tUGFkYXRhIGFsc28gc3VwcG9ydHMgbXVsdGl0aHJlYWRlZCBqb2JzLCBzcGxpdHRpbmcgdXAgdGhlIGpvYiBldmVubHkgd2hpbGUgbG9hZFxcbitQYWRhdGEgc3VwcG9ydHMgbXVsdGl0aHJlYWRlZCBqb2JzLCBzcGxpdHRpbmcgdXAgdGhlIGpvYiBldmVubHkgd2hpbGUgbG9hZFxcbiBiYWxhbmNpbmcgYW5kIGNvb3JkaW5hdGluZyBiZXR3ZWVuIHRocmVhZHMuXFxuIFxcbi1SdW5uaW5nIFNlcmlhbGl6ZWQgSm9ic1xcbi09PT09PT09PT09PT09PT09PT09PT09PVxcbi1cXG4tSW5pdGlhbGl6aW5nXFxuLS0tLS0tLS0tLS0tLVxcbi1cXG4tVGhlIGZpcnN0IHN0ZXAgaW4gdXNpbmcgcGFkYXRhIHRvIHJ1biBzZXJpYWxpemVkIGpvYnMgaXMgdG8gc2V0IHVwIGFcXG4tcGFkYXRhX2luc3RhbmNlIHN0cnVjdHVyZSBmb3Igb3ZlcmFsbCBjb250cm9sIG9mIGhvdyBqb2JzIGFyZSB0byBiZSBydW46Olxcbi1cXG4tICAgICNpbmNsdWRlIFxcdTAwM2NsaW51eC9wYWRhdGEuaFxcdTAwM2VcXG4tXFxuLSAgICBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwYWRhdGFfYWxsb2MoY29uc3QgY2hhciAqbmFtZSk7XFxuLVxcbi0nbmFtZScgc2ltcGx5IGlkZW50aWZpZXMgdGhlIGluc3RhbmNlLlxcbi1cXG4tVGhlbiwgY29tcGxldGUgcGFkYXRhIGluaXRpYWxpemF0aW9uIGJ5IGFsbG9jYXRpbmcgYSBwYWRhdGFfc2hlbGw6Olxcbi1cXG4tICAgc3RydWN0IHBhZGF0YV9zaGVsbCAqcGFkYXRhX2FsbG9jX3NoZWxsKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KTtcXG4tXFxuLUEgcGFkYXRhX3NoZWxsIGlzIHVzZWQgdG8gc3VibWl0IGEgam9iIHRvIHBhZGF0YSBhbmQgYWxsb3dzIGEgc2VyaWVzIG9mIHN1Y2hcXG4tam9icyB0byBiZSBzZXJpYWxpemVkIGluZGVwZW5kZW50bHkuICBBIHBhZGF0YV9pbnN0YW5jZSBtYXkgaGF2ZSBvbmUgb3IgbW9yZVxcbi1wYWRhdGFfc2hlbGxzIGFzc29jaWF0ZWQgd2l0aCBpdCwgZWFjaCBhbGxvd2luZyBhIHNlcGFyYXRlIHNlcmllcyBvZiBqb2JzLlxcbi1cXG4tTW9kaWZ5aW5nIGNwdW1hc2tzXFxuLS0tLS0tLS0tLS0tLS0tLS0tLVxcbi1cXG4tVGhlIENQVXMgdXNlZCB0byBydW4gam9icyBjYW4gYmUgY2hhbmdlZCBpbiB0d28gd2F5cywgcHJvZ3JhbW1hdGljYWxseSB3aXRoXFxuLXBhZGF0YV9zZXRfY3B1bWFzaygpIG9yIHZpYSBzeXNmcy4gIFRoZSBmb3JtZXIgaXMgZGVmaW5lZDo6XFxuLVxcbi0gICAgaW50IHBhZGF0YV9zZXRfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdW1hc2tfdHlwZSxcXG4tXFx0XFx0XFx0ICAgY3B1bWFza192YXJfdCBjcHVtYXNrKTtcXG4tXFxuLUhlcmUgY3B1bWFza190eXBlIGlzIG9uZSBvZiBQQURBVEFfQ1BVX1BBUkFMTEVMIG9yIFBBREFUQV9DUFVfU0VSSUFMLCB3aGVyZSBhXFxuLXBhcmFsbGVsIGNwdW1hc2sgZGVzY3JpYmVzIHdoaWNoIHByb2Nlc3NvcnMgd2lsbCBiZSB1c2VkIHRvIGV4ZWN1dGUgam9ic1xcbi1zdWJtaXR0ZWQgdG8gdGhpcyBpbnN0YW5jZSBpbiBwYXJhbGxlbCBhbmQgYSBzZXJpYWwgY3B1bWFzayBkZWZpbmVzIHdoaWNoXFxuLXByb2Nlc3NvcnMgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZCBhcyB0aGUgc2VyaWFsaXphdGlvbiBjYWxsYmFjayBwcm9jZXNzb3IuXFxuLWNwdW1hc2sgc3BlY2lmaWVzIHRoZSBuZXcgY3B1bWFzayB0byB1c2UuXFxuLVxcbi1UaGVyZSBtYXkgYmUgc3lzZnMgZmlsZXMgZm9yIGFuIGluc3RhbmNlJ3MgY3B1bWFza3MuICBGb3IgZXhhbXBsZSwgcGNyeXB0J3NcXG4tbGl2ZSBpbiAvc3lzL2tlcm5lbC9wY3J5cHQvXFx1MDAzY2luc3RhbmNlLW5hbWVcXHUwMDNlLiAgV2l0aGluIGFuIGluc3RhbmNlJ3MgZGlyZWN0b3J5XFxuLXRoZXJlIGFyZSB0d28gZmlsZXMsIHBhcmFsbGVsX2NwdW1hc2sgYW5kIHNlcmlhbF9jcHVtYXNrLCBhbmQgZWl0aGVyIGNwdW1hc2tcXG4tbWF5IGJlIGNoYW5nZWQgYnkgZWNob2luZyBhIGJpdG1hc2sgaW50byB0aGUgZmlsZSwgZm9yIGV4YW1wbGU6Olxcbi1cXG4tICAgIGVjaG8gZiBcXHUwMDNlIC9zeXMva2VybmVsL3BjcnlwdC9wZW5jcnlwdC9wYXJhbGxlbF9jcHVtYXNrXFxuLVxcbi1SZWFkaW5nIG9uZSBvZiB0aGVzZSBmaWxlcyBzaG93cyB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrLCB3aGljaCBtYXkgYmVcXG4tZGlmZmVyZW50IGZyb20gdGhlICd1c2FibGUnIGNwdW1hc2suXFxuLVxcbi1QYWRhdGEgbWFpbnRhaW5zIHR3byBwYWlycyBvZiBjcHVtYXNrcyBpbnRlcm5hbGx5LCB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrc1xcbi1hbmQgdGhlICd1c2FibGUnIGNwdW1hc2tzLiAgKEVhY2ggcGFpciBjb25zaXN0cyBvZiBhIHBhcmFsbGVsIGFuZCBhIHNlcmlhbFxcbi1jcHVtYXNrLikgIFRoZSB1c2VyLXN1cHBsaWVkIGNwdW1hc2tzIGRlZmF1bHQgdG8gYWxsIHBvc3NpYmxlIENQVXMgb24gaW5zdGFuY2VcXG4tYWxsb2NhdGlvbiBhbmQgbWF5IGJlIGNoYW5nZWQgYXMgYWJvdmUuICBUaGUgdXNhYmxlIGNwdW1hc2tzIGFyZSBhbHdheXMgYVxcbi1zdWJzZXQgb2YgdGhlIHVzZXItc3VwcGxpZWQgY3B1bWFza3MgYW5kIGNvbnRhaW4gb25seSB0aGUgb25saW5lIENQVXMgaW4gdGhlXFxuLXVzZXItc3VwcGxpZWQgbWFza3M7IHRoZXNlIGFyZSB0aGUgY3B1bWFza3MgcGFkYXRhIGFjdHVhbGx5IHVzZXMuICBTbyBpdCBpc1xcbi1sZWdhbCB0byBzdXBwbHkgYSBjcHVtYXNrIHRvIHBhZGF0YSB0aGF0IGNvbnRhaW5zIG9mZmxpbmUgQ1BVcy4gIE9uY2UgYW5cXG4tb2ZmbGluZSBDUFUgaW4gdGhlIHVzZXItc3VwcGxpZWQgY3B1bWFzayBjb21lcyBvbmxpbmUsIHBhZGF0YSBpcyBnb2luZyB0byB1c2VcXG4taXQuXFxuLVxcbi1DaGFuZ2luZyB0aGUgQ1BVIG1hc2tzIGFyZSBleHBlbnNpdmUgb3BlcmF0aW9ucywgc28gaXQgc2hvdWxkIG5vdCBiZSBkb25lIHdpdGhcXG4tZ3JlYXQgZnJlcXVlbmN5Llxcbi1cXG4tUnVubmluZyBBIEpvYlxcbi0tLS0tLS0tLS0tLS0tXFxuLVxcbi1BY3R1YWxseSBzdWJtaXR0aW5nIHdvcmsgdG8gdGhlIHBhZGF0YSBpbnN0YW5jZSByZXF1aXJlcyB0aGUgY3JlYXRpb24gb2YgYVxcbi1wYWRhdGFfcHJpdiBzdHJ1Y3R1cmUsIHdoaWNoIHJlcHJlc2VudHMgb25lIGpvYjo6XFxuLVxcbi0gICAgc3RydWN0IHBhZGF0YV9wcml2IHtcXG4tICAgICAgICAvKiBPdGhlciBzdHVmZiBoZXJlLi4uICovXFxuLVxcdHZvaWQgICAgICAgICAgICAgICAgICAgICgqcGFyYWxsZWwpKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTtcXG4tXFx0dm9pZCAgICAgICAgICAgICAgICAgICAgKCpzZXJpYWwpKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTtcXG4tICAgIH07XFxuLVxcbi1UaGlzIHN0cnVjdHVyZSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgZW1iZWRkZWQgd2l0aGluIHNvbWUgbGFyZ2VyXFxuLXN0cnVjdHVyZSBzcGVjaWZpYyB0byB0aGUgd29yayB0byBiZSBkb25lLiAgTW9zdCBvZiBpdHMgZmllbGRzIGFyZSBwcml2YXRlIHRvXFxuLXBhZGF0YSwgYnV0IHRoZSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIHplcm9lZCBhdCBpbml0aWFsaXNhdGlvbiB0aW1lLCBhbmQgdGhlXFxuLXBhcmFsbGVsKCkgYW5kIHNlcmlhbCgpIGZ1bmN0aW9ucyBzaG91bGQgYmUgcHJvdmlkZWQuICBUaG9zZSBmdW5jdGlvbnMgd2lsbFxcbi1iZSBjYWxsZWQgaW4gdGhlIHByb2Nlc3Mgb2YgZ2V0dGluZyB0aGUgd29yayBkb25lIGFzIHdlIHdpbGwgc2VlXFxuLW1vbWVudGFyaWx5Llxcbi1cXG4tVGhlIHN1Ym1pc3Npb24gb2YgdGhlIGpvYiBpcyBkb25lIHdpdGg6Olxcbi1cXG4tICAgIGludCBwYWRhdGFfZG9fcGFyYWxsZWwoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsXFxuLVxcdFxcdCAgICAgICAgICAgc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEsIGludCAqY2JfY3B1KTtcXG4tXFxuLVRoZSBwcyBhbmQgcGFkYXRhIHN0cnVjdHVyZXMgbXVzdCBiZSBzZXQgdXAgYXMgZGVzY3JpYmVkIGFib3ZlOyBjYl9jcHVcXG4tcG9pbnRzIHRvIHRoZSBwcmVmZXJyZWQgQ1BVIHRvIGJlIHVzZWQgZm9yIHRoZSBmaW5hbCBjYWxsYmFjayB3aGVuIHRoZSBqb2IgaXNcXG4tZG9uZTsgaXQgbXVzdCBiZSBpbiB0aGUgY3VycmVudCBpbnN0YW5jZSdzIENQVSBtYXNrIChpZiBub3QgdGhlIGNiX2NwdSBwb2ludGVyXFxuLWlzIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIENQVSBhY3R1YWxseSBjaG9zZW4pLiAgVGhlIHJldHVybiB2YWx1ZSBmcm9tXFxuLXBhZGF0YV9kb19wYXJhbGxlbCgpIGlzIHplcm8gb24gc3VjY2VzcywgaW5kaWNhdGluZyB0aGF0IHRoZSBqb2IgaXMgaW5cXG4tcHJvZ3Jlc3MuIC1FQlVTWSBtZWFucyB0aGF0IHNvbWVib2R5LCBzb21ld2hlcmUgZWxzZSBpcyBtZXNzaW5nIHdpdGggdGhlXFxuLWluc3RhbmNlJ3MgQ1BVIG1hc2ssIHdoaWxlIC1FSU5WQUwgaXMgYSBjb21wbGFpbnQgYWJvdXQgY2JfY3B1IG5vdCBiZWluZyBpbiB0aGVcXG4tc2VyaWFsIGNwdW1hc2ssIG5vIG9ubGluZSBDUFVzIGluIHRoZSBwYXJhbGxlbCBvciBzZXJpYWwgY3B1bWFza3MsIG9yIGEgc3RvcHBlZFxcbi1pbnN0YW5jZS5cXG4tXFxuLUVhY2ggam9iIHN1Ym1pdHRlZCB0byBwYWRhdGFfZG9fcGFyYWxsZWwoKSB3aWxsLCBpbiB0dXJuLCBiZSBwYXNzZWQgdG9cXG4tZXhhY3RseSBvbmUgY2FsbCB0byB0aGUgYWJvdmUtbWVudGlvbmVkIHBhcmFsbGVsKCkgZnVuY3Rpb24sIG9uIG9uZSBDUFUsIHNvXFxuLXRydWUgcGFyYWxsZWxpc20gaXMgYWNoaWV2ZWQgYnkgc3VibWl0dGluZyBtdWx0aXBsZSBqb2JzLiAgcGFyYWxsZWwoKSBydW5zIHdpdGhcXG4tc29mdHdhcmUgaW50ZXJydXB0cyBkaXNhYmxlZCBhbmQgdGh1cyBjYW5ub3Qgc2xlZXAuICBUaGUgcGFyYWxsZWwoKVxcbi1mdW5jdGlvbiBnZXRzIHRoZSBwYWRhdGFfcHJpdiBzdHJ1Y3R1cmUgcG9pbnRlciBhcyBpdHMgbG9uZSBwYXJhbWV0ZXI7XFxuLWluZm9ybWF0aW9uIGFib3V0IHRoZSBhY3R1YWwgd29yayB0byBiZSBkb25lIGlzIHByb2JhYmx5IG9idGFpbmVkIGJ5IHVzaW5nXFxuLWNvbnRhaW5lcl9vZigpIHRvIGZpbmQgdGhlIGVuY2xvc2luZyBzdHJ1Y3R1cmUuXFxuLVxcbi1Ob3RlIHRoYXQgcGFyYWxsZWwoKSBoYXMgbm8gcmV0dXJuIHZhbHVlOyB0aGUgcGFkYXRhIHN1YnN5c3RlbSBhc3N1bWVzIHRoYXRcXG4tcGFyYWxsZWwoKSB3aWxsIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBqb2IgZnJvbSB0aGlzIHBvaW50LiAgVGhlIGpvYlxcbi1uZWVkIG5vdCBiZSBjb21wbGV0ZWQgZHVyaW5nIHRoaXMgY2FsbCwgYnV0LCBpZiBwYXJhbGxlbCgpIGxlYXZlcyB3b3JrXFxuLW91dHN0YW5kaW5nLCBpdCBzaG91bGQgYmUgcHJlcGFyZWQgdG8gYmUgY2FsbGVkIGFnYWluIHdpdGggYSBuZXcgam9iIGJlZm9yZVxcbi10aGUgcHJldmlvdXMgb25lIGNvbXBsZXRlcy5cXG4tXFxuLVNlcmlhbGl6aW5nIEpvYnNcXG4tLS0tLS0tLS0tLS0tLS0tLVxcbi1cXG4tV2hlbiBhIGpvYiBkb2VzIGNvbXBsZXRlLCBwYXJhbGxlbCgpIChvciB3aGF0ZXZlciBmdW5jdGlvbiBhY3R1YWxseSBmaW5pc2hlc1xcbi10aGUgd29yaykgc2hvdWxkIGluZm9ybSBwYWRhdGEgb2YgdGhlIGZhY3Qgd2l0aCBhIGNhbGwgdG86Olxcbi1cXG4tICAgIHZvaWQgcGFkYXRhX2RvX3NlcmlhbChzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSk7XFxuLVxcbi1BdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUsIHBhZGF0YV9kb19zZXJpYWwoKSB3aWxsIHRyaWdnZXIgYSBjYWxsIHRvIHRoZVxcbi1zZXJpYWwoKSBmdW5jdGlvbiBpbiB0aGUgcGFkYXRhX3ByaXYgc3RydWN0dXJlLiAgVGhhdCBjYWxsIHdpbGwgaGFwcGVuIG9uXFxuLXRoZSBDUFUgcmVxdWVzdGVkIGluIHRoZSBpbml0aWFsIGNhbGwgdG8gcGFkYXRhX2RvX3BhcmFsbGVsKCk7IGl0LCB0b28sIGlzXFxuLXJ1biB3aXRoIGxvY2FsIHNvZnR3YXJlIGludGVycnVwdHMgZGlzYWJsZWQuXFxuLU5vdGUgdGhhdCB0aGlzIGNhbGwgbWF5IGJlIGRlZmVycmVkIGZvciBhIHdoaWxlIHNpbmNlIHRoZSBwYWRhdGEgY29kZSB0YWtlc1xcbi1wYWlucyB0byBlbnN1cmUgdGhhdCBqb2JzIGFyZSBjb21wbGV0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZVxcbi1zdWJtaXR0ZWQuXFxuLVxcbi1EZXN0cm95aW5nXFxuLS0tLS0tLS0tLS1cXG4tXFxuLUNsZWFuaW5nIHVwIGEgcGFkYXRhIGluc3RhbmNlIHByZWRpY3RhYmx5IGludm9sdmVzIGNhbGxpbmcgdGhlIHR3byBmcmVlXFxuLWZ1bmN0aW9ucyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIGFsbG9jYXRpb24gaW4gcmV2ZXJzZTo6XFxuLVxcbi0gICAgdm9pZCBwYWRhdGFfZnJlZV9zaGVsbChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcyk7XFxuLSAgICB2b2lkIHBhZGF0YV9mcmVlKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KTtcXG4tXFxuLUl0IGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIGFsbCBvdXRzdGFuZGluZyBqb2JzIGFyZSBjb21wbGV0ZVxcbi1iZWZvcmUgYW55IG9mIHRoZSBhYm92ZSBhcmUgY2FsbGVkLlxcbi1cXG4gUnVubmluZyBNdWx0aXRocmVhZGVkIEpvYnNcXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT1cXG4gXFxuZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlNcXG5pbmRleCA4MDZiZDJkODBkMTUzNS4uMjYwYjNiZGM3NjE0OGMgMTAwNjQ0XFxuLS0tIGEvTUFJTlRBSU5FUlNcXG4rKysgYi9NQUlOVEFJTkVSU1xcbkBAIC0yMTA4NSwxMyArMjEwODUsNiBAQCBMOlxcdG5ldGRldkB2Z2VyLmtlcm5lbC5vcmdcXG4gUzpcXHRNYWludGFpbmVkXFxuIEY6XFx0ZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3BjbmV0MzIuY1xcbiBcXG4tUENSWVBUIFBBUkFMTEVMIENSWVBUTyBFTkdJTkVcXG4tTTpcXHRTdGVmZmVuIEtsYXNzZXJ0IFxcdTAwM2NzdGVmZmVuLmtsYXNzZXJ0QHNlY3VuZXQuY29tXFx1MDAzZVxcbi1MOlxcdGxpbnV4LWNyeXB0b0B2Z2VyLmtlcm5lbC5vcmdcXG4tUzpcXHRNYWludGFpbmVkXFxuLUY6XFx0Y3J5cHRvL3BjcnlwdC5jXFxuLUY6XFx0aW5jbHVkZS9jcnlwdG8vcGNyeXB0LmhcXG4tXFxuIFBEUyBEU0MgVklSVElPIERBVEEgUEFUSCBBQ0NFTEVSQVRPUlxcbiBSOlxcdEJyZXR0IENyZWVsZXkgXFx1MDAzY2JyZXR0LmNyZWVsZXlAYW1kLmNvbVxcdTAwM2VcXG4gRjpcXHRkcml2ZXJzL3ZkcGEvcGRzL1xcbmRpZmYgLS1naXQgYS9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uMzJfZGVmY29uZmlnIGIvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjMyX2RlZmNvbmZpZ1xcbmluZGV4IDdjOGYwMTUxM2VkMjdjLi5jZjk3ZjQ0OTM1NzM2ZiAxMDA2NDRcXG4tLS0gYS9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uMzJfZGVmY29uZmlnXFxuKysrIGIvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjMyX2RlZmNvbmZpZ1xcbkBAIC0xMDYzLDcgKzEwNjMsNiBAQCBDT05GSUdfU0VDVVJJVFlfWUFNQT15XFxuIENPTkZJR19ERUZBVUxUX1NFQ1VSSVRZX0RBQz15XFxuIENPTkZJR19DUllQVE9fVVNFUj1tXFxuIENPTkZJR19DUllQVE9fU0VMRlRFU1RTPXlcXG4tQ09ORklHX0NSWVBUT19QQ1JZUFQ9bVxcbiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tXFxuIENPTkZJR19DUllQVE9fQU5VQklTPW1cXG4gQ09ORklHX0NSWVBUT19CTE9XRklTSD1tXFxuZGlmZiAtLWdpdCBhL2FyY2gvbG9vbmdhcmNoL2NvbmZpZ3MvbG9vbmdzb242NF9kZWZjb25maWcgYi9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uNjRfZGVmY29uZmlnXFxuaW5kZXggOGUzOTA2ZDNiZDcwY2EuLmQwZWNlNzkyMGYyMTU4IDEwMDY0NFxcbi0tLSBhL2FyY2gvbG9vbmdhcmNoL2NvbmZpZ3MvbG9vbmdzb242NF9kZWZjb25maWdcXG4rKysgYi9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uNjRfZGVmY29uZmlnXFxuQEAgLTEwOTYsNyArMTA5Niw2IEBAIENPTkZJR19TRUNVUklUWV9ZQU1BPXlcXG4gQ09ORklHX0RFRkFVTFRfU0VDVVJJVFlfREFDPXlcXG4gQ09ORklHX0NSWVBUT19VU0VSPW1cXG4gQ09ORklHX0NSWVBUT19TRUxGVEVTVFM9eVxcbi1DT05GSUdfQ1JZUFRPX1BDUllQVD1tXFxuIENPTkZJR19DUllQVE9fQ1JZUFREPW1cXG4gQ09ORklHX0NSWVBUT19BTlVCSVM9bVxcbiBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIPW1cXG5kaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NvbmZpZ3MvZGVidWdfZGVmY29uZmlnIGIvYXJjaC9zMzkwL2NvbmZpZ3MvZGVidWdfZGVmY29uZmlnXFxuaW5kZXggNTQ2MzdiZTg3ZmI3MzUuLjE1ZjUxY2I5MjRkYmYwIDEwMDY0NFxcbi0tLSBhL2FyY2gvczM5MC9jb25maWdzL2RlYnVnX2RlZmNvbmZpZ1xcbisrKyBiL2FyY2gvczM5MC9jb25maWdzL2RlYnVnX2RlZmNvbmZpZ1xcbkBAIC03NjUsNyArNzY1LDYgQEAgQ09ORklHX0NSWVBUT19VU0VSPW1cXG4gQ09ORklHX0NSWVBUT19TRUxGVEVTVFM9eVxcbiBDT05GSUdfQ1JZUFRPX1NFTEZURVNUU19GVUxMPXlcXG4gQ09ORklHX0NSWVBUT19OVUxMPXlcXG4tQ09ORklHX0NSWVBUT19QQ1JZUFQ9bVxcbiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tXFxuIENPTkZJR19DUllQVE9fQkVOQ0hNQVJLPW1cXG4gQ09ORklHX0NSWVBUT19ESD1tXFxuZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jb25maWdzL2RlZmNvbmZpZyBiL2FyY2gvczM5MC9jb25maWdzL2RlZmNvbmZpZ1xcbmluZGV4IDVmNTExNGEyNTNjZjdjLi44ODI1N2ZmM2MyYzZhYSAxMDA2NDRcXG4tLS0gYS9hcmNoL3MzOTAvY29uZmlncy9kZWZjb25maWdcXG4rKysgYi9hcmNoL3MzOTAvY29uZmlncy9kZWZjb25maWdcXG5AQCAtNzQ5LDcgKzc0OSw2IEBAIENPTkZJR19DUllQVE9fRklQUz15XFxuIENPTkZJR19DUllQVE9fVVNFUj1tXFxuIENPTkZJR19DUllQVE9fU0VMRlRFU1RTPXlcXG4gQ09ORklHX0NSWVBUT19OVUxMPXlcXG4tQ09ORklHX0NSWVBUT19QQ1JZUFQ9bVxcbiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tXFxuIENPTkZJR19DUllQVE9fQkVOQ0hNQVJLPW1cXG4gQ09ORklHX0NSWVBUT19ESD1tXFxuZGlmZiAtLWdpdCBhL2NyeXB0by9LY29uZmlnIGIvY3J5cHRvL0tjb25maWdcXG5pbmRleCBmMWUzNzIxOTUyNzMxNi4uMjI4YTdhYzlmMDYzYTIgMTAwNjQ0XFxuLS0tIGEvY3J5cHRvL0tjb25maWdcXG4rKysgYi9jcnlwdG8vS2NvbmZpZ1xcbkBAIC0yMDEsMTYgKzIwMSw2IEBAIGNvbmZpZyBDUllQVE9fTlVMTFxcbiBcXHRoZWxwXFxuIFxcdCAgVGhlc2UgYXJlICdOdWxsJyBhbGdvcml0aG1zLCB1c2VkIGJ5IElQc2VjLCB3aGljaCBkbyBub3RoaW5nLlxcbiBcXG4tY29uZmlnIENSWVBUT19QQ1JZUFRcXG4tXFx0dHJpc3RhdGUgXFxcIlBhcmFsbGVsIGNyeXB0byBlbmdpbmVcXFwiXFxuLVxcdGRlcGVuZHMgb24gU01QXFxuLVxcdHNlbGVjdCBQQURBVEFcXG4tXFx0c2VsZWN0IENSWVBUT19NQU5BR0VSXFxuLVxcdHNlbGVjdCBDUllQVE9fQUVBRFxcbi1cXHRoZWxwXFxuLVxcdCAgVGhpcyBjb252ZXJ0cyBhbiBhcmJpdHJhcnkgY3J5cHRvIGFsZ29yaXRobSBpbnRvIGEgcGFyYWxsZWxcXG4tXFx0ICBhbGdvcml0aG0gdGhhdCBleGVjdXRlcyBpbiBrZXJuZWwgdGhyZWFkcy5cXG4tXFxuIGNvbmZpZyBDUllQVE9fQ1JZUFREXFxuIFxcdHRyaXN0YXRlIFxcXCJTb2Z0d2FyZSBhc3luYyBjcnlwdG8gZGFlbW9uXFxcIlxcbiBcXHRzZWxlY3QgQ1JZUFRPX0FFQURcXG5kaWZmIC0tZ2l0IGEvY3J5cHRvL01ha2VmaWxlIGIvY3J5cHRvL01ha2VmaWxlXFxuaW5kZXggODM4NmQ1NWE5NzU1ZTcuLjJlNDg3Yzk0NmU2M2Q3IDEwMDY0NFxcbi0tLSBhL2NyeXB0by9NYWtlZmlsZVxcbisrKyBiL2NyeXB0by9NYWtlZmlsZVxcbkBAIC0xMjAsNyArMTIwLDYgQEAgQ0ZMQUdTX2FlZ2lzMTI4LW5lb24taW5uZXIubyArPSAkKGFlZ2lzMTI4LWNmbGFncy15KVxcbiBhZWdpczEyOC0kKENPTkZJR19DUllQVE9fQUVHSVMxMjhfU0lNRCkgKz0gYWVnaXMxMjgtbmVvbi5vIGFlZ2lzMTI4LW5lb24taW5uZXIub1xcbiBlbmRpZlxcbiBcXG4tb2JqLSQoQ09ORklHX0NSWVBUT19QQ1JZUFQpICs9IHBjcnlwdC5vXFxuIG9iai0kKENPTkZJR19DUllQVE9fQ1JZUFREKSArPSBjcnlwdGQub1xcbiBvYmotJChDT05GSUdfQ1JZUFRPX0RFUykgKz0gZGVzX2dlbmVyaWMub1xcbiBvYmotJChDT05GSUdfQ1JZUFRPX0JMT1dGSVNIKSArPSBibG93ZmlzaF9nZW5lcmljLm9cXG5kaWZmIC0tZ2l0IGEvY3J5cHRvL3BjcnlwdC5jIGIvY3J5cHRvL3BjcnlwdC5jXFxuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggOWYzNzI0NDI5ODFlNjUuLjAwMDAwMDAwMDAwMDAwXFxuLS0tIGEvY3J5cHRvL3BjcnlwdC5jXFxuKysrIC9kZXYvbnVsbFxcbkBAIC0xLDM5NCArMCwwIEBAXFxuLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4tLypcXG4tICogcGNyeXB0IC0gUGFyYWxsZWwgY3J5cHRvIHdyYXBwZXIuXFxuLSAqXFxuLSAqIENvcHlyaWdodCAoQykgMjAwOSBzZWN1bmV0IFNlY3VyaXR5IE5ldHdvcmtzIEFHXFxuLSAqIENvcHlyaWdodCAoQykgMjAwOSBTdGVmZmVuIEtsYXNzZXJ0IFxcdTAwM2NzdGVmZmVuLmtsYXNzZXJ0QHNlY3VuZXQuY29tXFx1MDAzZVxcbi0gKi9cXG4tXFxuLSNpbmNsdWRlIFxcdTAwM2NjcnlwdG8vYWxnYXBpLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NjcnlwdG8vaW50ZXJuYWwvYWVhZC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvYXRvbWljLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9lcnIuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2luaXQuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgva29iamVjdC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvY3B1LmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NjcnlwdG8vcGNyeXB0LmhcXHUwMDNlXFxuLVxcbi1zdGF0aWMgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGVuY3J5cHQ7XFxuLXN0YXRpYyBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwZGVjcnlwdDtcXG4tc3RhdGljIHN0cnVjdCBrc2V0ICAgICAgICAgICAqcGNyeXB0X2tzZXQ7XFxuLVxcbi1zdHJ1Y3QgcGNyeXB0X2luc3RhbmNlX2N0eCB7XFxuLVxcdHN0cnVjdCBjcnlwdG9fYWVhZF9zcGF3biBzcGF3bjtcXG4tXFx0c3RydWN0IHBhZGF0YV9zaGVsbCAqcHNlbmM7XFxuLVxcdHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzZGVjO1xcbi1cXHRhdG9taWNfdCB0Zm1fY291bnQ7XFxuLX07XFxuLVxcbi1zdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4IHtcXG4tXFx0c3RydWN0IGNyeXB0b19hZWFkICpjaGlsZDtcXG4tXFx0dW5zaWduZWQgaW50IGNiX2NwdTtcXG4tfTtcXG4tXFxuLXN0YXRpYyBpbmxpbmUgc3RydWN0IHBjcnlwdF9pbnN0YW5jZV9jdHggKnBjcnlwdF90Zm1faWN0eChcXG4tXFx0c3RydWN0IGNyeXB0b19hZWFkICp0Zm0pXFxuLXtcXG4tXFx0cmV0dXJuIGFlYWRfaW5zdGFuY2VfY3R4KGFlYWRfYWxnX2luc3RhbmNlKHRmbSkpO1xcbi19XFxuLVxcbi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX3NldGtleShzdHJ1Y3QgY3J5cHRvX2FlYWQgKnBhcmVudCxcXG4tXFx0XFx0XFx0ICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbilcXG4te1xcbi1cXHRzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgocGFyZW50KTtcXG4tXFxuLVxcdHJldHVybiBjcnlwdG9fYWVhZF9zZXRrZXkoY3R4LVxcdTAwM2VjaGlsZCwga2V5LCBrZXlsZW4pO1xcbi19XFxuLVxcbi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX3NldGF1dGhzaXplKHN0cnVjdCBjcnlwdG9fYWVhZCAqcGFyZW50LFxcbi1cXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBpbnQgYXV0aHNpemUpXFxuLXtcXG4tXFx0c3RydWN0IHBjcnlwdF9hZWFkX2N0eCAqY3R4ID0gY3J5cHRvX2FlYWRfY3R4KHBhcmVudCk7XFxuLVxcbi1cXHRyZXR1cm4gY3J5cHRvX2FlYWRfc2V0YXV0aHNpemUoY3R4LVxcdTAwM2VjaGlsZCwgYXV0aHNpemUpO1xcbi19XFxuLVxcbi1zdGF0aWMgdm9pZCBwY3J5cHRfYWVhZF9zZXJpYWwoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpXFxuLXtcXG4tXFx0c3RydWN0IHBjcnlwdF9yZXF1ZXN0ICpwcmVxID0gcGNyeXB0X3BhZGF0YV9yZXF1ZXN0KHBhZGF0YSk7XFxuLVxcdHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSA9IHBjcnlwdF9yZXF1ZXN0X2N0eChwcmVxKTtcXG4tXFxuLVxcdGFlYWRfcmVxdWVzdF9jb21wbGV0ZShyZXEtXFx1MDAzZWJhc2UuZGF0YSwgcGFkYXRhLVxcdTAwM2VpbmZvKTtcXG4tfVxcbi1cXG4tc3RhdGljIHZvaWQgcGNyeXB0X2FlYWRfZG9uZSh2b2lkICpkYXRhLCBpbnQgZXJyKVxcbi17XFxuLVxcdHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSA9IGRhdGE7XFxuLVxcdHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IGFlYWRfcmVxdWVzdF9jdHgocmVxKTtcXG4tXFx0c3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEgPSBwY3J5cHRfcmVxdWVzdF9wYWRhdGEocHJlcSk7XFxuLVxcbi1cXHRpZiAoZXJyID09IC1FSU5QUk9HUkVTUylcXG4tXFx0XFx0cmV0dXJuO1xcbi1cXG4tXFx0cGFkYXRhLVxcdTAwM2VpbmZvID0gZXJyO1xcbi1cXG4tXFx0cGFkYXRhX2RvX3NlcmlhbChwYWRhdGEpO1xcbi19XFxuLVxcbi1zdGF0aWMgdm9pZCBwY3J5cHRfYWVhZF9lbmMoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpXFxuLXtcXG4tXFx0c3RydWN0IHBjcnlwdF9yZXF1ZXN0ICpwcmVxID0gcGNyeXB0X3BhZGF0YV9yZXF1ZXN0KHBhZGF0YSk7XFxuLVxcdHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSA9IHBjcnlwdF9yZXF1ZXN0X2N0eChwcmVxKTtcXG4tXFx0aW50IHJldDtcXG4tXFxuLVxcdHJldCA9IGNyeXB0b19hZWFkX2VuY3J5cHQocmVxKTtcXG4tXFxuLVxcdGlmIChyZXQgPT0gLUVJTlBST0dSRVNTIHx8IHJldCA9PSAtRUJVU1kpXFxuLVxcdFxcdHJldHVybjtcXG4tXFxuLVxcdHBhZGF0YS1cXHUwMDNlaW5mbyA9IHJldDtcXG4tXFx0cGFkYXRhX2RvX3NlcmlhbChwYWRhdGEpO1xcbi19XFxuLVxcbi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX2VuY3J5cHQoc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxKVxcbi17XFxuLVxcdGludCBlcnI7XFxuLVxcdHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IGFlYWRfcmVxdWVzdF9jdHgocmVxKTtcXG4tXFx0c3RydWN0IGFlYWRfcmVxdWVzdCAqY3JlcSA9IHBjcnlwdF9yZXF1ZXN0X2N0eChwcmVxKTtcXG4tXFx0c3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEgPSBwY3J5cHRfcmVxdWVzdF9wYWRhdGEocHJlcSk7XFxuLVxcdHN0cnVjdCBjcnlwdG9fYWVhZCAqYWVhZCA9IGNyeXB0b19hZWFkX3JlcXRmbShyZXEpO1xcbi1cXHRzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgoYWVhZCk7XFxuLVxcdHUzMiBmbGFncyA9IGFlYWRfcmVxdWVzdF9mbGFncyhyZXEpO1xcbi1cXHRzdHJ1Y3QgcGNyeXB0X2luc3RhbmNlX2N0eCAqaWN0eDtcXG4tXFxuLVxcdGljdHggPSBwY3J5cHRfdGZtX2ljdHgoYWVhZCk7XFxuLVxcbi1cXHRtZW1zZXQocGFkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHBhZGF0YV9wcml2KSk7XFxuLVxcbi1cXHRwYWRhdGEtXFx1MDAzZXBhcmFsbGVsID0gcGNyeXB0X2FlYWRfZW5jO1xcbi1cXHRwYWRhdGEtXFx1MDAzZXNlcmlhbCA9IHBjcnlwdF9hZWFkX3NlcmlhbDtcXG4tXFxuLVxcdGFlYWRfcmVxdWVzdF9zZXRfdGZtKGNyZXEsIGN0eC1cXHUwMDNlY2hpbGQpO1xcbi1cXHRhZWFkX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKGNyZXEsIGZsYWdzIFxcdTAwMjYgfkNSWVBUT19URk1fUkVRX01BWV9TTEVFUCxcXG4tXFx0XFx0XFx0XFx0ICBwY3J5cHRfYWVhZF9kb25lLCByZXEpO1xcbi1cXHRhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KGNyZXEsIHJlcS1cXHUwMDNlc3JjLCByZXEtXFx1MDAzZWRzdCxcXG4tXFx0XFx0XFx0ICAgICAgIHJlcS1cXHUwMDNlY3J5cHRsZW4sIHJlcS1cXHUwMDNlaXYpO1xcbi1cXHRhZWFkX3JlcXVlc3Rfc2V0X2FkKGNyZXEsIHJlcS1cXHUwMDNlYXNzb2NsZW4pO1xcbi1cXG4tXFx0ZXJyID0gcGFkYXRhX2RvX3BhcmFsbGVsKGljdHgtXFx1MDAzZXBzZW5jLCBwYWRhdGEsIFxcdTAwMjZjdHgtXFx1MDAzZWNiX2NwdSk7XFxuLVxcdGlmICghZXJyKVxcbi1cXHRcXHRyZXR1cm4gLUVJTlBST0dSRVNTO1xcbi1cXHRpZiAoZXJyID09IC1FQlVTWSkge1xcbi1cXHRcXHQvKiB0cnkgbm9uLXBhcmFsbGVsIG1vZGUgKi9cXG4tXFx0XFx0YWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhjcmVxLCBmbGFncywgcmVxLVxcdTAwM2ViYXNlLmNvbXBsZXRlLFxcbi1cXHRcXHRcXHRcXHRcXHQgIHJlcS1cXHUwMDNlYmFzZS5kYXRhKTtcXG4tXFx0XFx0cmV0dXJuIGNyeXB0b19hZWFkX2VuY3J5cHQoY3JlcSk7XFxuLVxcdH1cXG4tXFxuLVxcdHJldHVybiBlcnI7XFxuLX1cXG4tXFxuLXN0YXRpYyB2b2lkIHBjcnlwdF9hZWFkX2RlYyhzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSlcXG4te1xcbi1cXHRzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnByZXEgPSBwY3J5cHRfcGFkYXRhX3JlcXVlc3QocGFkYXRhKTtcXG4tXFx0c3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxID0gcGNyeXB0X3JlcXVlc3RfY3R4KHByZXEpO1xcbi1cXHRpbnQgcmV0O1xcbi1cXG4tXFx0cmV0ID0gY3J5cHRvX2FlYWRfZGVjcnlwdChyZXEpO1xcbi1cXG4tXFx0aWYgKHJldCA9PSAtRUlOUFJPR1JFU1MgfHwgcmV0ID09IC1FQlVTWSlcXG4tXFx0XFx0cmV0dXJuO1xcbi1cXG4tXFx0cGFkYXRhLVxcdTAwM2VpbmZvID0gcmV0O1xcbi1cXHRwYWRhdGFfZG9fc2VyaWFsKHBhZGF0YSk7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbnQgcGNyeXB0X2FlYWRfZGVjcnlwdChzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEpXFxuLXtcXG4tXFx0aW50IGVycjtcXG4tXFx0c3RydWN0IHBjcnlwdF9yZXF1ZXN0ICpwcmVxID0gYWVhZF9yZXF1ZXN0X2N0eChyZXEpO1xcbi1cXHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpjcmVxID0gcGNyeXB0X3JlcXVlc3RfY3R4KHByZXEpO1xcbi1cXHRzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSA9IHBjcnlwdF9yZXF1ZXN0X3BhZGF0YShwcmVxKTtcXG4tXFx0c3RydWN0IGNyeXB0b19hZWFkICphZWFkID0gY3J5cHRvX2FlYWRfcmVxdGZtKHJlcSk7XFxuLVxcdHN0cnVjdCBwY3J5cHRfYWVhZF9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eChhZWFkKTtcXG4tXFx0dTMyIGZsYWdzID0gYWVhZF9yZXF1ZXN0X2ZsYWdzKHJlcSk7XFxuLVxcdHN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4ICppY3R4O1xcbi1cXG4tXFx0aWN0eCA9IHBjcnlwdF90Zm1faWN0eChhZWFkKTtcXG4tXFxuLVxcdG1lbXNldChwYWRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgcGFkYXRhX3ByaXYpKTtcXG4tXFxuLVxcdHBhZGF0YS1cXHUwMDNlcGFyYWxsZWwgPSBwY3J5cHRfYWVhZF9kZWM7XFxuLVxcdHBhZGF0YS1cXHUwMDNlc2VyaWFsID0gcGNyeXB0X2FlYWRfc2VyaWFsO1xcbi1cXG4tXFx0YWVhZF9yZXF1ZXN0X3NldF90Zm0oY3JlcSwgY3R4LVxcdTAwM2VjaGlsZCk7XFxuLVxcdGFlYWRfcmVxdWVzdF9zZXRfY2FsbGJhY2soY3JlcSwgZmxhZ3MgXFx1MDAyNiB+Q1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQLFxcbi1cXHRcXHRcXHRcXHQgIHBjcnlwdF9hZWFkX2RvbmUsIHJlcSk7XFxuLVxcdGFlYWRfcmVxdWVzdF9zZXRfY3J5cHQoY3JlcSwgcmVxLVxcdTAwM2VzcmMsIHJlcS1cXHUwMDNlZHN0LFxcbi1cXHRcXHRcXHQgICAgICAgcmVxLVxcdTAwM2VjcnlwdGxlbiwgcmVxLVxcdTAwM2Vpdik7XFxuLVxcdGFlYWRfcmVxdWVzdF9zZXRfYWQoY3JlcSwgcmVxLVxcdTAwM2Vhc3NvY2xlbik7XFxuLVxcbi1cXHRlcnIgPSBwYWRhdGFfZG9fcGFyYWxsZWwoaWN0eC1cXHUwMDNlcHNkZWMsIHBhZGF0YSwgXFx1MDAyNmN0eC1cXHUwMDNlY2JfY3B1KTtcXG4tXFx0aWYgKCFlcnIpXFxuLVxcdFxcdHJldHVybiAtRUlOUFJPR1JFU1M7XFxuLVxcdGlmIChlcnIgPT0gLUVCVVNZKSB7XFxuLVxcdFxcdC8qIHRyeSBub24tcGFyYWxsZWwgbW9kZSAqL1xcbi1cXHRcXHRhZWFkX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKGNyZXEsIGZsYWdzLCByZXEtXFx1MDAzZWJhc2UuY29tcGxldGUsXFxuLVxcdFxcdFxcdFxcdFxcdCAgcmVxLVxcdTAwM2ViYXNlLmRhdGEpO1xcbi1cXHRcXHRyZXR1cm4gY3J5cHRvX2FlYWRfZGVjcnlwdChjcmVxKTtcXG4tXFx0fVxcbi1cXG4tXFx0cmV0dXJuIGVycjtcXG4tfVxcbi1cXG4tc3RhdGljIGludCBwY3J5cHRfYWVhZF9pbml0X3RmbShzdHJ1Y3QgY3J5cHRvX2FlYWQgKnRmbSlcXG4te1xcbi1cXHRpbnQgY3B1X2luZGV4O1xcbi1cXHRzdHJ1Y3QgYWVhZF9pbnN0YW5jZSAqaW5zdCA9IGFlYWRfYWxnX2luc3RhbmNlKHRmbSk7XFxuLVxcdHN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4ICppY3R4ID0gYWVhZF9pbnN0YW5jZV9jdHgoaW5zdCk7XFxuLVxcdHN0cnVjdCBwY3J5cHRfYWVhZF9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eCh0Zm0pO1xcbi1cXHRzdHJ1Y3QgY3J5cHRvX2FlYWQgKmNpcGhlcjtcXG4tXFxuLVxcdGNwdV9pbmRleCA9ICh1bnNpZ25lZCBpbnQpYXRvbWljX2luY19yZXR1cm4oXFx1MDAyNmljdHgtXFx1MDAzZXRmbV9jb3VudCkgJVxcbi1cXHRcXHQgICAgY3B1bWFza193ZWlnaHQoY3B1X29ubGluZV9tYXNrKTtcXG4tXFxuLVxcdGN0eC1cXHUwMDNlY2JfY3B1ID0gY3B1bWFza19udGgoY3B1X2luZGV4LCBjcHVfb25saW5lX21hc2spO1xcbi1cXHRjaXBoZXIgPSBjcnlwdG9fc3Bhd25fYWVhZChcXHUwMDI2aWN0eC1cXHUwMDNlc3Bhd24pO1xcbi1cXG4tXFx0aWYgKElTX0VSUihjaXBoZXIpKVxcbi1cXHRcXHRyZXR1cm4gUFRSX0VSUihjaXBoZXIpO1xcbi1cXG4tXFx0Y3R4LVxcdTAwM2VjaGlsZCA9IGNpcGhlcjtcXG4tXFx0Y3J5cHRvX2FlYWRfc2V0X3JlcXNpemUodGZtLCBzaXplb2Yoc3RydWN0IHBjcnlwdF9yZXF1ZXN0KSArXFxuLVxcdFxcdFxcdFxcdCAgICAgc2l6ZW9mKHN0cnVjdCBhZWFkX3JlcXVlc3QpICtcXG4tXFx0XFx0XFx0XFx0ICAgICBjcnlwdG9fYWVhZF9yZXFzaXplKGNpcGhlcikpO1xcbi1cXG4tXFx0cmV0dXJuIDA7XFxuLX1cXG4tXFxuLXN0YXRpYyB2b2lkIHBjcnlwdF9hZWFkX2V4aXRfdGZtKHN0cnVjdCBjcnlwdG9fYWVhZCAqdGZtKVxcbi17XFxuLVxcdHN0cnVjdCBwY3J5cHRfYWVhZF9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eCh0Zm0pO1xcbi1cXG4tXFx0Y3J5cHRvX2ZyZWVfYWVhZChjdHgtXFx1MDAzZWNoaWxkKTtcXG4tfVxcbi1cXG4tc3RhdGljIHZvaWQgcGNyeXB0X2ZyZWUoc3RydWN0IGFlYWRfaW5zdGFuY2UgKmluc3QpXFxuLXtcXG4tXFx0c3RydWN0IHBjcnlwdF9pbnN0YW5jZV9jdHggKmN0eCA9IGFlYWRfaW5zdGFuY2VfY3R4KGluc3QpO1xcbi1cXG4tXFx0Y3J5cHRvX2Ryb3BfYWVhZChcXHUwMDI2Y3R4LVxcdTAwM2VzcGF3bik7XFxuLVxcdHBhZGF0YV9mcmVlX3NoZWxsKGN0eC1cXHUwMDNlcHNkZWMpO1xcbi1cXHRwYWRhdGFfZnJlZV9zaGVsbChjdHgtXFx1MDAzZXBzZW5jKTtcXG4tXFx0a2ZyZWUoaW5zdCk7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbnQgcGNyeXB0X2luaXRfaW5zdGFuY2Uoc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdCxcXG4tXFx0XFx0XFx0XFx0c3RydWN0IGNyeXB0b19hbGcgKmFsZylcXG4te1xcbi1cXHRpZiAoc25wcmludGYoaW5zdC1cXHUwMDNlYWxnLmNyYV9kcml2ZXJfbmFtZSwgQ1JZUFRPX01BWF9BTEdfTkFNRSxcXG4tXFx0XFx0ICAgICBcXFwicGNyeXB0KCVzKVxcXCIsIGFsZy1cXHUwMDNlY3JhX2RyaXZlcl9uYW1lKSBcXHUwMDNlPSBDUllQVE9fTUFYX0FMR19OQU1FKVxcbi1cXHRcXHRyZXR1cm4gLUVOQU1FVE9PTE9ORztcXG4tXFxuLVxcdG1lbWNweShpbnN0LVxcdTAwM2VhbGcuY3JhX25hbWUsIGFsZy1cXHUwMDNlY3JhX25hbWUsIENSWVBUT19NQVhfQUxHX05BTUUpO1xcbi1cXG4tXFx0aW5zdC1cXHUwMDNlYWxnLmNyYV9wcmlvcml0eSA9IGFsZy1cXHUwMDNlY3JhX3ByaW9yaXR5ICsgMTAwO1xcbi1cXHRpbnN0LVxcdTAwM2VhbGcuY3JhX2Jsb2Nrc2l6ZSA9IGFsZy1cXHUwMDNlY3JhX2Jsb2Nrc2l6ZTtcXG4tXFx0aW5zdC1cXHUwMDNlYWxnLmNyYV9hbGlnbm1hc2sgPSBhbGctXFx1MDAzZWNyYV9hbGlnbm1hc2s7XFxuLVxcbi1cXHRyZXR1cm4gMDtcXG4tfVxcbi1cXG4tc3RhdGljIGludCBwY3J5cHRfY3JlYXRlX2FlYWQoc3RydWN0IGNyeXB0b190ZW1wbGF0ZSAqdG1wbCwgc3RydWN0IHJ0YXR0ciAqKnRiLFxcbi1cXHRcXHRcXHQgICAgICBzdHJ1Y3QgY3J5cHRvX2F0dHJfdHlwZSAqYWxndClcXG4te1xcbi1cXHRzdHJ1Y3QgcGNyeXB0X2luc3RhbmNlX2N0eCAqY3R4O1xcbi1cXHRzdHJ1Y3QgYWVhZF9pbnN0YW5jZSAqaW5zdDtcXG4tXFx0c3RydWN0IGFlYWRfYWxnICphbGc7XFxuLVxcdHUzMiBtYXNrID0gY3J5cHRvX2FsZ3RfaW5oZXJpdGVkX21hc2soYWxndCk7XFxuLVxcdGludCBlcnI7XFxuLVxcbi1cXHRpbnN0ID0ga3phbGxvYyhzaXplb2YoKmluc3QpICsgc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTtcXG4tXFx0aWYgKCFpbnN0KVxcbi1cXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4tXFxuLVxcdGVyciA9IC1FTk9NRU07XFxuLVxcbi1cXHRjdHggPSBhZWFkX2luc3RhbmNlX2N0eChpbnN0KTtcXG4tXFx0Y3R4LVxcdTAwM2Vwc2VuYyA9IHBhZGF0YV9hbGxvY19zaGVsbChwZW5jcnlwdCk7XFxuLVxcdGlmICghY3R4LVxcdTAwM2Vwc2VuYylcXG4tXFx0XFx0Z290byBlcnJfZnJlZV9pbnN0O1xcbi1cXG4tXFx0Y3R4LVxcdTAwM2Vwc2RlYyA9IHBhZGF0YV9hbGxvY19zaGVsbChwZGVjcnlwdCk7XFxuLVxcdGlmICghY3R4LVxcdTAwM2Vwc2RlYylcXG4tXFx0XFx0Z290byBlcnJfZnJlZV9pbnN0O1xcbi1cXG4tXFx0ZXJyID0gY3J5cHRvX2dyYWJfYWVhZChcXHUwMDI2Y3R4LVxcdTAwM2VzcGF3biwgYWVhZF9jcnlwdG9faW5zdGFuY2UoaW5zdCksXFxuLVxcdFxcdFxcdCAgICAgICBjcnlwdG9fYXR0cl9hbGdfbmFtZSh0YlsxXSksIDAsIG1hc2spO1xcbi1cXHRpZiAoZXJyKVxcbi1cXHRcXHRnb3RvIGVycl9mcmVlX2luc3Q7XFxuLVxcbi1cXHRhbGcgPSBjcnlwdG9fc3Bhd25fYWVhZF9hbGcoXFx1MDAyNmN0eC1cXHUwMDNlc3Bhd24pO1xcbi1cXHRlcnIgPSBwY3J5cHRfaW5pdF9pbnN0YW5jZShhZWFkX2NyeXB0b19pbnN0YW5jZShpbnN0KSwgXFx1MDAyNmFsZy1cXHUwMDNlYmFzZSk7XFxuLVxcdGlmIChlcnIpXFxuLVxcdFxcdGdvdG8gZXJyX2ZyZWVfaW5zdDtcXG4tXFxuLVxcdGluc3QtXFx1MDAzZWFsZy5iYXNlLmNyYV9mbGFncyB8PSBDUllQVE9fQUxHX0FTWU5DO1xcbi1cXG4tXFx0aW5zdC1cXHUwMDNlYWxnLml2c2l6ZSA9IGNyeXB0b19hZWFkX2FsZ19pdnNpemUoYWxnKTtcXG4tXFx0aW5zdC1cXHUwMDNlYWxnLm1heGF1dGhzaXplID0gY3J5cHRvX2FlYWRfYWxnX21heGF1dGhzaXplKGFsZyk7XFxuLVxcbi1cXHRpbnN0LVxcdTAwM2VhbGcuYmFzZS5jcmFfY3R4c2l6ZSA9IHNpemVvZihzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4KTtcXG4tXFxuLVxcdGluc3QtXFx1MDAzZWFsZy5pbml0ID0gcGNyeXB0X2FlYWRfaW5pdF90Zm07XFxuLVxcdGluc3QtXFx1MDAzZWFsZy5leGl0ID0gcGNyeXB0X2FlYWRfZXhpdF90Zm07XFxuLVxcbi1cXHRpbnN0LVxcdTAwM2VhbGcuc2V0a2V5ID0gcGNyeXB0X2FlYWRfc2V0a2V5O1xcbi1cXHRpbnN0LVxcdTAwM2VhbGcuc2V0YXV0aHNpemUgPSBwY3J5cHRfYWVhZF9zZXRhdXRoc2l6ZTtcXG4tXFx0aW5zdC1cXHUwMDNlYWxnLmVuY3J5cHQgPSBwY3J5cHRfYWVhZF9lbmNyeXB0O1xcbi1cXHRpbnN0LVxcdTAwM2VhbGcuZGVjcnlwdCA9IHBjcnlwdF9hZWFkX2RlY3J5cHQ7XFxuLVxcbi1cXHRpbnN0LVxcdTAwM2VmcmVlID0gcGNyeXB0X2ZyZWU7XFxuLVxcbi1cXHRlcnIgPSBhZWFkX3JlZ2lzdGVyX2luc3RhbmNlKHRtcGwsIGluc3QpO1xcbi1cXHRpZiAoZXJyKSB7XFxuLWVycl9mcmVlX2luc3Q6XFxuLVxcdFxcdHBjcnlwdF9mcmVlKGluc3QpO1xcbi1cXHR9XFxuLVxcdHJldHVybiBlcnI7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbnQgcGNyeXB0X2NyZWF0ZShzdHJ1Y3QgY3J5cHRvX3RlbXBsYXRlICp0bXBsLCBzdHJ1Y3QgcnRhdHRyICoqdGIpXFxuLXtcXG4tXFx0c3RydWN0IGNyeXB0b19hdHRyX3R5cGUgKmFsZ3Q7XFxuLVxcbi1cXHRhbGd0ID0gY3J5cHRvX2dldF9hdHRyX3R5cGUodGIpO1xcbi1cXHRpZiAoSVNfRVJSKGFsZ3QpKVxcbi1cXHRcXHRyZXR1cm4gUFRSX0VSUihhbGd0KTtcXG4tXFxuLVxcdHN3aXRjaCAoYWxndC1cXHUwMDNldHlwZSBcXHUwMDI2IGFsZ3QtXFx1MDAzZW1hc2sgXFx1MDAyNiBDUllQVE9fQUxHX1RZUEVfTUFTSykge1xcbi1cXHRjYXNlIENSWVBUT19BTEdfVFlQRV9BRUFEOlxcbi1cXHRcXHRyZXR1cm4gcGNyeXB0X2NyZWF0ZV9hZWFkKHRtcGwsIHRiLCBhbGd0KTtcXG4tXFx0fVxcbi1cXG4tXFx0cmV0dXJuIC1FSU5WQUw7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbnQgcGNyeXB0X3N5c2ZzX2FkZChzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgY29uc3QgY2hhciAqbmFtZSlcXG4te1xcbi1cXHRpbnQgcmV0O1xcbi1cXG4tXFx0cGluc3QtXFx1MDAzZWtvYmoua3NldCA9IHBjcnlwdF9rc2V0O1xcbi1cXHRyZXQgPSBrb2JqZWN0X2FkZChcXHUwMDI2cGluc3QtXFx1MDAzZWtvYmosIE5VTEwsIFxcXCIlc1xcXCIsIG5hbWUpO1xcbi1cXHRpZiAoIXJldClcXG4tXFx0XFx0a29iamVjdF91ZXZlbnQoXFx1MDAyNnBpbnN0LVxcdTAwM2Vrb2JqLCBLT0JKX0FERCk7XFxuLVxcbi1cXHRyZXR1cm4gcmV0O1xcbi19XFxuLVxcbi1zdGF0aWMgaW50IHBjcnlwdF9pbml0X3BhZGF0YShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICoqcGluc3QsIGNvbnN0IGNoYXIgKm5hbWUpXFxuLXtcXG4tXFx0aW50IHJldCA9IC1FTk9NRU07XFxuLVxcbi1cXHQqcGluc3QgPSBwYWRhdGFfYWxsb2MobmFtZSk7XFxuLVxcdGlmICghKnBpbnN0KVxcbi1cXHRcXHRyZXR1cm4gcmV0O1xcbi1cXG4tXFx0cmV0ID0gcGNyeXB0X3N5c2ZzX2FkZCgqcGluc3QsIG5hbWUpO1xcbi1cXHRpZiAocmV0KVxcbi1cXHRcXHRwYWRhdGFfZnJlZSgqcGluc3QpO1xcbi1cXG4tXFx0cmV0dXJuIHJldDtcXG4tfVxcbi1cXG4tc3RhdGljIHN0cnVjdCBjcnlwdG9fdGVtcGxhdGUgcGNyeXB0X3RtcGwgPSB7XFxuLVxcdC5uYW1lID0gXFxcInBjcnlwdFxcXCIsXFxuLVxcdC5jcmVhdGUgPSBwY3J5cHRfY3JlYXRlLFxcbi1cXHQubW9kdWxlID0gVEhJU19NT0RVTEUsXFxuLX07XFxuLVxcbi1zdGF0aWMgaW50IF9faW5pdCBwY3J5cHRfaW5pdCh2b2lkKVxcbi17XFxuLVxcdGludCBlcnIgPSAtRU5PTUVNO1xcbi1cXG4tXFx0cGNyeXB0X2tzZXQgPSBrc2V0X2NyZWF0ZV9hbmRfYWRkKFxcXCJwY3J5cHRcXFwiLCBOVUxMLCBrZXJuZWxfa29iaik7XFxuLVxcdGlmICghcGNyeXB0X2tzZXQpXFxuLVxcdFxcdGdvdG8gZXJyO1xcbi1cXG4tXFx0ZXJyID0gcGNyeXB0X2luaXRfcGFkYXRhKFxcdTAwMjZwZW5jcnlwdCwgXFxcInBlbmNyeXB0XFxcIik7XFxuLVxcdGlmIChlcnIpXFxuLVxcdFxcdGdvdG8gZXJyX3VucmVnX2tzZXQ7XFxuLVxcbi1cXHRlcnIgPSBwY3J5cHRfaW5pdF9wYWRhdGEoXFx1MDAyNnBkZWNyeXB0LCBcXFwicGRlY3J5cHRcXFwiKTtcXG4tXFx0aWYgKGVycilcXG4tXFx0XFx0Z290byBlcnJfZGVpbml0X3BlbmNyeXB0O1xcbi1cXG4tXFx0cmV0dXJuIGNyeXB0b19yZWdpc3Rlcl90ZW1wbGF0ZShcXHUwMDI2cGNyeXB0X3RtcGwpO1xcbi1cXG4tZXJyX2RlaW5pdF9wZW5jcnlwdDpcXG4tXFx0cGFkYXRhX2ZyZWUocGVuY3J5cHQpO1xcbi1lcnJfdW5yZWdfa3NldDpcXG4tXFx0a3NldF91bnJlZ2lzdGVyKHBjcnlwdF9rc2V0KTtcXG4tZXJyOlxcbi1cXHRyZXR1cm4gZXJyO1xcbi19XFxuLVxcbi1zdGF0aWMgdm9pZCBfX2V4aXQgcGNyeXB0X2V4aXQodm9pZClcXG4te1xcbi1cXHRjcnlwdG9fdW5yZWdpc3Rlcl90ZW1wbGF0ZShcXHUwMDI2cGNyeXB0X3RtcGwpO1xcbi1cXG4tXFx0cGFkYXRhX2ZyZWUocGVuY3J5cHQpO1xcbi1cXHRwYWRhdGFfZnJlZShwZGVjcnlwdCk7XFxuLVxcbi1cXHRrc2V0X3VucmVnaXN0ZXIocGNyeXB0X2tzZXQpO1xcbi19XFxuLVxcbi1tb2R1bGVfaW5pdChwY3J5cHRfaW5pdCk7XFxuLW1vZHVsZV9leGl0KHBjcnlwdF9leGl0KTtcXG4tXFxuLU1PRFVMRV9MSUNFTlNFKFxcXCJHUExcXFwiKTtcXG4tTU9EVUxFX0FVVEhPUihcXFwiU3RlZmZlbiBLbGFzc2VydCBcXHUwMDNjc3RlZmZlbi5rbGFzc2VydEBzZWN1bmV0LmNvbVxcdTAwM2VcXFwiKTtcXG4tTU9EVUxFX0RFU0NSSVBUSU9OKFxcXCJQYXJhbGxlbCBjcnlwdG8gd3JhcHBlclxcXCIpO1xcbi1NT0RVTEVfQUxJQVNfQ1JZUFRPKFxcXCJwY3J5cHRcXFwiKTtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9jcnlwdG8vcGNyeXB0LmggYi9pbmNsdWRlL2NyeXB0by9wY3J5cHQuaFxcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDIzNGQ3Y2YzY2Y1ZWFkLi4wMDAwMDAwMDAwMDAwMFxcbi0tLSBhL2luY2x1ZGUvY3J5cHRvL3BjcnlwdC5oXFxuKysrIC9kZXYvbnVsbFxcbkBAIC0xLDM5ICswLDAgQEBcXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xcbi0vKlxcbi0gKiBwY3J5cHQgLSBQYXJhbGxlbCBjcnlwdG8gZW5naW5lLlxcbi0gKlxcbi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgc2VjdW5ldCBTZWN1cml0eSBOZXR3b3JrcyBBR1xcbi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgU3RlZmZlbiBLbGFzc2VydCBcXHUwMDNjc3RlZmZlbi5rbGFzc2VydEBzZWN1bmV0LmNvbVxcdTAwM2VcXG4tICovXFxuLVxcbi0jaWZuZGVmIF9DUllQVE9fUENSWVBUX0hcXG4tI2RlZmluZSBfQ1JZUFRPX1BDUllQVF9IXFxuLVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvY29udGFpbmVyX29mLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9jcnlwdG8uaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BhZGF0YS5oXFx1MDAzZVxcbi1cXG4tc3RydWN0IHBjcnlwdF9yZXF1ZXN0IHtcXG4tXFx0c3RydWN0IHBhZGF0YV9wcml2XFx0cGFkYXRhO1xcbi1cXHR2b2lkXFx0XFx0XFx0KmRhdGE7XFxuLVxcdHZvaWRcXHRcXHRcXHQqX19jdHhbXSBDUllQVE9fTUlOQUxJR05fQVRUUjtcXG4tfTtcXG4tXFxuLXN0YXRpYyBpbmxpbmUgdm9pZCAqcGNyeXB0X3JlcXVlc3RfY3R4KHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcmVxKVxcbi17XFxuLVxcdHJldHVybiByZXEtXFx1MDAzZV9fY3R4O1xcbi19XFxuLVxcbi1zdGF0aWMgaW5saW5lXFxuLXN0cnVjdCBwYWRhdGFfcHJpdiAqcGNyeXB0X3JlcXVlc3RfcGFkYXRhKHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcmVxKVxcbi17XFxuLVxcdHJldHVybiBcXHUwMDI2cmVxLVxcdTAwM2VwYWRhdGE7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbmxpbmVcXG4tc3RydWN0IHBjcnlwdF9yZXF1ZXN0ICpwY3J5cHRfcGFkYXRhX3JlcXVlc3Qoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpXFxuLXtcXG4tXFx0cmV0dXJuIGNvbnRhaW5lcl9vZihwYWRhdGEsIHN0cnVjdCBwY3J5cHRfcmVxdWVzdCwgcGFkYXRhKTtcXG4tfVxcbi1cXG4tI2VuZGlmXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGFkYXRhLmggYi9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oXFxuaW5kZXggYjYyMzJiZWE2ZWRmNTkuLmVhNDVlYTY4MGNiNzk3IDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvcGFkYXRhLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oXFxuQEAgLTEyLDExMiArMTIsOCBAQFxcbiAjaWZuZGVmIFBBREFUQV9IXFxuICNkZWZpbmUgUEFEQVRBX0hcXG4gXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9yZWZjb3VudC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvY29tcGlsZXJfdHlwZXMuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3dvcmtxdWV1ZS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvc3BpbmxvY2suaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2xpc3QuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2tvYmplY3QuaFxcdTAwM2VcXG4tXFxuLSNkZWZpbmUgUEFEQVRBX0NQVV9TRVJJQUwgICAweDAxXFxuLSNkZWZpbmUgUEFEQVRBX0NQVV9QQVJBTExFTCAweDAyXFxuLVxcbi0vKipcXG4tICogc3RydWN0IHBhZGF0YV9wcml2IC0gUmVwcmVzZW50cyBvbmUgam9iXFxuLSAqXFxuLSAqIEBsaXN0OiBMaXN0IGVudHJ5LCB0byBhdHRhY2ggdG8gdGhlIHBhZGF0YSBsaXN0cy5cXG4tICogQHBkOiBQb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBjb250cm9sIHN0cnVjdHVyZS5cXG4tICogQGNiX2NwdTogQ2FsbGJhY2sgY3B1IGZvciBzZXJpYWxpemF0aW9vbi5cXG4tICogQHNlcV9ucjogU2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBwYXJhbGxlbGl6ZWQgZGF0YSBvYmplY3QuXFxuLSAqIEBpbmZvOiBVc2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGFyYWxsZWwgdG8gdGhlIHNlcmlhbCBmdW5jdGlvbi5cXG4tICogQHBhcmFsbGVsOiBQYXJhbGxlbCBleGVjdXRpb24gZnVuY3Rpb24uXFxuLSAqIEBzZXJpYWw6IFNlcmlhbCBjb21wbGV0ZSBmdW5jdGlvbi5cXG4tICovXFxuLXN0cnVjdCBwYWRhdGFfcHJpdiB7XFxuLVxcdHN0cnVjdCBsaXN0X2hlYWRcXHRsaXN0O1xcbi1cXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YVxcdCpwZDtcXG4tXFx0aW50XFx0XFx0XFx0Y2JfY3B1O1xcbi1cXHR1bnNpZ25lZCBpbnRcXHRcXHRzZXFfbnI7XFxuLVxcdGludFxcdFxcdFxcdGluZm87XFxuLVxcdHZvaWQgICAgICAgICAgICAgICAgICAgICgqcGFyYWxsZWwpKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTtcXG4tXFx0dm9pZCAgICAgICAgICAgICAgICAgICAgKCpzZXJpYWwpKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTtcXG4tfTtcXG4tXFxuLS8qKlxcbi0gKiBzdHJ1Y3QgcGFkYXRhX2xpc3QgLSBvbmUgcGVyIHdvcmsgdHlwZSBwZXIgQ1BVXFxuLSAqXFxuLSAqIEBsaXN0OiBMaXN0IGhlYWQuXFxuLSAqIEBsb2NrOiBMaXN0IGxvY2suXFxuLSAqL1xcbi1zdHJ1Y3QgcGFkYXRhX2xpc3Qge1xcbi1cXHRzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBsaXN0O1xcbi1cXHRzcGlubG9ja190ICAgICAgICAgICAgICBsb2NrO1xcbi19O1xcbi1cXG4tLyoqXFxuLSogc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUgLSBUaGUgcGVyY3B1IHBhZGF0YSBzZXJpYWwgcXVldWVcXG4tKlxcbi0qIEBzZXJpYWw6IExpc3QgdG8gd2FpdCBmb3Igc2VyaWFsaXphdGlvbiBhZnRlciByZW9yZGVyaW5nLlxcbi0qIEB3b3JrOiB3b3JrIHN0cnVjdCBmb3Igc2VyaWFsaXphdGlvbi5cXG4tKiBAcGQ6IEJhY2twb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBjb250cm9sIHN0cnVjdHVyZS5cXG4tKi9cXG4tc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUge1xcbi0gICAgICAgc3RydWN0IHBhZGF0YV9saXN0ICAgIHNlcmlhbDtcXG4tICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCAgICB3b3JrO1xcbi0gICAgICAgc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkO1xcbi19O1xcbi1cXG4tLyoqXFxuLSAqIHN0cnVjdCBwYWRhdGFfY3B1bWFzayAtIFRoZSBjcHVtYXNrcyBmb3IgdGhlIHBhcmFsbGVsL3NlcmlhbCB3b3JrZXJzXFxuLSAqXFxuLSAqIEBwY3B1OiBjcHVtYXNrIGZvciB0aGUgcGFyYWxsZWwgd29ya2Vycy5cXG4tICogQGNiY3B1OiBjcHVtYXNrIGZvciB0aGUgc2VyaWFsIChjYWxsYmFjaykgd29ya2Vycy5cXG4tICovXFxuLXN0cnVjdCBwYWRhdGFfY3B1bWFzayB7XFxuLVxcdGNwdW1hc2tfdmFyX3RcXHRwY3B1O1xcbi1cXHRjcHVtYXNrX3Zhcl90XFx0Y2JjcHU7XFxuLX07XFxuLVxcbi0vKipcXG4tICogc3RydWN0IHBhcmFsbGVsX2RhdGEgLSBJbnRlcm5hbCBjb250cm9sIHN0cnVjdHVyZSwgY292ZXJzIGV2ZXJ5dGhpbmdcXG4tICogdGhhdCBkZXBlbmRzIG9uIHRoZSBjcHVtYXNrIGluIHVzZS5cXG4tICpcXG4tICogQHBzOiBwYWRhdGFfc2hlbGwgb2JqZWN0Llxcbi0gKiBAcmVvcmRlcl9saXN0OiBwZXJjcHUgcmVvcmRlciBsaXN0c1xcbi0gKiBAc3F1ZXVlOiBwZXJjcHUgcGFkYXRhIHF1ZXVlcyB1c2VkIGZvciBzZXJpYWx1emF0aW9uLlxcbi0gKiBAcmVmY250OiBOdW1iZXIgb2Ygb2JqZWN0cyBob2xkaW5nIGEgcmVmZXJlbmNlIG9uIHRoaXMgcGFyYWxsZWxfZGF0YS5cXG4tICogQHNlcV9ucjogU2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBwYXJhbGxlbGl6ZWQgZGF0YSBvYmplY3QuXFxuLSAqIEBwcm9jZXNzZWQ6IE51bWJlciBvZiBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RzLlxcbi0gKiBAY3B1OiBOZXh0IENQVSB0byBiZSBwcm9jZXNzZWQuXFxuLSAqIEBjcHVtYXNrOiBUaGUgY3B1bWFza3MgaW4gdXNlIGZvciBwYXJhbGxlbCBhbmQgc2VyaWFsIHdvcmtlcnMuXFxuLSAqL1xcbi1zdHJ1Y3QgcGFyYWxsZWxfZGF0YSB7XFxuLVxcdHN0cnVjdCBwYWRhdGFfc2hlbGxcXHRcXHQqcHM7XFxuLVxcdHN0cnVjdCBwYWRhdGFfbGlzdFxcdFxcdF9fcGVyY3B1ICpyZW9yZGVyX2xpc3Q7XFxuLVxcdHN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlXFx0X19wZXJjcHUgKnNxdWV1ZTtcXG4tXFx0cmVmY291bnRfdFxcdFxcdFxcdHJlZmNudDtcXG4tXFx0dW5zaWduZWQgaW50XFx0XFx0XFx0c2VxX25yO1xcbi1cXHR1bnNpZ25lZCBpbnRcXHRcXHRcXHRwcm9jZXNzZWQ7XFxuLVxcdGludFxcdFxcdFxcdFxcdGNwdTtcXG4tXFx0c3RydWN0IHBhZGF0YV9jcHVtYXNrXFx0XFx0Y3B1bWFzaztcXG4tfTtcXG4tXFxuLS8qKlxcbi0gKiBzdHJ1Y3QgcGFkYXRhX3NoZWxsIC0gV3JhcHBlciBhcm91bmQgc3RydWN0IHBhcmFsbGVsX2RhdGEsIGl0c1xcbi0gKiBwdXJwb3NlIGlzIHRvIGFsbG93IHRoZSB1bmRlcmx5aW5nIGNvbnRyb2wgc3RydWN0dXJlIHRvIGJlIHJlcGxhY2VkXFxuLSAqIG9uIHRoZSBmbHkgdXNpbmcgUkNVLlxcbi0gKlxcbi0gKiBAcGluc3Q6IHBhZGF0IGluc3RhbmNlLlxcbi0gKiBAcGQ6IEFjdHVhbCBwYXJhbGxlbF9kYXRhIHN0cnVjdHVyZSB3aGljaCBtYXkgYmUgc3Vic3RpdHV0ZWQgb24gdGhlIGZseS5cXG4tICogQG9wZDogUG9pbnRlciB0byBvbGQgcGQgdG8gYmUgZnJlZWQgYnkgcGFkYXRhX3JlcGxhY2UuXFxuLSAqIEBsaXN0OiBMaXN0IGVudHJ5IGluIHBhZGF0YV9pbnN0YW5jZSBsaXN0Llxcbi0gKi9cXG4tc3RydWN0IHBhZGF0YV9zaGVsbCB7XFxuLVxcdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2VcXHRcXHQqcGluc3Q7XFxuLVxcdHN0cnVjdCBwYXJhbGxlbF9kYXRhIF9fcmN1XFx0KnBkO1xcbi1cXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YVxcdFxcdCpvcGQ7XFxuLVxcdHN0cnVjdCBsaXN0X2hlYWRcXHRcXHRsaXN0O1xcbi19O1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvaW5pdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvdHlwZXMuaFxcdTAwM2VcXG4gXFxuIC8qKlxcbiAgKiBzdHJ1Y3QgcGFkYXRhX210X2pvYiAtIHJlcHJlc2VudHMgb25lIG11bHRpdGhyZWFkZWQgam9iXFxuQEAgLTE0Niw0NiArNDIsOSBAQCBzdHJ1Y3QgcGFkYXRhX210X2pvYiB7XFxuIFxcdGJvb2xcXHRcXHRcXHRudW1hX2F3YXJlO1xcbiB9O1xcbiBcXG4tLyoqXFxuLSAqIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgLSBUaGUgb3ZlcmFsbCBjb250cm9sIHN0cnVjdHVyZS5cXG4tICpcXG4tICogQGNwdWhwX25vZGU6IExpbmthZ2UgZm9yIENQVSBob3RwbHVnIGNhbGxiYWNrcy5cXG4tICogQHBhcmFsbGVsX3dxOiBUaGUgd29ya3F1ZXVlIHVzZWQgZm9yIHBhcmFsbGVsIHdvcmsuXFxuLSAqIEBzZXJpYWxfd3E6IFRoZSB3b3JrcXVldWUgdXNlZCBmb3Igc2VyaWFsIHdvcmsuXFxuLSAqIEBwc2xpc3Q6IExpc3Qgb2YgcGFkYXRhX3NoZWxsIG9iamVjdHMgYXR0YWNoZWQgdG8gdGhpcyBpbnN0YW5jZS5cXG4tICogQGNwdW1hc2s6IFVzZXIgc3VwcGxpZWQgY3B1bWFza3MgZm9yIHBhcmFsbGVsIGFuZCBzZXJpYWwgd29ya3MuXFxuLSAqIEB2YWxpZGF0ZV9jcHVtYXNrOiBJbnRlcm5hbCBjcHVtYXNrIHVzZWQgdG8gdmFsaWRhdGUgQGNwdW1hc2sgZHVyaW5nIGhvdHBsdWcuXFxuLSAqIEBrb2JqOiBwYWRhdGEgaW5zdGFuY2Uga2VybmVsIG9iamVjdC5cXG4tICogQGxvY2s6IHBhZGF0YSBpbnN0YW5jZSBsb2NrLlxcbi0gKiBAZmxhZ3M6IHBhZGF0YSBmbGFncy5cXG4tICovXFxuLXN0cnVjdCBwYWRhdGFfaW5zdGFuY2Uge1xcbi1cXHRzdHJ1Y3QgaGxpc3Rfbm9kZVxcdFxcdGNwdWhwX25vZGU7XFxuLVxcdHN0cnVjdCB3b3JrcXVldWVfc3RydWN0XFx0XFx0KnBhcmFsbGVsX3dxO1xcbi1cXHRzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdFxcdFxcdCpzZXJpYWxfd3E7XFxuLVxcdHN0cnVjdCBsaXN0X2hlYWRcXHRcXHRwc2xpc3Q7XFxuLVxcdHN0cnVjdCBwYWRhdGFfY3B1bWFza1xcdFxcdGNwdW1hc2s7XFxuLVxcdGNwdW1hc2tfdmFyX3RcXHRcXHRcXHR2YWxpZGF0ZV9jcHVtYXNrO1xcbi1cXHRzdHJ1Y3Qga29iamVjdCAgICAgICAgICAgICAgICAgICBrb2JqO1xcbi1cXHRzdHJ1Y3QgbXV0ZXhcXHRcXHRcXHQgbG9jaztcXG4tXFx0dThcXHRcXHRcXHRcXHQgZmxhZ3M7XFxuLSNkZWZpbmVcXHRQQURBVEFfSU5JVFxcdDFcXG4tI2RlZmluZVxcdFBBREFUQV9SRVNFVFxcdDJcXG4tI2RlZmluZVxcdFBBREFUQV9JTlZBTElEXFx0NFxcbi19O1xcbi1cXG4gI2lmZGVmIENPTkZJR19QQURBVEFcXG4gZXh0ZXJuIHZvaWQgX19pbml0IHBhZGF0YV9pbml0KHZvaWQpO1xcbi1leHRlcm4gc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGFkYXRhX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpO1xcbi1leHRlcm4gdm9pZCBwYWRhdGFfZnJlZShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCk7XFxuLWV4dGVybiBzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwYWRhdGFfYWxsb2Nfc2hlbGwoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpO1xcbi1leHRlcm4gdm9pZCBwYWRhdGFfZnJlZV9zaGVsbChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcyk7XFxuLWV4dGVybiBpbnQgcGFkYXRhX2RvX3BhcmFsbGVsKHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzLFxcbi1cXHRcXHRcXHQgICAgICBzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSwgaW50ICpjYl9jcHUpO1xcbi1leHRlcm4gdm9pZCBwYWRhdGFfZG9fc2VyaWFsKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTtcXG4gZXh0ZXJuIHZvaWQgX19pbml0IHBhZGF0YV9kb19tdWx0aXRocmVhZGVkKHN0cnVjdCBwYWRhdGFfbXRfam9iICpqb2IpO1xcbi1leHRlcm4gaW50IHBhZGF0YV9zZXRfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdW1hc2tfdHlwZSxcXG4tXFx0XFx0XFx0ICAgICAgY3B1bWFza192YXJfdCBjcHVtYXNrKTtcXG4gI2Vsc2VcXG4gc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBwYWRhdGFfaW5pdCh2b2lkKSB7fVxcbiBzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IHBhZGF0YV9kb19tdWx0aXRocmVhZGVkKHN0cnVjdCBwYWRhdGFfbXRfam9iICpqb2IpXFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9wYWRhdGEuYyBiL2tlcm5lbC9wYWRhdGEuY1xcbmluZGV4IDBkM2VhMWI2OGIxZjcwLi42ZWIxMzBkMzEwMjRjNSAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvcGFkYXRhLmNcXG4rKysgYi9rZXJuZWwvcGFkYXRhLmNcXG5AQCAtMSw2ICsxLDYgQEBcXG4gLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4gLypcXG4tICogcGFkYXRhLmMgLSBnZW5lcmljIGludGVyZmFjZSB0byBwcm9jZXNzIGRhdGEgc3RyZWFtcyBpbiBwYXJhbGxlbFxcbisgKiBwYWRhdGEuYyAtIGdlbmVyaWMgaW50ZXJmYWNlIHRvIHJ1biBtdWx0aXRocmVhZGVkIGpvYnNcXG4gICpcXG4gICogU2VlIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGFkYXRhLnJzdCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cXG4gICpcXG5AQCAtMTEsMTcgKzExLDE3IEBAXFxuICAqIEF1dGhvcjogRGFuaWVsIEpvcmRhbiBcXHUwMDNjZGFuaWVsLm0uam9yZGFuQG9yYWNsZS5jb21cXHUwMDNlXFxuICAqL1xcbiBcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2F0b21pYy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvY29tcGxldGlvbi5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvZXhwb3J0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9jcHVtYXNrLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9lcnIuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NwdS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvaW5pdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgva2VybmVsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9saXN0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9ub2RlbWFzay5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvcGFkYXRhLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9tdXRleC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvc2NoZWQuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3N5c2ZzLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9yY3VwZGF0ZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3BpbmxvY2suaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3dvcmtxdWV1ZS5oXFx1MDAzZVxcbiBcXG4gI2RlZmluZVxcdFBBREFUQV9XT1JLX09OU1RBQ0tcXHQxXFx0LyogV29yaydzIG1lbW9yeSBpcyBvbiBzdGFjayAqL1xcbiBcXG5AQCAtNDQsMzYgKzQ0LDggQEAgc3RydWN0IHBhZGF0YV9tdF9qb2Jfc3RhdGUge1xcbiBcXHR1bnNpZ25lZCBsb25nXFx0XFx0Y2h1bmtfc2l6ZTtcXG4gfTtcXG4gXFxuLXN0YXRpYyB2b2lkIHBhZGF0YV9mcmVlX3BkKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCk7XFxuIHN0YXRpYyB2b2lkIF9faW5pdCBwYWRhdGFfbXRfaGVscGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7XFxuIFxcbi1zdGF0aWMgaW5saW5lIHZvaWQgcGFkYXRhX2dldF9wZChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQpXFxuLXtcXG4tXFx0cmVmY291bnRfaW5jKFxcdTAwMjZwZC1cXHUwMDNlcmVmY250KTtcXG4tfVxcbi1cXG4tc3RhdGljIGlubGluZSB2b2lkIHBhZGF0YV9wdXRfcGRfY250KHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCwgaW50IGNudClcXG4te1xcbi1cXHRpZiAocmVmY291bnRfc3ViX2FuZF90ZXN0KGNudCwgXFx1MDAyNnBkLVxcdTAwM2VyZWZjbnQpKVxcbi1cXHRcXHRwYWRhdGFfZnJlZV9wZChwZCk7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbmxpbmUgdm9pZCBwYWRhdGFfcHV0X3BkKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZClcXG4te1xcbi1cXHRwYWRhdGFfcHV0X3BkX2NudChwZCwgMSk7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbnQgcGFkYXRhX2NwdV9oYXNoKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCwgdW5zaWduZWQgaW50IHNlcV9ucilcXG4te1xcbi1cXHQvKlxcbi1cXHQgKiBIYXNoIHRoZSBzZXF1ZW5jZSBudW1iZXJzIHRvIHRoZSBjcHVzIGJ5IHRha2luZ1xcbi1cXHQgKiBzZXFfbnIgbW9kLiBudW1iZXIgb2YgY3B1cyBpbiB1c2UuXFxuLVxcdCAqL1xcbi1cXHRpbnQgY3B1X2luZGV4ID0gc2VxX25yICUgY3B1bWFza193ZWlnaHQocGQtXFx1MDAzZWNwdW1hc2sucGNwdSk7XFxuLVxcbi1cXHRyZXR1cm4gY3B1bWFza19udGgoY3B1X2luZGV4LCBwZC1cXHUwMDNlY3B1bWFzay5wY3B1KTtcXG4tfVxcbi1cXG4gc3RhdGljIHN0cnVjdCBwYWRhdGFfd29yayAqcGFkYXRhX3dvcmtfYWxsb2Modm9pZClcXG4ge1xcbiBcXHRzdHJ1Y3QgcGFkYXRhX3dvcmsgKnB3O1xcbkBAIC0xNDcsMjYwICsxMTksNiBAQCBzdGF0aWMgdm9pZCBfX2luaXQgcGFkYXRhX3dvcmtzX2ZyZWUoc3RydWN0IGxpc3RfaGVhZCAqd29ya3MpXFxuIFxcdHNwaW5fdW5sb2NrX2JoKFxcdTAwMjZwYWRhdGFfd29ya3NfbG9jayk7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIHBhZGF0YV9wYXJhbGxlbF93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICpwYXJhbGxlbF93b3JrKVxcbi17XFxuLVxcdHN0cnVjdCBwYWRhdGFfd29yayAqcHcgPSBjb250YWluZXJfb2YocGFyYWxsZWxfd29yaywgc3RydWN0IHBhZGF0YV93b3JrLFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgICBwd193b3JrKTtcXG4tXFx0c3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEgPSBwdy1cXHUwMDNlcHdfZGF0YTtcXG4tXFxuLVxcdGxvY2FsX2JoX2Rpc2FibGUoKTtcXG4tXFx0cGFkYXRhLVxcdTAwM2VwYXJhbGxlbChwYWRhdGEpO1xcbi1cXHRzcGluX2xvY2soXFx1MDAyNnBhZGF0YV93b3Jrc19sb2NrKTtcXG4tXFx0cGFkYXRhX3dvcmtfZnJlZShwdyk7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZwYWRhdGFfd29ya3NfbG9jayk7XFxuLVxcdGxvY2FsX2JoX2VuYWJsZSgpO1xcbi19XFxuLVxcbi0vKipcXG4tICogcGFkYXRhX2RvX3BhcmFsbGVsIC0gcGFkYXRhIHBhcmFsbGVsaXphdGlvbiBmdW5jdGlvblxcbi0gKlxcbi0gKiBAcHM6IHBhZGF0YXNoZWxsXFxuLSAqIEBwYWRhdGE6IG9iamVjdCB0byBiZSBwYXJhbGxlbGl6ZWRcXG4tICogQGNiX2NwdTogcG9pbnRlciB0byB0aGUgQ1BVIHRoYXQgdGhlIHNlcmlhbGl6YXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gc2hvdWxkXFxuLSAqICAgICAgICAgIHJ1biBvbi4gIElmIGl0J3Mgbm90IGluIHRoZSBzZXJpYWwgY3B1bWFzayBvZiBAcGluc3RcXG4tICogICAgICAgICAgKGkuZS4gY3B1bWFzay5jYmNwdSksIHRoaXMgZnVuY3Rpb24gc2VsZWN0cyBhIGZhbGxiYWNrIENQVSBhbmQgaWZcXG4tICogICAgICAgICAgbm9uZSBmb3VuZCwgcmV0dXJucyAtRUlOVkFMLlxcbi0gKlxcbi0gKiBUaGUgcGFyYWxsZWxpemF0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgcnVuIHdpdGggQkhzIG9mZi5cXG4tICogTm90ZTogRXZlcnkgb2JqZWN0IHdoaWNoIGlzIHBhcmFsbGVsaXplZCBieSBwYWRhdGFfZG9fcGFyYWxsZWxcXG4tICogbXVzdCBiZSBzZWVuIGJ5IHBhZGF0YV9kb19zZXJpYWwuXFxuLSAqXFxuLSAqIFJldHVybjogMCBvbiBzdWNjZXNzIG9yIGVsc2UgbmVnYXRpdmUgZXJyb3IgY29kZS5cXG4tICovXFxuLWludCBwYWRhdGFfZG9fcGFyYWxsZWwoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsXFxuLVxcdFxcdCAgICAgICBzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSwgaW50ICpjYl9jcHUpXFxuLXtcXG4tXFx0c3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QgPSBwcy1cXHUwMDNlcGluc3Q7XFxuLVxcdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDtcXG4tXFx0c3RydWN0IHBhZGF0YV93b3JrICpwdztcXG4tXFx0aW50IGNwdV9pbmRleCwgZXJyO1xcbi1cXG4tXFx0cmN1X3JlYWRfbG9ja19iaCgpO1xcbi1cXG4tXFx0cGQgPSByY3VfZGVyZWZlcmVuY2VfYmgocHMtXFx1MDAzZXBkKTtcXG4tXFxuLVxcdGVyciA9IC1FSU5WQUw7XFxuLVxcdGlmICghKHBpbnN0LVxcdTAwM2VmbGFncyBcXHUwMDI2IFBBREFUQV9JTklUKSB8fCBwaW5zdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBQQURBVEFfSU5WQUxJRClcXG4tXFx0XFx0Z290byBvdXQ7XFxuLVxcbi1cXHRpZiAoIWNwdW1hc2tfdGVzdF9jcHUoKmNiX2NwdSwgcGQtXFx1MDAzZWNwdW1hc2suY2JjcHUpKSB7XFxuLVxcdFxcdGlmIChjcHVtYXNrX2VtcHR5KHBkLVxcdTAwM2VjcHVtYXNrLmNiY3B1KSlcXG4tXFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcbi1cXHRcXHQvKiBTZWxlY3QgYW4gYWx0ZXJuYXRlIGZhbGxiYWNrIENQVSBhbmQgbm90aWZ5IHRoZSBjYWxsZXIuICovXFxuLVxcdFxcdGNwdV9pbmRleCA9ICpjYl9jcHUgJSBjcHVtYXNrX3dlaWdodChwZC1cXHUwMDNlY3B1bWFzay5jYmNwdSk7XFxuLVxcdFxcdCpjYl9jcHUgPSBjcHVtYXNrX250aChjcHVfaW5kZXgsIHBkLVxcdTAwM2VjcHVtYXNrLmNiY3B1KTtcXG4tXFx0fVxcbi1cXG4tXFx0ZXJyID0gLUVCVVNZO1xcbi1cXHRpZiAoKHBpbnN0LVxcdTAwM2VmbGFncyBcXHUwMDI2IFBBREFUQV9SRVNFVCkpXFxuLVxcdFxcdGdvdG8gb3V0O1xcbi1cXG4tXFx0cGFkYXRhX2dldF9wZChwZCk7XFxuLVxcdHBhZGF0YS1cXHUwMDNlcGQgPSBwZDtcXG4tXFx0cGFkYXRhLVxcdTAwM2VjYl9jcHUgPSAqY2JfY3B1O1xcbi1cXG4tXFx0c3Bpbl9sb2NrKFxcdTAwMjZwYWRhdGFfd29ya3NfbG9jayk7XFxuLVxcdHBhZGF0YS1cXHUwMDNlc2VxX25yID0gKytwZC1cXHUwMDNlc2VxX25yO1xcbi1cXHRwdyA9IHBhZGF0YV93b3JrX2FsbG9jKCk7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZwYWRhdGFfd29ya3NfbG9jayk7XFxuLVxcbi1cXHRpZiAoIXB3KSB7XFxuLVxcdFxcdC8qIE1heGltdW0gd29ya3MgbGltaXQgZXhjZWVkZWQsIHJ1biBpbiB0aGUgY3VycmVudCB0YXNrLiAqL1xcbi1cXHRcXHRwYWRhdGEtXFx1MDAzZXBhcmFsbGVsKHBhZGF0YSk7XFxuLVxcdH1cXG4tXFxuLVxcdHJjdV9yZWFkX3VubG9ja19iaCgpO1xcbi1cXG4tXFx0aWYgKHB3KSB7XFxuLVxcdFxcdHBhZGF0YV93b3JrX2luaXQocHcsIHBhZGF0YV9wYXJhbGxlbF93b3JrZXIsIHBhZGF0YSwgMCk7XFxuLVxcdFxcdHF1ZXVlX3dvcmsocGluc3QtXFx1MDAzZXBhcmFsbGVsX3dxLCBcXHUwMDI2cHctXFx1MDAzZXB3X3dvcmspO1xcbi1cXHR9XFxuLVxcbi1cXHRyZXR1cm4gMDtcXG4tb3V0Olxcbi1cXHRyY3VfcmVhZF91bmxvY2tfYmgoKTtcXG4tXFxuLVxcdHJldHVybiBlcnI7XFxuLX1cXG4tRVhQT1JUX1NZTUJPTChwYWRhdGFfZG9fcGFyYWxsZWwpO1xcbi1cXG4tLypcXG4tICogcGFkYXRhX2ZpbmRfbmV4dCAtIEZpbmQgdGhlIG5leHQgb2JqZWN0IHRoYXQgbmVlZHMgc2VyaWFsaXphdGlvbi5cXG4tICpcXG4tICogUmV0dXJuOlxcbi0gKiAqIEEgcG9pbnRlciB0byB0aGUgY29udHJvbCBzdHJ1Y3Qgb2YgdGhlIG5leHQgb2JqZWN0IHRoYXQgbmVlZHNcXG4tICogICBzZXJpYWxpemF0aW9uLCBpZiBwcmVzZW50IGluIG9uZSBvZiB0aGUgcGVyY3B1IHJlb3JkZXIgcXVldWVzLlxcbi0gKiAqIE5VTEwsIGlmIHRoZSBuZXh0IG9iamVjdCB0aGF0IG5lZWRzIHNlcmlhbGl6YXRpb24gd2lsbFxcbi0gKiAgIGJlIHBhcmFsbGVsIHByb2Nlc3NlZCBieSBhbm90aGVyIGNwdSBhbmQgaXMgbm90IHlldCBwcmVzZW50IGluXFxuLSAqICAgdGhlIGNwdSdzIHJlb3JkZXIgcXVldWUuXFxuLSAqL1xcbi1zdGF0aWMgc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGFfZmluZF9uZXh0KHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCwgaW50IGNwdSxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGludCBwcm9jZXNzZWQpXFxuLXtcXG4tXFx0c3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGE7XFxuLVxcdHN0cnVjdCBwYWRhdGFfbGlzdCAqcmVvcmRlcjtcXG4tXFxuLVxcdHJlb3JkZXIgPSBwZXJfY3B1X3B0cihwZC1cXHUwMDNlcmVvcmRlcl9saXN0LCBjcHUpO1xcbi1cXG4tXFx0c3Bpbl9sb2NrKFxcdTAwMjZyZW9yZGVyLVxcdTAwM2Vsb2NrKTtcXG4tXFx0aWYgKGxpc3RfZW1wdHkoXFx1MDAyNnJlb3JkZXItXFx1MDAzZWxpc3QpKVxcbi1cXHRcXHRnb3RvIG5vdGZvdW5kO1xcbi1cXG4tXFx0cGFkYXRhID0gbGlzdF9lbnRyeShyZW9yZGVyLVxcdTAwM2VsaXN0Lm5leHQsIHN0cnVjdCBwYWRhdGFfcHJpdiwgbGlzdCk7XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBDaGVja3MgdGhlIHJhcmUgY2FzZSB3aGVyZSB0d28gb3IgbW9yZSBwYXJhbGxlbCBqb2JzIGhhdmUgaGFzaGVkIHRvXFxuLVxcdCAqIHRoZSBzYW1lIENQVSBhbmQgb25lIG9mIHRoZSBsYXRlciBvbmVzIGZpbmlzaGVzIGZpcnN0Llxcbi1cXHQgKi9cXG4tXFx0aWYgKHBhZGF0YS1cXHUwMDNlc2VxX25yICE9IHByb2Nlc3NlZClcXG4tXFx0XFx0Z290byBub3Rmb3VuZDtcXG4tXFxuLVxcdGxpc3RfZGVsX2luaXQoXFx1MDAyNnBhZGF0YS1cXHUwMDNlbGlzdCk7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZyZW9yZGVyLVxcdTAwM2Vsb2NrKTtcXG4tXFx0cmV0dXJuIHBhZGF0YTtcXG4tXFxuLW5vdGZvdW5kOlxcbi1cXHRwZC1cXHUwMDNlcHJvY2Vzc2VkID0gcHJvY2Vzc2VkO1xcbi1cXHRwZC1cXHUwMDNlY3B1ID0gY3B1O1xcbi1cXHRzcGluX3VubG9jayhcXHUwMDI2cmVvcmRlci1cXHUwMDNlbG9jayk7XFxuLVxcdHJldHVybiBOVUxMO1xcbi19XFxuLVxcbi1zdGF0aWMgdm9pZCBwYWRhdGFfcmVvcmRlcihzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSlcXG4te1xcbi1cXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQgPSBwYWRhdGEtXFx1MDAzZXBkO1xcbi1cXHRzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCA9IHBkLVxcdTAwM2Vwcy1cXHUwMDNlcGluc3Q7XFxuLVxcdHVuc2lnbmVkIGludCBwcm9jZXNzZWQ7XFxuLVxcdGludCBjcHU7XFxuLVxcbi1cXHRwcm9jZXNzZWQgPSBwZC1cXHUwMDNlcHJvY2Vzc2VkO1xcbi1cXHRjcHUgPSBwZC1cXHUwMDNlY3B1O1xcbi1cXG4tXFx0ZG8ge1xcbi1cXHRcXHRzdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZSAqc3F1ZXVlO1xcbi1cXHRcXHRpbnQgY2JfY3B1O1xcbi1cXG4tXFx0XFx0cHJvY2Vzc2VkKys7XFxuLVxcdFxcdC8qIFdoZW4gc2VxdWVuY2Ugd3JhcHMgYXJvdW5kLCByZXNldCB0byB0aGUgZmlyc3QgQ1BVLiAqL1xcbi1cXHRcXHRpZiAodW5saWtlbHkocHJvY2Vzc2VkID09IDApKVxcbi1cXHRcXHRcXHRjcHUgPSBjcHVtYXNrX2ZpcnN0KHBkLVxcdTAwM2VjcHVtYXNrLnBjcHUpO1xcbi1cXHRcXHRlbHNlXFxuLVxcdFxcdFxcdGNwdSA9IGNwdW1hc2tfbmV4dF93cmFwKGNwdSwgcGQtXFx1MDAzZWNwdW1hc2sucGNwdSk7XFxuLVxcbi1cXHRcXHRjYl9jcHUgPSBwYWRhdGEtXFx1MDAzZWNiX2NwdTtcXG4tXFx0XFx0c3F1ZXVlID0gcGVyX2NwdV9wdHIocGQtXFx1MDAzZXNxdWV1ZSwgY2JfY3B1KTtcXG4tXFxuLVxcdFxcdHNwaW5fbG9jayhcXHUwMDI2c3F1ZXVlLVxcdTAwM2VzZXJpYWwubG9jayk7XFxuLVxcdFxcdGxpc3RfYWRkX3RhaWwoXFx1MDAyNnBhZGF0YS1cXHUwMDNlbGlzdCwgXFx1MDAyNnNxdWV1ZS1cXHUwMDNlc2VyaWFsLmxpc3QpO1xcbi1cXHRcXHRxdWV1ZV93b3JrX29uKGNiX2NwdSwgcGluc3QtXFx1MDAzZXNlcmlhbF93cSwgXFx1MDAyNnNxdWV1ZS1cXHUwMDNld29yayk7XFxuLVxcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBJZiB0aGUgbmV4dCBvYmplY3QgdGhhdCBuZWVkcyBzZXJpYWxpemF0aW9uIGlzIHBhcmFsbGVsXFxuLVxcdFxcdCAqIHByb2Nlc3NlZCBieSBhbm90aGVyIGNwdSBhbmQgaXMgc3RpbGwgb24gaXQncyB3YXkgdG8gdGhlXFxuLVxcdFxcdCAqIGNwdSdzIHJlb3JkZXIgcXVldWUsIGVuZCB0aGUgbG9vcC5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdHBhZGF0YSA9IHBhZGF0YV9maW5kX25leHQocGQsIGNwdSwgcHJvY2Vzc2VkKTtcXG4tXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNnNxdWV1ZS1cXHUwMDNlc2VyaWFsLmxvY2spO1xcbi1cXHR9IHdoaWxlIChwYWRhdGEpO1xcbi19XFxuLVxcbi1zdGF0aWMgdm9pZCBwYWRhdGFfc2VyaWFsX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnNlcmlhbF93b3JrKVxcbi17XFxuLVxcdHN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlICpzcXVldWU7XFxuLVxcdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDtcXG4tXFx0TElTVF9IRUFEKGxvY2FsX2xpc3QpO1xcbi1cXHRpbnQgY250O1xcbi1cXG4tXFx0bG9jYWxfYmhfZGlzYWJsZSgpO1xcbi1cXHRzcXVldWUgPSBjb250YWluZXJfb2Yoc2VyaWFsX3dvcmssIHN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlLCB3b3JrKTtcXG4tXFx0cGQgPSBzcXVldWUtXFx1MDAzZXBkO1xcbi1cXG4tXFx0c3Bpbl9sb2NrKFxcdTAwMjZzcXVldWUtXFx1MDAzZXNlcmlhbC5sb2NrKTtcXG4tXFx0bGlzdF9yZXBsYWNlX2luaXQoXFx1MDAyNnNxdWV1ZS1cXHUwMDNlc2VyaWFsLmxpc3QsIFxcdTAwMjZsb2NhbF9saXN0KTtcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnNxdWV1ZS1cXHUwMDNlc2VyaWFsLmxvY2spO1xcbi1cXG4tXFx0Y250ID0gMDtcXG4tXFxuLVxcdHdoaWxlICghbGlzdF9lbXB0eShcXHUwMDI2bG9jYWxfbGlzdCkpIHtcXG4tXFx0XFx0c3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGE7XFxuLVxcbi1cXHRcXHRwYWRhdGEgPSBsaXN0X2VudHJ5KGxvY2FsX2xpc3QubmV4dCxcXG4tXFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBwYWRhdGFfcHJpdiwgbGlzdCk7XFxuLVxcbi1cXHRcXHRsaXN0X2RlbF9pbml0KFxcdTAwMjZwYWRhdGEtXFx1MDAzZWxpc3QpO1xcbi1cXG4tXFx0XFx0cGFkYXRhLVxcdTAwM2VzZXJpYWwocGFkYXRhKTtcXG4tXFx0XFx0Y250Kys7XFxuLVxcdH1cXG4tXFx0bG9jYWxfYmhfZW5hYmxlKCk7XFxuLVxcbi1cXHRwYWRhdGFfcHV0X3BkX2NudChwZCwgY250KTtcXG4tfVxcbi1cXG4tLyoqXFxuLSAqIHBhZGF0YV9kb19zZXJpYWwgLSBwYWRhdGEgc2VyaWFsaXphdGlvbiBmdW5jdGlvblxcbi0gKlxcbi0gKiBAcGFkYXRhOiBvYmplY3QgdG8gYmUgc2VyaWFsaXplZC5cXG4tICpcXG4tICogcGFkYXRhX2RvX3NlcmlhbCBtdXN0IGJlIGNhbGxlZCBmb3IgZXZlcnkgcGFyYWxsZWxpemVkIG9iamVjdC5cXG4tICogVGhlIHNlcmlhbGl6YXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBydW4gd2l0aCBCSHMgb2ZmLlxcbi0gKi9cXG4tdm9pZCBwYWRhdGFfZG9fc2VyaWFsKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKVxcbi17XFxuLVxcdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCA9IHBhZGF0YS1cXHUwMDNlcGQ7XFxuLVxcdGludCBoYXNoZWRfY3B1ID0gcGFkYXRhX2NwdV9oYXNoKHBkLCBwYWRhdGEtXFx1MDAzZXNlcV9ucik7XFxuLVxcdHN0cnVjdCBwYWRhdGFfbGlzdCAqcmVvcmRlciA9IHBlcl9jcHVfcHRyKHBkLVxcdTAwM2VyZW9yZGVyX2xpc3QsIGhhc2hlZF9jcHUpO1xcbi1cXHRzdHJ1Y3QgcGFkYXRhX3ByaXYgKmN1cjtcXG4tXFx0c3RydWN0IGxpc3RfaGVhZCAqcG9zO1xcbi1cXHRib29sIGdvdGl0ID0gdHJ1ZTtcXG4tXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2cmVvcmRlci1cXHUwMDNlbG9jayk7XFxuLVxcdC8qIFNvcnQgaW4gYXNjZW5kaW5nIG9yZGVyIG9mIHNlcXVlbmNlIG51bWJlci4gKi9cXG4tXFx0bGlzdF9mb3JfZWFjaF9wcmV2KHBvcywgXFx1MDAyNnJlb3JkZXItXFx1MDAzZWxpc3QpIHtcXG4tXFx0XFx0Y3VyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBwYWRhdGFfcHJpdiwgbGlzdCk7XFxuLVxcdFxcdC8qIENvbXBhcmUgYnkgZGlmZmVyZW5jZSB0byBjb25zaWRlciBpbnRlZ2VyIHdyYXAgYXJvdW5kICovXFxuLVxcdFxcdGlmICgoc2lnbmVkIGludCkoY3VyLVxcdTAwM2VzZXFfbnIgLSBwYWRhdGEtXFx1MDAzZXNlcV9ucikgXFx1MDAzYyAwKVxcbi1cXHRcXHRcXHRicmVhaztcXG4tXFx0fVxcbi1cXHRpZiAocGFkYXRhLVxcdTAwM2VzZXFfbnIgIT0gcGQtXFx1MDAzZXByb2Nlc3NlZCkge1xcbi1cXHRcXHRnb3RpdCA9IGZhbHNlO1xcbi1cXHRcXHRsaXN0X2FkZChcXHUwMDI2cGFkYXRhLVxcdTAwM2VsaXN0LCBwb3MpO1xcbi1cXHR9XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZyZW9yZGVyLVxcdTAwM2Vsb2NrKTtcXG4tXFxuLVxcdGlmIChnb3RpdClcXG4tXFx0XFx0cGFkYXRhX3Jlb3JkZXIocGFkYXRhKTtcXG4tfVxcbi1FWFBPUlRfU1lNQk9MKHBhZGF0YV9kb19zZXJpYWwpO1xcbi1cXG4tc3RhdGljIGludCBwYWRhdGFfc2V0dXBfY3B1bWFza3Moc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpXFxuLXtcXG4tXFx0c3RydWN0IHdvcmtxdWV1ZV9hdHRycyAqYXR0cnM7XFxuLVxcdGludCBlcnI7XFxuLVxcbi1cXHRhdHRycyA9IGFsbG9jX3dvcmtxdWV1ZV9hdHRycygpO1xcbi1cXHRpZiAoIWF0dHJzKVxcbi1cXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4tXFxuLVxcdC8qIFJlc3RyaWN0IHBhcmFsbGVsX3dxIHdvcmtlcnMgdG8gcGQtXFx1MDAzZWNwdW1hc2sucGNwdS4gKi9cXG4tXFx0Y3B1bWFza19jb3B5KGF0dHJzLVxcdTAwM2VjcHVtYXNrLCBwaW5zdC1cXHUwMDNlY3B1bWFzay5wY3B1KTtcXG4tXFx0ZXJyID0gYXBwbHlfd29ya3F1ZXVlX2F0dHJzKHBpbnN0LVxcdTAwM2VwYXJhbGxlbF93cSwgYXR0cnMpO1xcbi1cXHRmcmVlX3dvcmtxdWV1ZV9hdHRycyhhdHRycyk7XFxuLVxcbi1cXHRyZXR1cm4gZXJyO1xcbi19XFxuLVxcbiBzdGF0aWMgdm9pZCBfX2luaXQgcGFkYXRhX210X2hlbHBlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpXFxuIHtcXG4gXFx0c3RydWN0IHBhZGF0YV93b3JrICpwdyA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgcGFkYXRhX3dvcmssIHB3X3dvcmspO1xcbkBAIC01MDYsNjEzICsyMjQsMTcgQEAgdm9pZCBfX2luaXQgcGFkYXRhX2RvX211bHRpdGhyZWFkZWQoc3RydWN0IHBhZGF0YV9tdF9qb2IgKmpvYilcXG4gXFx0cGFkYXRhX3dvcmtzX2ZyZWUoXFx1MDAyNndvcmtzKTtcXG4gfVxcbiBcXG4tLyogSW5pdGlhbGl6ZSBhbGwgcGVyY3B1IHF1ZXVlcyB1c2VkIGJ5IHNlcmlhbCB3b3JrZXJzICovXFxuLXN0YXRpYyB2b2lkIHBhZGF0YV9pbml0X3NxdWV1ZXMoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKVxcbi17XFxuLVxcdGludCBjcHU7XFxuLVxcdHN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlICpzcXVldWU7XFxuLVxcbi1cXHRmb3JfZWFjaF9jcHUoY3B1LCBwZC1cXHUwMDNlY3B1bWFzay5jYmNwdSkge1xcbi1cXHRcXHRzcXVldWUgPSBwZXJfY3B1X3B0cihwZC1cXHUwMDNlc3F1ZXVlLCBjcHUpO1xcbi1cXHRcXHRzcXVldWUtXFx1MDAzZXBkID0gcGQ7XFxuLVxcdFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZzcXVldWUtXFx1MDAzZXNlcmlhbC5saXN0KTtcXG4tXFx0XFx0c3Bpbl9sb2NrX2luaXQoXFx1MDAyNnNxdWV1ZS1cXHUwMDNlc2VyaWFsLmxvY2spO1xcbi1cXHRcXHRJTklUX1dPUksoXFx1MDAyNnNxdWV1ZS1cXHUwMDNld29yaywgcGFkYXRhX3NlcmlhbF93b3JrZXIpO1xcbi1cXHR9XFxuLX1cXG4tXFxuLS8qIEluaXRpYWxpemUgcGVyLUNQVSByZW9yZGVyIGxpc3RzICovXFxuLXN0YXRpYyB2b2lkIHBhZGF0YV9pbml0X3Jlb3JkZXJfbGlzdChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQpXFxuLXtcXG4tXFx0aW50IGNwdTtcXG4tXFx0c3RydWN0IHBhZGF0YV9saXN0ICpsaXN0O1xcbi1cXG4tXFx0Zm9yX2VhY2hfY3B1KGNwdSwgcGQtXFx1MDAzZWNwdW1hc2sucGNwdSkge1xcbi1cXHRcXHRsaXN0ID0gcGVyX2NwdV9wdHIocGQtXFx1MDAzZXJlb3JkZXJfbGlzdCwgY3B1KTtcXG4tXFx0XFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNmxpc3QtXFx1MDAzZWxpc3QpO1xcbi1cXHRcXHRzcGluX2xvY2tfaW5pdChcXHUwMDI2bGlzdC1cXHUwMDNlbG9jayk7XFxuLVxcdH1cXG4tfVxcbi1cXG4tLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGludGVybmFsIGNwdW1hc2sgZGVwZW5kZW5kIHJlc291cmNlcy4gKi9cXG4tc3RhdGljIHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwYWRhdGFfYWxsb2NfcGQoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgaW50IG9mZmxpbmluZ19jcHUpXFxuLXtcXG4tXFx0c3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QgPSBwcy1cXHUwMDNlcGluc3Q7XFxuLVxcdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDtcXG4tXFxuLVxcdHBkID0ga3phbGxvY19vYmooc3RydWN0IHBhcmFsbGVsX2RhdGEpO1xcbi1cXHRpZiAoIXBkKVxcbi1cXHRcXHRnb3RvIGVycjtcXG4tXFxuLVxcdHBkLVxcdTAwM2VyZW9yZGVyX2xpc3QgPSBhbGxvY19wZXJjcHUoc3RydWN0IHBhZGF0YV9saXN0KTtcXG4tXFx0aWYgKCFwZC1cXHUwMDNlcmVvcmRlcl9saXN0KVxcbi1cXHRcXHRnb3RvIGVycl9mcmVlX3BkO1xcbi1cXG4tXFx0cGQtXFx1MDAzZXNxdWV1ZSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZSk7XFxuLVxcdGlmICghcGQtXFx1MDAzZXNxdWV1ZSlcXG4tXFx0XFx0Z290byBlcnJfZnJlZV9yZW9yZGVyX2xpc3Q7XFxuLVxcbi1cXHRwZC1cXHUwMDNlcHMgPSBwcztcXG4tXFxuLVxcdGlmICghYWxsb2NfY3B1bWFza192YXIoXFx1MDAyNnBkLVxcdTAwM2VjcHVtYXNrLnBjcHUsIEdGUF9LRVJORUwpKVxcbi1cXHRcXHRnb3RvIGVycl9mcmVlX3NxdWV1ZTtcXG4tXFx0aWYgKCFhbGxvY19jcHVtYXNrX3ZhcihcXHUwMDI2cGQtXFx1MDAzZWNwdW1hc2suY2JjcHUsIEdGUF9LRVJORUwpKVxcbi1cXHRcXHRnb3RvIGVycl9mcmVlX3BjcHU7XFxuLVxcbi1cXHRjcHVtYXNrX2FuZChwZC1cXHUwMDNlY3B1bWFzay5wY3B1LCBwaW5zdC1cXHUwMDNlY3B1bWFzay5wY3B1LCBjcHVfb25saW5lX21hc2spO1xcbi1cXHRjcHVtYXNrX2FuZChwZC1cXHUwMDNlY3B1bWFzay5jYmNwdSwgcGluc3QtXFx1MDAzZWNwdW1hc2suY2JjcHUsIGNwdV9vbmxpbmVfbWFzayk7XFxuLVxcdGlmIChvZmZsaW5pbmdfY3B1IFxcdTAwM2U9IDApIHtcXG4tXFx0XFx0X19jcHVtYXNrX2NsZWFyX2NwdShvZmZsaW5pbmdfY3B1LCBwZC1cXHUwMDNlY3B1bWFzay5wY3B1KTtcXG4tXFx0XFx0X19jcHVtYXNrX2NsZWFyX2NwdShvZmZsaW5pbmdfY3B1LCBwZC1cXHUwMDNlY3B1bWFzay5jYmNwdSk7XFxuLVxcdH1cXG4tXFxuLVxcdHBhZGF0YV9pbml0X3Jlb3JkZXJfbGlzdChwZCk7XFxuLVxcdHBhZGF0YV9pbml0X3NxdWV1ZXMocGQpO1xcbi1cXHRwZC1cXHUwMDNlc2VxX25yID0gLTE7XFxuLVxcdHJlZmNvdW50X3NldChcXHUwMDI2cGQtXFx1MDAzZXJlZmNudCwgMSk7XFxuLVxcdHBkLVxcdTAwM2VjcHUgPSBjcHVtYXNrX2ZpcnN0KHBkLVxcdTAwM2VjcHVtYXNrLnBjcHUpO1xcbi1cXG4tXFx0cmV0dXJuIHBkO1xcbi1cXG4tZXJyX2ZyZWVfcGNwdTpcXG4tXFx0ZnJlZV9jcHVtYXNrX3ZhcihwZC1cXHUwMDNlY3B1bWFzay5wY3B1KTtcXG4tZXJyX2ZyZWVfc3F1ZXVlOlxcbi1cXHRmcmVlX3BlcmNwdShwZC1cXHUwMDNlc3F1ZXVlKTtcXG4tZXJyX2ZyZWVfcmVvcmRlcl9saXN0Olxcbi1cXHRmcmVlX3BlcmNwdShwZC1cXHUwMDNlcmVvcmRlcl9saXN0KTtcXG4tZXJyX2ZyZWVfcGQ6XFxuLVxcdGtmcmVlKHBkKTtcXG4tZXJyOlxcbi1cXHRyZXR1cm4gTlVMTDtcXG4tfVxcbi1cXG4tc3RhdGljIHZvaWQgcGFkYXRhX2ZyZWVfcGQoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKVxcbi17XFxuLVxcdGZyZWVfY3B1bWFza192YXIocGQtXFx1MDAzZWNwdW1hc2sucGNwdSk7XFxuLVxcdGZyZWVfY3B1bWFza192YXIocGQtXFx1MDAzZWNwdW1hc2suY2JjcHUpO1xcbi1cXHRmcmVlX3BlcmNwdShwZC1cXHUwMDNlcmVvcmRlcl9saXN0KTtcXG4tXFx0ZnJlZV9wZXJjcHUocGQtXFx1MDAzZXNxdWV1ZSk7XFxuLVxcdGtmcmVlKHBkKTtcXG4tfVxcbi1cXG4tc3RhdGljIHZvaWQgX19wYWRhdGFfc3RhcnQoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpXFxuLXtcXG4tXFx0cGluc3QtXFx1MDAzZWZsYWdzIHw9IFBBREFUQV9JTklUO1xcbi19XFxuLVxcbi1zdGF0aWMgdm9pZCBfX3BhZGF0YV9zdG9wKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KVxcbi17XFxuLVxcdGlmICghKHBpbnN0LVxcdTAwM2VmbGFncyBcXHUwMDI2IFBBREFUQV9JTklUKSlcXG4tXFx0XFx0cmV0dXJuO1xcbi1cXG4tXFx0cGluc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjY9IH5QQURBVEFfSU5JVDtcXG4tXFxuLVxcdHN5bmNocm9uaXplX3JjdSgpO1xcbi19XFxuLVxcbi0vKiBSZXBsYWNlIHRoZSBpbnRlcm5hbCBjb250cm9sIHN0cnVjdHVyZSB3aXRoIGEgbmV3IG9uZS4gKi9cXG4tc3RhdGljIGludCBwYWRhdGFfcmVwbGFjZV9vbmUoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsIGludCBvZmZsaW5pbmdfY3B1KVxcbi17XFxuLVxcdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZF9uZXc7XFxuLVxcbi1cXHRwZF9uZXcgPSBwYWRhdGFfYWxsb2NfcGQocHMsIG9mZmxpbmluZ19jcHUpO1xcbi1cXHRpZiAoIXBkX25ldylcXG4tXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuLVxcbi1cXHRwcy1cXHUwMDNlb3BkID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChwcy1cXHUwMDNlcGQsIDEpO1xcbi1cXHRyY3VfYXNzaWduX3BvaW50ZXIocHMtXFx1MDAzZXBkLCBwZF9uZXcpO1xcbi1cXG4tXFx0cmV0dXJuIDA7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbnQgcGFkYXRhX3JlcGxhY2Uoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsIGludCBvZmZsaW5pbmdfY3B1KVxcbi17XFxuLVxcdHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzO1xcbi1cXHRpbnQgZXJyID0gMDtcXG4tXFxuLVxcdHBpbnN0LVxcdTAwM2VmbGFncyB8PSBQQURBVEFfUkVTRVQ7XFxuLVxcbi1cXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KHBzLCBcXHUwMDI2cGluc3QtXFx1MDAzZXBzbGlzdCwgbGlzdCkge1xcbi1cXHRcXHRlcnIgPSBwYWRhdGFfcmVwbGFjZV9vbmUocHMsIG9mZmxpbmluZ19jcHUpO1xcbi1cXHRcXHRpZiAoZXJyKVxcbi1cXHRcXHRcXHRicmVhaztcXG4tXFx0fVxcbi1cXG4tXFx0c3luY2hyb25pemVfcmN1KCk7XFxuLVxcbi1cXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JldmVyc2UocHMsIFxcdTAwMjZwaW5zdC1cXHUwMDNlcHNsaXN0LCBsaXN0KVxcbi1cXHRcXHRwYWRhdGFfcHV0X3BkKHBzLVxcdTAwM2VvcGQpO1xcbi1cXG4tXFx0cGluc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjY9IH5QQURBVEFfUkVTRVQ7XFxuLVxcbi1cXHRyZXR1cm4gZXJyO1xcbi19XFxuLVxcbi0vKiBJZiBjcHVtYXNrIGNvbnRhaW5zIG5vIGFjdGl2ZSBjcHUsIHdlIG1hcmsgdGhlIGluc3RhbmNlIGFzIGludmFsaWQuICovXFxuLXN0YXRpYyBib29sIHBhZGF0YV92YWxpZGF0ZV9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LFxcbi1cXHRcXHRcXHRcXHQgICAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2ssXFxuLVxcdFxcdFxcdFxcdCAgICBpbnQgb2ZmbGluaW5nX2NwdSlcXG4te1xcbi1cXHRjcHVtYXNrX2NvcHkocGluc3QtXFx1MDAzZXZhbGlkYXRlX2NwdW1hc2ssIGNwdV9vbmxpbmVfbWFzayk7XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBAb2ZmbGluaW5nX2NwdSBpcyBzdGlsbCBpbiBjcHVfb25saW5lX21hc2ssIHNvIHJlbW92ZSBpdCBoZXJlIGZvclxcbi1cXHQgKiB2YWxpZGF0aW9uLiAgVXNpbmcgYSBzdWItQ1BVSFBfVEVBUkRPV05fQ1BVIGhvdHBsdWcgc3RhdGUgd2hlcmVcXG4tXFx0ICogQG9mZmxpbmluZ19jcHUgd291bGRuJ3QgYmUgaW4gdGhlIG9ubGluZSBtYXNrIGRvZXNuJ3Qgd29yayBiZWNhdXNlXFxuLVxcdCAqIHBhZGF0YV9jcHVfb2ZmbGluZSgpIGNhbiBmYWlsIGJ1dCBzdWNoIGEgc3RhdGUgZG9lc24ndCBhbGxvdyBmYWlsdXJlLlxcbi1cXHQgKi9cXG4tXFx0aWYgKG9mZmxpbmluZ19jcHUgXFx1MDAzZT0gMClcXG4tXFx0XFx0X19jcHVtYXNrX2NsZWFyX2NwdShvZmZsaW5pbmdfY3B1LCBwaW5zdC1cXHUwMDNldmFsaWRhdGVfY3B1bWFzayk7XFxuLVxcbi1cXHRpZiAoIWNwdW1hc2tfaW50ZXJzZWN0cyhjcHVtYXNrLCBwaW5zdC1cXHUwMDNldmFsaWRhdGVfY3B1bWFzaykpIHtcXG4tXFx0XFx0cGluc3QtXFx1MDAzZWZsYWdzIHw9IFBBREFUQV9JTlZBTElEO1xcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcdH1cXG4tXFxuLVxcdHBpbnN0LVxcdTAwM2VmbGFncyBcXHUwMDI2PSB+UEFEQVRBX0lOVkFMSUQ7XFxuLVxcdHJldHVybiB0cnVlO1xcbi19XFxuLVxcbi1zdGF0aWMgaW50IF9fcGFkYXRhX3NldF9jcHVtYXNrcyhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCxcXG4tXFx0XFx0XFx0XFx0IGNwdW1hc2tfdmFyX3QgcGNwdW1hc2ssXFxuLVxcdFxcdFxcdFxcdCBjcHVtYXNrX3Zhcl90IGNiY3B1bWFzaylcXG4te1xcbi1cXHRpbnQgdmFsaWQ7XFxuLVxcdGludCBlcnI7XFxuLVxcbi1cXHR2YWxpZCA9IHBhZGF0YV92YWxpZGF0ZV9jcHVtYXNrKHBpbnN0LCBwY3B1bWFzaywgLTEpO1xcbi1cXHRpZiAoIXZhbGlkKSB7XFxuLVxcdFxcdF9fcGFkYXRhX3N0b3AocGluc3QpO1xcbi1cXHRcXHRnb3RvIG91dF9yZXBsYWNlO1xcbi1cXHR9XFxuLVxcbi1cXHR2YWxpZCA9IHBhZGF0YV92YWxpZGF0ZV9jcHVtYXNrKHBpbnN0LCBjYmNwdW1hc2ssIC0xKTtcXG4tXFx0aWYgKCF2YWxpZClcXG4tXFx0XFx0X19wYWRhdGFfc3RvcChwaW5zdCk7XFxuLVxcbi1vdXRfcmVwbGFjZTpcXG4tXFx0Y3B1bWFza19jb3B5KHBpbnN0LVxcdTAwM2VjcHVtYXNrLnBjcHUsIHBjcHVtYXNrKTtcXG4tXFx0Y3B1bWFza19jb3B5KHBpbnN0LVxcdTAwM2VjcHVtYXNrLmNiY3B1LCBjYmNwdW1hc2spO1xcbi1cXG4tXFx0ZXJyID0gcGFkYXRhX3NldHVwX2NwdW1hc2tzKHBpbnN0KSA/OiBwYWRhdGFfcmVwbGFjZShwaW5zdCwgLTEpO1xcbi1cXG4tXFx0aWYgKHZhbGlkKVxcbi1cXHRcXHRfX3BhZGF0YV9zdGFydChwaW5zdCk7XFxuLVxcbi1cXHRyZXR1cm4gZXJyO1xcbi19XFxuLVxcbi0vKipcXG4tICogcGFkYXRhX3NldF9jcHVtYXNrIC0gU2V0cyBzcGVjaWZpZWQgYnkgQGNwdW1hc2tfdHlwZSBjcHVtYXNrIHRvIHRoZSB2YWx1ZVxcbi0gKiAgICAgICAgICAgICAgICAgICAgICBlcXVpdmFsZW50IHRvIEBjcHVtYXNrLlxcbi0gKiBAcGluc3Q6IHBhZGF0YSBpbnN0YW5jZVxcbi0gKiBAY3B1bWFza190eXBlOiBQQURBVEFfQ1BVX1NFUklBTCBvciBQQURBVEFfQ1BVX1BBUkFMTEVMIGNvcnJlc3BvbmRpbmdcXG4tICogICAgICAgICAgICAgICAgdG8gcGFyYWxsZWwgYW5kIHNlcmlhbCBjcHVtYXNrcyByZXNwZWN0aXZlbHkuXFxuLSAqIEBjcHVtYXNrOiB0aGUgY3B1bWFzayB0byB1c2VcXG4tICpcXG4tICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZVxcbi0gKi9cXG4taW50IHBhZGF0YV9zZXRfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdW1hc2tfdHlwZSxcXG4tXFx0XFx0ICAgICAgIGNwdW1hc2tfdmFyX3QgY3B1bWFzaylcXG4te1xcbi1cXHRzdHJ1Y3QgY3B1bWFzayAqc2VyaWFsX21hc2ssICpwYXJhbGxlbF9tYXNrO1xcbi1cXHRpbnQgZXJyID0gLUVJTlZBTDtcXG4tXFxuLVxcdGNwdXNfcmVhZF9sb2NrKCk7XFxuLVxcdG11dGV4X2xvY2soXFx1MDAyNnBpbnN0LVxcdTAwM2Vsb2NrKTtcXG4tXFxuLVxcdHN3aXRjaCAoY3B1bWFza190eXBlKSB7XFxuLVxcdGNhc2UgUEFEQVRBX0NQVV9QQVJBTExFTDpcXG4tXFx0XFx0c2VyaWFsX21hc2sgPSBwaW5zdC1cXHUwMDNlY3B1bWFzay5jYmNwdTtcXG4tXFx0XFx0cGFyYWxsZWxfbWFzayA9IGNwdW1hc2s7XFxuLVxcdFxcdGJyZWFrO1xcbi1cXHRjYXNlIFBBREFUQV9DUFVfU0VSSUFMOlxcbi1cXHRcXHRwYXJhbGxlbF9tYXNrID0gcGluc3QtXFx1MDAzZWNwdW1hc2sucGNwdTtcXG4tXFx0XFx0c2VyaWFsX21hc2sgPSBjcHVtYXNrO1xcbi1cXHRcXHRicmVhaztcXG4tXFx0ZGVmYXVsdDpcXG4tXFx0XFx0IGdvdG8gb3V0O1xcbi1cXHR9XFxuLVxcbi1cXHRlcnIgPSAgX19wYWRhdGFfc2V0X2NwdW1hc2tzKHBpbnN0LCBwYXJhbGxlbF9tYXNrLCBzZXJpYWxfbWFzayk7XFxuLVxcbi1vdXQ6XFxuLVxcdG11dGV4X3VubG9jayhcXHUwMDI2cGluc3QtXFx1MDAzZWxvY2spO1xcbi1cXHRjcHVzX3JlYWRfdW5sb2NrKCk7XFxuLVxcbi1cXHRyZXR1cm4gZXJyO1xcbi19XFxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX3NldF9jcHVtYXNrKTtcXG4tXFxuLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFVcXG4tXFxuLXN0YXRpYyBpbmxpbmUgaW50IHBpbnN0X2hhc19jcHUoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsIGludCBjcHUpXFxuLXtcXG4tXFx0cmV0dXJuIGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBwaW5zdC1cXHUwMDNlY3B1bWFzay5wY3B1KSB8fFxcbi1cXHRcXHRjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgcGluc3QtXFx1MDAzZWNwdW1hc2suY2JjcHUpO1xcbi19XFxuLVxcbi1zdGF0aWMgaW50IHBhZGF0YV9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKVxcbi17XFxuLVxcdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0O1xcbi1cXHRpbnQgcmV0O1xcbi1cXG4tXFx0cGluc3QgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UsIGNwdWhwX25vZGUpO1xcbi1cXHRpZiAoIXBpbnN0X2hhc19jcHUocGluc3QsIGNwdSkpXFxuLVxcdFxcdHJldHVybiAwO1xcbi1cXG4tXFx0bXV0ZXhfbG9jayhcXHUwMDI2cGluc3QtXFx1MDAzZWxvY2spO1xcbi1cXG4tXFx0cmV0ID0gcGFkYXRhX3JlcGxhY2UocGluc3QsIC0xKTtcXG4tXFxuLVxcdGlmIChwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGluc3QtXFx1MDAzZWNwdW1hc2sucGNwdSwgLTEpIFxcdTAwMjZcXHUwMDI2XFxuLVxcdCAgICBwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGluc3QtXFx1MDAzZWNwdW1hc2suY2JjcHUsIC0xKSlcXG4tXFx0XFx0X19wYWRhdGFfc3RhcnQocGluc3QpO1xcbi1cXG4tXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZwaW5zdC1cXHUwMDNlbG9jayk7XFxuLVxcdHJldHVybiByZXQ7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbnQgcGFkYXRhX2NwdV9vZmZsaW5lKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKVxcbi17XFxuLVxcdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0O1xcbi1cXHRpbnQgcmV0O1xcbi1cXG4tXFx0cGluc3QgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UsIGNwdWhwX25vZGUpO1xcbi1cXHRpZiAoIXBpbnN0X2hhc19jcHUocGluc3QsIGNwdSkpXFxuLVxcdFxcdHJldHVybiAwO1xcbi1cXG4tXFx0bXV0ZXhfbG9jayhcXHUwMDI2cGluc3QtXFx1MDAzZWxvY2spO1xcbi1cXG4tXFx0aWYgKCFwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGluc3QtXFx1MDAzZWNwdW1hc2sucGNwdSwgY3B1KSB8fFxcbi1cXHQgICAgIXBhZGF0YV92YWxpZGF0ZV9jcHVtYXNrKHBpbnN0LCBwaW5zdC1cXHUwMDNlY3B1bWFzay5jYmNwdSwgY3B1KSlcXG4tXFx0XFx0X19wYWRhdGFfc3RvcChwaW5zdCk7XFxuLVxcbi1cXHRyZXQgPSBwYWRhdGFfcmVwbGFjZShwaW5zdCwgY3B1KTtcXG4tXFxuLVxcdG11dGV4X3VubG9jayhcXHUwMDI2cGluc3QtXFx1MDAzZWxvY2spO1xcbi1cXHRyZXR1cm4gcmV0O1xcbi19XFxuLVxcbi1zdGF0aWMgZW51bSBjcHVocF9zdGF0ZSBocF9vbmxpbmU7XFxuLSNlbmRpZlxcbi1cXG4tc3RhdGljIHZvaWQgX19wYWRhdGFfZnJlZShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdClcXG4te1xcbi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVXFxuLVxcdGNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzKGhwX29ubGluZSwgXFx1MDAyNnBpbnN0LVxcdTAwM2VjcHVocF9ub2RlKTtcXG4tI2VuZGlmXFxuLVxcbi1cXHRXQVJOX09OKCFsaXN0X2VtcHR5KFxcdTAwMjZwaW5zdC1cXHUwMDNlcHNsaXN0KSk7XFxuLVxcbi1cXHRmcmVlX2NwdW1hc2tfdmFyKHBpbnN0LVxcdTAwM2VjcHVtYXNrLnBjcHUpO1xcbi1cXHRmcmVlX2NwdW1hc2tfdmFyKHBpbnN0LVxcdTAwM2VjcHVtYXNrLmNiY3B1KTtcXG4tXFx0ZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC1cXHUwMDNldmFsaWRhdGVfY3B1bWFzayk7XFxuLVxcdGRlc3Ryb3lfd29ya3F1ZXVlKHBpbnN0LVxcdTAwM2VzZXJpYWxfd3EpO1xcbi1cXHRkZXN0cm95X3dvcmtxdWV1ZShwaW5zdC1cXHUwMDNlcGFyYWxsZWxfd3EpO1xcbi1cXHRrZnJlZShwaW5zdCk7XFxuLX1cXG4tXFxuLSNkZWZpbmUga29iajJwaW5zdChfa29iailcXHRcXHRcXHRcXHRcXHRcXFxcXFxuLVxcdGNvbnRhaW5lcl9vZihfa29iaiwgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSwga29iailcXG4tI2RlZmluZSBhdHRyMnBlbnRyeShfYXR0cilcXHRcXHRcXHRcXHRcXHRcXFxcXFxuLVxcdGNvbnRhaW5lcl9vZl9jb25zdChfYXR0ciwgc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSwgYXR0cilcXG4tXFxuLXN0YXRpYyB2b2lkIHBhZGF0YV9zeXNmc19yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKVxcbi17XFxuLVxcdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0ID0ga29iajJwaW5zdChrb2JqKTtcXG4tXFx0X19wYWRhdGFfZnJlZShwaW5zdCk7XFxuLX1cXG4tXFxuLXN0cnVjdCBwYWRhdGFfc3lzZnNfZW50cnkge1xcbi1cXHRzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7XFxuLVxcdHNzaXplX3QgKCpzaG93KShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKiwgY2hhciAqKTtcXG4tXFx0c3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKixcXG4tXFx0XFx0XFx0IGNvbnN0IGNoYXIgKiwgc2l6ZV90KTtcXG4tfTtcXG4tXFxuLXN0YXRpYyBzc2l6ZV90IHNob3dfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCxcXG4tXFx0XFx0XFx0ICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsICBjaGFyICpidWYpXFxuLXtcXG4tXFx0c3RydWN0IGNwdW1hc2sgKmNwdW1hc2s7XFxuLVxcdHNzaXplX3QgbGVuO1xcbi1cXG4tXFx0bXV0ZXhfbG9jayhcXHUwMDI2cGluc3QtXFx1MDAzZWxvY2spO1xcbi1cXHRpZiAoIXN0cmNtcChhdHRyLVxcdTAwM2VuYW1lLCBcXFwic2VyaWFsX2NwdW1hc2tcXFwiKSlcXG4tXFx0XFx0Y3B1bWFzayA9IHBpbnN0LVxcdTAwM2VjcHVtYXNrLmNiY3B1O1xcbi1cXHRlbHNlXFxuLVxcdFxcdGNwdW1hc2sgPSBwaW5zdC1cXHUwMDNlY3B1bWFzay5wY3B1O1xcbi1cXG4tXFx0bGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsIFxcXCIlKnBiXFxcXG5cXFwiLFxcbi1cXHRcXHQgICAgICAgbnJfY3B1X2lkcywgY3B1bWFza19iaXRzKGNwdW1hc2spKTtcXG4tXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZwaW5zdC1cXHUwMDNlbG9jayk7XFxuLVxcdHJldHVybiBsZW4gXFx1MDAzYyBQQUdFX1NJWkUgPyBsZW4gOiAtRUlOVkFMO1xcbi19XFxuLVxcbi1zdGF0aWMgc3NpemVfdCBzdG9yZV9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LFxcbi1cXHRcXHRcXHQgICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsXFxuLVxcdFxcdFxcdCAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpXFxuLXtcXG4tXFx0Y3B1bWFza192YXJfdCBuZXdfY3B1bWFzaztcXG4tXFx0c3NpemVfdCByZXQ7XFxuLVxcdGludCBtYXNrX3R5cGU7XFxuLVxcbi1cXHRpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKFxcdTAwMjZuZXdfY3B1bWFzaywgR0ZQX0tFUk5FTCkpXFxuLVxcdFxcdHJldHVybiAtRU5PTUVNO1xcbi1cXG4tXFx0cmV0ID0gYml0bWFwX3BhcnNlKGJ1ZiwgY291bnQsIGNwdW1hc2tfYml0cyhuZXdfY3B1bWFzayksXFxuLVxcdFxcdFxcdCAgIG5yX2NwdW1hc2tfYml0cyk7XFxuLVxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFxuLVxcdG1hc2tfdHlwZSA9ICFzdHJjbXAoYXR0ci1cXHUwMDNlbmFtZSwgXFxcInNlcmlhbF9jcHVtYXNrXFxcIikgP1xcbi1cXHRcXHRQQURBVEFfQ1BVX1NFUklBTCA6IFBBREFUQV9DUFVfUEFSQUxMRUw7XFxuLVxcdHJldCA9IHBhZGF0YV9zZXRfY3B1bWFzayhwaW5zdCwgbWFza190eXBlLCBuZXdfY3B1bWFzayk7XFxuLVxcdGlmICghcmV0KVxcbi1cXHRcXHRyZXQgPSBjb3VudDtcXG4tXFxuLW91dDpcXG4tXFx0ZnJlZV9jcHVtYXNrX3ZhcihuZXdfY3B1bWFzayk7XFxuLVxcdHJldHVybiByZXQ7XFxuLX1cXG4tXFxuLSNkZWZpbmUgUEFEQVRBX0FUVFJfUlcoX25hbWUsIF9zaG93X25hbWUsIF9zdG9yZV9uYW1lKVxcdFxcdFxcXFxcXG4tXFx0c3RhdGljIGNvbnN0IHN0cnVjdCBwYWRhdGFfc3lzZnNfZW50cnkgX25hbWUjI19hdHRyID1cXHRcXFxcXFxuLVxcdFxcdF9fQVRUUihfbmFtZSwgMDY0NCwgX3Nob3dfbmFtZSwgX3N0b3JlX25hbWUpXFxuLSNkZWZpbmUgUEFEQVRBX0FUVFJfUk8oX25hbWUsIF9zaG93X25hbWUpXFx0XFx0XFx0XFxcXFxcbi1cXHRzdGF0aWMgY29uc3Qgc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSBfbmFtZSMjX2F0dHIgPVxcdFxcXFxcXG4tXFx0XFx0X19BVFRSKF9uYW1lLCAwNDAwLCBfc2hvd19uYW1lLCBOVUxMKVxcbi1cXG4tUEFEQVRBX0FUVFJfUlcoc2VyaWFsX2NwdW1hc2ssIHNob3dfY3B1bWFzaywgc3RvcmVfY3B1bWFzayk7XFxuLVBBREFUQV9BVFRSX1JXKHBhcmFsbGVsX2NwdW1hc2ssIHNob3dfY3B1bWFzaywgc3RvcmVfY3B1bWFzayk7XFxuLVxcbi0vKlxcbi0gKiBQYWRhdGEgc3lzZnMgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBvYmplY3RzOlxcbi0gKiBzZXJpYWxfY3B1bWFzayAgIFtSV10gLSBjcHVtYXNrIGZvciBzZXJpYWwgd29ya2Vyc1xcbi0gKiBwYXJhbGxlbF9jcHVtYXNrIFtSV10gLSBjcHVtYXNrIGZvciBwYXJhbGxlbCB3b3JrZXJzXFxuLSAqL1xcbi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqY29uc3QgcGFkYXRhX2RlZmF1bHRfYXR0cnNbXSA9IHtcXG4tXFx0XFx1MDAyNnNlcmlhbF9jcHVtYXNrX2F0dHIuYXR0cixcXG4tXFx0XFx1MDAyNnBhcmFsbGVsX2NwdW1hc2tfYXR0ci5hdHRyLFxcbi1cXHROVUxMLFxcbi19O1xcbi1BVFRSSUJVVEVfR1JPVVBTKHBhZGF0YV9kZWZhdWx0KTtcXG4tXFxuLXN0YXRpYyBzc2l6ZV90IHBhZGF0YV9zeXNmc19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLFxcbi1cXHRcXHRcXHRcXHQgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVxcbi17XFxuLVxcdGNvbnN0IHN0cnVjdCBwYWRhdGFfc3lzZnNfZW50cnkgKnBlbnRyeTtcXG4tXFx0c3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3Q7XFxuLVxcdHNzaXplX3QgcmV0ID0gLUVJTztcXG4tXFxuLVxcdHBpbnN0ID0ga29iajJwaW5zdChrb2JqKTtcXG4tXFx0cGVudHJ5ID0gYXR0cjJwZW50cnkoYXR0cik7XFxuLVxcdGlmIChwZW50cnktXFx1MDAzZXNob3cpXFxuLVxcdFxcdHJldCA9IHBlbnRyeS1cXHUwMDNlc2hvdyhwaW5zdCwgYXR0ciwgYnVmKTtcXG4tXFxuLVxcdHJldHVybiByZXQ7XFxuLX1cXG4tXFxuLXN0YXRpYyBzc2l6ZV90IHBhZGF0YV9zeXNmc19zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cixcXG4tXFx0XFx0XFx0XFx0ICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudClcXG4te1xcbi1cXHRjb25zdCBzdHJ1Y3QgcGFkYXRhX3N5c2ZzX2VudHJ5ICpwZW50cnk7XFxuLVxcdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0O1xcbi1cXHRzc2l6ZV90IHJldCA9IC1FSU87XFxuLVxcbi1cXHRwaW5zdCA9IGtvYmoycGluc3Qoa29iaik7XFxuLVxcdHBlbnRyeSA9IGF0dHIycGVudHJ5KGF0dHIpO1xcbi1cXHRpZiAocGVudHJ5LVxcdTAwM2VzdG9yZSlcXG4tXFx0XFx0cmV0ID0gcGVudHJ5LVxcdTAwM2VzdG9yZShwaW5zdCwgYXR0ciwgYnVmLCBjb3VudCk7XFxuLVxcbi1cXHRyZXR1cm4gcmV0O1xcbi19XFxuLVxcbi1zdGF0aWMgY29uc3Qgc3RydWN0IHN5c2ZzX29wcyBwYWRhdGFfc3lzZnNfb3BzID0ge1xcbi1cXHQuc2hvdyA9IHBhZGF0YV9zeXNmc19zaG93LFxcbi1cXHQuc3RvcmUgPSBwYWRhdGFfc3lzZnNfc3RvcmUsXFxuLX07XFxuLVxcbi1zdGF0aWMgY29uc3Qgc3RydWN0IGtvYmpfdHlwZSBwYWRhdGFfYXR0cl90eXBlID0ge1xcbi1cXHQuc3lzZnNfb3BzID0gXFx1MDAyNnBhZGF0YV9zeXNmc19vcHMsXFxuLVxcdC5kZWZhdWx0X2dyb3VwcyA9IHBhZGF0YV9kZWZhdWx0X2dyb3VwcyxcXG4tXFx0LnJlbGVhc2UgPSBwYWRhdGFfc3lzZnNfcmVsZWFzZSxcXG4tfTtcXG4tXFxuLS8qKlxcbi0gKiBwYWRhdGFfYWxsb2MgLSBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIHBhZGF0YSBpbnN0YW5jZVxcbi0gKiBAbmFtZTogdXNlZCB0byBpZGVudGlmeSB0aGUgaW5zdGFuY2VcXG4tICpcXG4tICogUmV0dXJuOiBuZXcgaW5zdGFuY2Ugb24gc3VjY2VzcywgTlVMTCBvbiBlcnJvclxcbi0gKi9cXG4tc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGFkYXRhX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpXFxuLXtcXG4tXFx0c3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3Q7XFxuLVxcbi1cXHRwaW5zdCA9IGt6YWxsb2Nfb2JqKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UpO1xcbi1cXHRpZiAoIXBpbnN0KVxcbi1cXHRcXHRnb3RvIGVycjtcXG4tXFxuLVxcdHBpbnN0LVxcdTAwM2VwYXJhbGxlbF93cSA9IGFsbG9jX3dvcmtxdWV1ZShcXFwiJXNfcGFyYWxsZWxcXFwiLCBXUV9VTkJPVU5ELCAwLFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgIG5hbWUpO1xcbi1cXHRpZiAoIXBpbnN0LVxcdTAwM2VwYXJhbGxlbF93cSlcXG4tXFx0XFx0Z290byBlcnJfZnJlZV9pbnN0O1xcbi1cXG4tXFx0Y3B1c19yZWFkX2xvY2soKTtcXG4tXFxuLVxcdHBpbnN0LVxcdTAwM2VzZXJpYWxfd3EgPSBhbGxvY193b3JrcXVldWUoXFxcIiVzX3NlcmlhbFxcXCIsXFxuLVxcdFxcdFxcdFxcdFxcdCAgIFdRX01FTV9SRUNMQUlNIHwgV1FfQ1BVX0lOVEVOU0lWRSB8IFdRX1BFUkNQVSxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgMSwgbmFtZSk7XFxuLVxcdGlmICghcGluc3QtXFx1MDAzZXNlcmlhbF93cSlcXG4tXFx0XFx0Z290byBlcnJfcHV0X2NwdXM7XFxuLVxcbi1cXHRpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKFxcdTAwMjZwaW5zdC1cXHUwMDNlY3B1bWFzay5wY3B1LCBHRlBfS0VSTkVMKSlcXG4tXFx0XFx0Z290byBlcnJfZnJlZV9zZXJpYWxfd3E7XFxuLVxcdGlmICghYWxsb2NfY3B1bWFza192YXIoXFx1MDAyNnBpbnN0LVxcdTAwM2VjcHVtYXNrLmNiY3B1LCBHRlBfS0VSTkVMKSlcXG4tXFx0XFx0Z290byBlcnJfZnJlZV9wX21hc2s7XFxuLVxcdGlmICghYWxsb2NfY3B1bWFza192YXIoXFx1MDAyNnBpbnN0LVxcdTAwM2V2YWxpZGF0ZV9jcHVtYXNrLCBHRlBfS0VSTkVMKSlcXG4tXFx0XFx0Z290byBlcnJfZnJlZV9jYl9tYXNrO1xcbi1cXG4tXFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNnBpbnN0LVxcdTAwM2Vwc2xpc3QpO1xcbi1cXG4tXFx0Y3B1bWFza19jb3B5KHBpbnN0LVxcdTAwM2VjcHVtYXNrLnBjcHUsIGNwdV9wb3NzaWJsZV9tYXNrKTtcXG4tXFx0Y3B1bWFza19jb3B5KHBpbnN0LVxcdTAwM2VjcHVtYXNrLmNiY3B1LCBjcHVfcG9zc2libGVfbWFzayk7XFxuLVxcbi1cXHRpZiAocGFkYXRhX3NldHVwX2NwdW1hc2tzKHBpbnN0KSlcXG4tXFx0XFx0Z290byBlcnJfZnJlZV92X21hc2s7XFxuLVxcbi1cXHRfX3BhZGF0YV9zdGFydChwaW5zdCk7XFxuLVxcbi1cXHRrb2JqZWN0X2luaXQoXFx1MDAyNnBpbnN0LVxcdTAwM2Vrb2JqLCBcXHUwMDI2cGFkYXRhX2F0dHJfdHlwZSk7XFxuLVxcdG11dGV4X2luaXQoXFx1MDAyNnBpbnN0LVxcdTAwM2Vsb2NrKTtcXG4tXFxuLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFVcXG4tXFx0Y3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlX25vY2FsbHNfY3B1c2xvY2tlZChocF9vbmxpbmUsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdCAgICBcXHUwMDI2cGluc3QtXFx1MDAzZWNwdWhwX25vZGUpO1xcbi0jZW5kaWZcXG4tXFxuLVxcdGNwdXNfcmVhZF91bmxvY2soKTtcXG4tXFxuLVxcdHJldHVybiBwaW5zdDtcXG4tXFxuLWVycl9mcmVlX3ZfbWFzazpcXG4tXFx0ZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC1cXHUwMDNldmFsaWRhdGVfY3B1bWFzayk7XFxuLWVycl9mcmVlX2NiX21hc2s6XFxuLVxcdGZyZWVfY3B1bWFza192YXIocGluc3QtXFx1MDAzZWNwdW1hc2suY2JjcHUpO1xcbi1lcnJfZnJlZV9wX21hc2s6XFxuLVxcdGZyZWVfY3B1bWFza192YXIocGluc3QtXFx1MDAzZWNwdW1hc2sucGNwdSk7XFxuLWVycl9mcmVlX3NlcmlhbF93cTpcXG4tXFx0ZGVzdHJveV93b3JrcXVldWUocGluc3QtXFx1MDAzZXNlcmlhbF93cSk7XFxuLWVycl9wdXRfY3B1czpcXG4tXFx0Y3B1c19yZWFkX3VubG9jaygpO1xcbi1cXHRkZXN0cm95X3dvcmtxdWV1ZShwaW5zdC1cXHUwMDNlcGFyYWxsZWxfd3EpO1xcbi1lcnJfZnJlZV9pbnN0Olxcbi1cXHRrZnJlZShwaW5zdCk7XFxuLWVycjpcXG4tXFx0cmV0dXJuIE5VTEw7XFxuLX1cXG4tRVhQT1JUX1NZTUJPTChwYWRhdGFfYWxsb2MpO1xcbi1cXG4tLyoqXFxuLSAqIHBhZGF0YV9mcmVlIC0gZnJlZSBhIHBhZGF0YSBpbnN0YW5jZVxcbi0gKlxcbi0gKiBAcGluc3Q6IHBhZGF0YSBpbnN0YW5jZSB0byBmcmVlXFxuLSAqL1xcbi12b2lkIHBhZGF0YV9mcmVlKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KVxcbi17XFxuLVxcdGtvYmplY3RfcHV0KFxcdTAwMjZwaW5zdC1cXHUwMDNla29iaik7XFxuLX1cXG4tRVhQT1JUX1NZTUJPTChwYWRhdGFfZnJlZSk7XFxuLVxcbi0vKipcXG4tICogcGFkYXRhX2FsbG9jX3NoZWxsIC0gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcGFkYXRhIHNoZWxsLlxcbi0gKlxcbi0gKiBAcGluc3Q6IFBhcmVudCBwYWRhdGFfaW5zdGFuY2Ugb2JqZWN0Llxcbi0gKlxcbi0gKiBSZXR1cm46IG5ldyBzaGVsbCBvbiBzdWNjZXNzLCBOVUxMIG9uIGVycm9yXFxuLSAqL1xcbi1zdHJ1Y3QgcGFkYXRhX3NoZWxsICpwYWRhdGFfYWxsb2Nfc2hlbGwoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpXFxuLXtcXG4tXFx0c3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkO1xcbi1cXHRzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcztcXG4tXFxuLVxcdHBzID0ga3phbGxvY19vYmooKnBzKTtcXG4tXFx0aWYgKCFwcylcXG4tXFx0XFx0Z290byBvdXQ7XFxuLVxcbi1cXHRwcy1cXHUwMDNlcGluc3QgPSBwaW5zdDtcXG4tXFxuLVxcdGNwdXNfcmVhZF9sb2NrKCk7XFxuLVxcdHBkID0gcGFkYXRhX2FsbG9jX3BkKHBzLCAtMSk7XFxuLVxcdGNwdXNfcmVhZF91bmxvY2soKTtcXG4tXFxuLVxcdGlmICghcGQpXFxuLVxcdFxcdGdvdG8gb3V0X2ZyZWVfcHM7XFxuLVxcbi1cXHRtdXRleF9sb2NrKFxcdTAwMjZwaW5zdC1cXHUwMDNlbG9jayk7XFxuLVxcdFJDVV9JTklUX1BPSU5URVIocHMtXFx1MDAzZXBkLCBwZCk7XFxuLVxcdGxpc3RfYWRkKFxcdTAwMjZwcy1cXHUwMDNlbGlzdCwgXFx1MDAyNnBpbnN0LVxcdTAwM2Vwc2xpc3QpO1xcbi1cXHRtdXRleF91bmxvY2soXFx1MDAyNnBpbnN0LVxcdTAwM2Vsb2NrKTtcXG4tXFxuLVxcdHJldHVybiBwcztcXG4tXFxuLW91dF9mcmVlX3BzOlxcbi1cXHRrZnJlZShwcyk7XFxuLW91dDpcXG4tXFx0cmV0dXJuIE5VTEw7XFxuLX1cXG4tRVhQT1JUX1NZTUJPTChwYWRhdGFfYWxsb2Nfc2hlbGwpO1xcbi1cXG4tLyoqXFxuLSAqIHBhZGF0YV9mcmVlX3NoZWxsIC0gZnJlZSBhIHBhZGF0YSBzaGVsbFxcbi0gKlxcbi0gKiBAcHM6IHBhZGF0YSBzaGVsbCB0byBmcmVlXFxuLSAqL1xcbi12b2lkIHBhZGF0YV9mcmVlX3NoZWxsKHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzKVxcbi17XFxuLVxcdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDtcXG4tXFxuLVxcdGlmICghcHMpXFxuLVxcdFxcdHJldHVybjtcXG4tXFxuLVxcdG11dGV4X2xvY2soXFx1MDAyNnBzLVxcdTAwM2VwaW5zdC1cXHUwMDNlbG9jayk7XFxuLVxcdGxpc3RfZGVsKFxcdTAwMjZwcy1cXHUwMDNlbGlzdCk7XFxuLVxcdHBkID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChwcy1cXHUwMDNlcGQsIDEpO1xcbi1cXHRwYWRhdGFfcHV0X3BkKHBkKTtcXG4tXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZwcy1cXHUwMDNlcGluc3QtXFx1MDAzZWxvY2spO1xcbi1cXG4tXFx0a2ZyZWUocHMpO1xcbi19XFxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX2ZyZWVfc2hlbGwpO1xcbi1cXG4gdm9pZCBfX2luaXQgcGFkYXRhX2luaXQodm9pZClcXG4ge1xcbiBcXHR1bnNpZ25lZCBpbnQgaSwgcG9zc2libGVfY3B1cztcXG4tI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVVxcbi1cXHRpbnQgcmV0O1xcbi1cXG4tXFx0cmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkoQ1BVSFBfQVBfT05MSU5FX0RZTiwgXFxcInBhZGF0YTpvbmxpbmVcXFwiLFxcbi1cXHRcXHRcXHRcXHQgICAgICBwYWRhdGFfY3B1X29ubGluZSwgcGFkYXRhX2NwdV9vZmZsaW5lKTtcXG4tXFx0aWYgKHJldCBcXHUwMDNjIDApXFxuLVxcdFxcdGdvdG8gZXJyO1xcbi1cXHRocF9vbmxpbmUgPSByZXQ7XFxuLSNlbmRpZlxcbiBcXG4gXFx0cG9zc2libGVfY3B1cyA9IG51bV9wb3NzaWJsZV9jcHVzKCk7XFxuIFxcdHBhZGF0YV93b3JrcyA9IGttYWxsb2Nfb2JqcyhzdHJ1Y3QgcGFkYXRhX3dvcmssIHBvc3NpYmxlX2NwdXMpO1xcbi1cXHRpZiAoIXBhZGF0YV93b3JrcylcXG4tXFx0XFx0Z290byByZW1vdmVfb25saW5lX3N0YXRlO1xcbitcXHRpZiAoIXBhZGF0YV93b3Jrcykge1xcbitcXHRcXHRwcl93YXJuKFxcXCJwYWRhdGE6IGluaXRpYWxpemF0aW9uIGZhaWxlZFxcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbiBcXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHBvc3NpYmxlX2NwdXM7ICsraSlcXG4gXFx0XFx0bGlzdF9hZGQoXFx1MDAyNnBhZGF0YV93b3Jrc1tpXS5wd19saXN0LCBcXHUwMDI2cGFkYXRhX2ZyZWVfd29ya3MpO1xcbi1cXG4tXFx0cmV0dXJuO1xcbi1cXG4tcmVtb3ZlX29ubGluZV9zdGF0ZTpcXG4tI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVVxcbi1cXHRjcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUoaHBfb25saW5lKTtcXG4tZXJyOlxcbi0jZW5kaWZcXG4tXFx0cHJfd2FybihcXFwicGFkYXRhOiBpbml0aWFsaXphdGlvbiBmYWlsZWRcXFxcblxcXCIpO1xcbiB9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2NyeXB0by90Y3J5cHQvdGNyeXB0X3NwZWVkX2NvbXBhcmUucHkgYi90b29scy9jcnlwdG8vdGNyeXB0L3RjcnlwdF9zcGVlZF9jb21wYXJlLnB5XFxuaW5kZXggZjNmNTc4M2NkYzA2NmIuLjBiZjM4YzA3M2RiYzAzIDEwMDc1NVxcbi0tLSBhL3Rvb2xzL2NyeXB0by90Y3J5cHQvdGNyeXB0X3NwZWVkX2NvbXBhcmUucHlcXG4rKysgYi90b29scy9jcnlwdG8vdGNyeXB0L3RjcnlwdF9zcGVlZF9jb21wYXJlLnB5XFxuQEAgLTI4LDE5ICsyOCwxNiBAQCBudW1fbWI9OFxcbiBtb2RlPTIxMVxcbiBcXG4gIyBiYXNlIHNwZWVkIHRlc3RcXG4tbHNtb2QgfCBncmVwIHBjcnlwdCBcXHUwMDI2XFx1MDAyNiBtb2Rwcm9iZSAtciBwY3J5cHRcXG4gZG1lc2cgLUNcXG4tbW9kcHJvYmUgdGNyeXB0IGFsZz1cXFwicGNyeXB0KHJmYzQxMDYoZ2NtKGFlcykpKVxcXCIgdHlwZT0zXFxuK21vZHByb2JlIHRjcnlwdCBhbGc9XFxcInJmYzQxMDYoZ2NtKGFlcykpXFxcIiB0eXBlPTNcXG4gbW9kcHJvYmUgdGNyeXB0IG1vZGU9JHttb2RlfSBzZWM9JHtzZWN9IG51bV9tYj0ke251bV9tYn1cXG4gZG1lc2cgXFx1MDAzZSAke3NlcV9udW19X2Jhc2VfZG1lc2cubG9nXFxuIFxcbiAjIG5ldyBzcGVlZCB0ZXN0XFxuLWxzbW9kIHwgZ3JlcCBwY3J5cHQgXFx1MDAyNlxcdTAwMjYgbW9kcHJvYmUgLXIgcGNyeXB0XFxuIGRtZXNnIC1DXFxuLW1vZHByb2JlIHRjcnlwdCBhbGc9XFxcInBjcnlwdChyZmM0MTA2KGdjbShhZXMpKSlcXFwiIHR5cGU9M1xcbittb2Rwcm9iZSB0Y3J5cHQgYWxnPVxcXCJyZmM0MTA2KGdjbShhZXMpKVxcXCIgdHlwZT0zXFxuIG1vZHByb2JlIHRjcnlwdCBtb2RlPSR7bW9kZX0gc2VjPSR7c2VjfSBudW1fbWI9JHtudW1fbWJ9XFxuIGRtZXNnIFxcdTAwM2UgJHtzZXFfbnVtfV9uZXdfZG1lc2cubG9nXFxuLWxzbW9kIHwgZ3JlcCBwY3J5cHQgXFx1MDAyNlxcdTAwMjYgbW9kcHJvYmUgLXIgcGNyeXB0XFxuIFxcbiB0b29scy9jcnlwdG8vdGNyeXB0L3RjcnlwdF9zcGVlZF9jb21wYXJlLnB5IFxcXFxcXG4gICAgICR7c2VxX251bX1fYmFzZV9kbWVzZy5sb2cgXFxcXFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNFQwMzozNToxNS41MTcwMTMyMTdaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEyNjczMDg2MjU1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZW1vdmVzIHRoZSBwY3J5cHQgcGFyYWxsZWwgY3J5cHRvIGVuZ2luZSBhbmQgdGhlIGFzc29jaWF0ZWQgc2VyaWFsaXplZCBqb2Igc3VwcG9ydCBmcm9tIHBhZGF0YS4gSXQgaXMgYSBwdXJlIGNsZWFudXAvcmVtb3ZhbCBwYXRjaCBhbmQgZG9lcyBub3QgaW50cm9kdWNlIGFueSBuZXcgZnVuY3Rpb25hbCBjb2RlIG9yIGxvZ2ljIHRoYXQgcmVxdWlyZXMgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXRcbiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSxcbiAgIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgY2MzOTRjYzljZTFkY2NjNDE1YmM4ZmM2NWZlNjU2N2FhOGM3NTM0NFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgSnVsIDE0IDAzOjM1OjEyIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9wYWRhdGEucnN0IGIvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9wYWRhdGEucnN0XG5pbmRleCAwNWI3M2M2YzEwNWYwNC4uZDdkYzdlMzMwNTRkYmQgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3BhZGF0YS5yc3RcbisrKyBiL0RvY3VtZW50YXRpb24vY29yZS1hcGkvcGFkYXRhLnJzdFxuQEAgLTcsMTUyICs3LDExIEBAIFRoZSBwYWRhdGEgcGFyYWxsZWwgZXhlY3V0aW9uIG1lY2hhbmlzbVxuIDpEYXRlOiBNYXkgMjAyMFxuIFxuIFBhZGF0YSBpcyBhIG1lY2hhbmlzbSBieSB3aGljaCB0aGUga2VybmVsIGNhbiBmYXJtIGpvYnMgb3V0IHRvIGJlIGRvbmUgaW5cbi1wYXJhbGxlbCBvbiBtdWx0aXBsZSBDUFVzIHdoaWxlIG9wdGlvbmFsbHkgcmV0YWluaW5nIHRoZWlyIG9yZGVyaW5nLlxuK3BhcmFsbGVsIG9uIG11bHRpcGxlIENQVXMgd2hpbGUgY29vcmRpbmF0aW5nIGJldHdlZW4gdGhyZWFkcy5cbiBcbi1JdCB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQgZm9yIElQc2VjLCB3aGljaCBuZWVkcyB0byBwZXJmb3JtIGVuY3J5cHRpb24gYW5kXG4tZGVjcnlwdGlvbiBvbiBsYXJnZSBudW1iZXJzIG9mIHBhY2tldHMgd2l0aG91dCByZW9yZGVyaW5nIHRob3NlIHBhY2tldHMuICBUaGlzXG4taXMgY3VycmVudGx5IHRoZSBzb2xlIGNvbnN1bWVyIG9mIHBhZGF0YSdzIHNlcmlhbGl6ZWQgam9iIHN1cHBvcnQuXG4tXG4tUGFkYXRhIGFsc28gc3VwcG9ydHMgbXVsdGl0aHJlYWRlZCBqb2JzLCBzcGxpdHRpbmcgdXAgdGhlIGpvYiBldmVubHkgd2hpbGUgbG9hZFxuK1BhZGF0YSBzdXBwb3J0cyBtdWx0aXRocmVhZGVkIGpvYnMsIHNwbGl0dGluZyB1cCB0aGUgam9iIGV2ZW5seSB3aGlsZSBsb2FkXG4gYmFsYW5jaW5nIGFuZCBjb29yZGluYXRpbmcgYmV0d2VlbiB0aHJlYWRzLlxuIFxuLVJ1bm5pbmcgU2VyaWFsaXplZCBKb2JzXG4tPT09PT09PT09PT09PT09PT09PT09PT1cbi1cbi1Jbml0aWFsaXppbmdcbi0tLS0tLS0tLS0tLS1cbi1cbi1UaGUgZmlyc3Qgc3RlcCBpbiB1c2luZyBwYWRhdGEgdG8gcnVuIHNlcmlhbGl6ZWQgam9icyBpcyB0byBzZXQgdXAgYVxuLXBhZGF0YV9pbnN0YW5jZSBzdHJ1Y3R1cmUgZm9yIG92ZXJhbGwgY29udHJvbCBvZiBob3cgam9icyBhcmUgdG8gYmUgcnVuOjpcbi1cbi0gICAgI2luY2x1ZGUgXHUwMDNjbGludXgvcGFkYXRhLmhcdTAwM2Vcbi1cbi0gICAgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGFkYXRhX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpO1xuLVxuLSduYW1lJyBzaW1wbHkgaWRlbnRpZmllcyB0aGUgaW5zdGFuY2UuXG4tXG4tVGhlbiwgY29tcGxldGUgcGFkYXRhIGluaXRpYWxpemF0aW9uIGJ5IGFsbG9jYXRpbmcgYSBwYWRhdGFfc2hlbGw6OlxuLVxuLSAgIHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBhZGF0YV9hbGxvY19zaGVsbChzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCk7XG4tXG4tQSBwYWRhdGFfc2hlbGwgaXMgdXNlZCB0byBzdWJtaXQgYSBqb2IgdG8gcGFkYXRhIGFuZCBhbGxvd3MgYSBzZXJpZXMgb2Ygc3VjaFxuLWpvYnMgdG8gYmUgc2VyaWFsaXplZCBpbmRlcGVuZGVudGx5LiAgQSBwYWRhdGFfaW5zdGFuY2UgbWF5IGhhdmUgb25lIG9yIG1vcmVcbi1wYWRhdGFfc2hlbGxzIGFzc29jaWF0ZWQgd2l0aCBpdCwgZWFjaCBhbGxvd2luZyBhIHNlcGFyYXRlIHNlcmllcyBvZiBqb2JzLlxuLVxuLU1vZGlmeWluZyBjcHVtYXNrc1xuLS0tLS0tLS0tLS0tLS0tLS0tLVxuLVxuLVRoZSBDUFVzIHVzZWQgdG8gcnVuIGpvYnMgY2FuIGJlIGNoYW5nZWQgaW4gdHdvIHdheXMsIHByb2dyYW1tYXRpY2FsbHkgd2l0aFxuLXBhZGF0YV9zZXRfY3B1bWFzaygpIG9yIHZpYSBzeXNmcy4gIFRoZSBmb3JtZXIgaXMgZGVmaW5lZDo6XG4tXG4tICAgIGludCBwYWRhdGFfc2V0X2NwdW1hc2soc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsIGludCBjcHVtYXNrX3R5cGUsXG4tXHRcdFx0ICAgY3B1bWFza192YXJfdCBjcHVtYXNrKTtcbi1cbi1IZXJlIGNwdW1hc2tfdHlwZSBpcyBvbmUgb2YgUEFEQVRBX0NQVV9QQVJBTExFTCBvciBQQURBVEFfQ1BVX1NFUklBTCwgd2hlcmUgYVxuLXBhcmFsbGVsIGNwdW1hc2sgZGVzY3JpYmVzIHdoaWNoIHByb2Nlc3NvcnMgd2lsbCBiZSB1c2VkIHRvIGV4ZWN1dGUgam9ic1xuLXN1Ym1pdHRlZCB0byB0aGlzIGluc3RhbmNlIGluIHBhcmFsbGVsIGFuZCBhIHNlcmlhbCBjcHVtYXNrIGRlZmluZXMgd2hpY2hcbi1wcm9jZXNzb3JzIGFyZSBhbGxvd2VkIHRvIGJlIHVzZWQgYXMgdGhlIHNlcmlhbGl6YXRpb24gY2FsbGJhY2sgcHJvY2Vzc29yLlxuLWNwdW1hc2sgc3BlY2lmaWVzIHRoZSBuZXcgY3B1bWFzayB0byB1c2UuXG4tXG4tVGhlcmUgbWF5IGJlIHN5c2ZzIGZpbGVzIGZvciBhbiBpbnN0YW5jZSdzIGNwdW1hc2tzLiAgRm9yIGV4YW1wbGUsIHBjcnlwdCdzXG4tbGl2ZSBpbiAvc3lzL2tlcm5lbC9wY3J5cHQvXHUwMDNjaW5zdGFuY2UtbmFtZVx1MDAzZS4gIFdpdGhpbiBhbiBpbnN0YW5jZSdzIGRpcmVjdG9yeVxuLXRoZXJlIGFyZSB0d28gZmlsZXMsIHBhcmFsbGVsX2NwdW1hc2sgYW5kIHNlcmlhbF9jcHVtYXNrLCBhbmQgZWl0aGVyIGNwdW1hc2tcbi1tYXkgYmUgY2hhbmdlZCBieSBlY2hvaW5nIGEgYml0bWFzayBpbnRvIHRoZSBmaWxlLCBmb3IgZXhhbXBsZTo6XG4tXG4tICAgIGVjaG8gZiBcdTAwM2UgL3N5cy9rZXJuZWwvcGNyeXB0L3BlbmNyeXB0L3BhcmFsbGVsX2NwdW1hc2tcbi1cbi1SZWFkaW5nIG9uZSBvZiB0aGVzZSBmaWxlcyBzaG93cyB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrLCB3aGljaCBtYXkgYmVcbi1kaWZmZXJlbnQgZnJvbSB0aGUgJ3VzYWJsZScgY3B1bWFzay5cbi1cbi1QYWRhdGEgbWFpbnRhaW5zIHR3byBwYWlycyBvZiBjcHVtYXNrcyBpbnRlcm5hbGx5LCB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrc1xuLWFuZCB0aGUgJ3VzYWJsZScgY3B1bWFza3MuICAoRWFjaCBwYWlyIGNvbnNpc3RzIG9mIGEgcGFyYWxsZWwgYW5kIGEgc2VyaWFsXG4tY3B1bWFzay4pICBUaGUgdXNlci1zdXBwbGllZCBjcHVtYXNrcyBkZWZhdWx0IHRvIGFsbCBwb3NzaWJsZSBDUFVzIG9uIGluc3RhbmNlXG4tYWxsb2NhdGlvbiBhbmQgbWF5IGJlIGNoYW5nZWQgYXMgYWJvdmUuICBUaGUgdXNhYmxlIGNwdW1hc2tzIGFyZSBhbHdheXMgYVxuLXN1YnNldCBvZiB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrcyBhbmQgY29udGFpbiBvbmx5IHRoZSBvbmxpbmUgQ1BVcyBpbiB0aGVcbi11c2VyLXN1cHBsaWVkIG1hc2tzOyB0aGVzZSBhcmUgdGhlIGNwdW1hc2tzIHBhZGF0YSBhY3R1YWxseSB1c2VzLiAgU28gaXQgaXNcbi1sZWdhbCB0byBzdXBwbHkgYSBjcHVtYXNrIHRvIHBhZGF0YSB0aGF0IGNvbnRhaW5zIG9mZmxpbmUgQ1BVcy4gIE9uY2UgYW5cbi1vZmZsaW5lIENQVSBpbiB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrIGNvbWVzIG9ubGluZSwgcGFkYXRhIGlzIGdvaW5nIHRvIHVzZVxuLWl0LlxuLVxuLUNoYW5naW5nIHRoZSBDUFUgbWFza3MgYXJlIGV4cGVuc2l2ZSBvcGVyYXRpb25zLCBzbyBpdCBzaG91bGQgbm90IGJlIGRvbmUgd2l0aFxuLWdyZWF0IGZyZXF1ZW5jeS5cbi1cbi1SdW5uaW5nIEEgSm9iXG4tLS0tLS0tLS0tLS0tLVxuLVxuLUFjdHVhbGx5IHN1Ym1pdHRpbmcgd29yayB0byB0aGUgcGFkYXRhIGluc3RhbmNlIHJlcXVpcmVzIHRoZSBjcmVhdGlvbiBvZiBhXG4tcGFkYXRhX3ByaXYgc3RydWN0dXJlLCB3aGljaCByZXByZXNlbnRzIG9uZSBqb2I6OlxuLVxuLSAgICBzdHJ1Y3QgcGFkYXRhX3ByaXYge1xuLSAgICAgICAgLyogT3RoZXIgc3R1ZmYgaGVyZS4uLiAqL1xuLVx0dm9pZCAgICAgICAgICAgICAgICAgICAgKCpwYXJhbGxlbCkoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpO1xuLVx0dm9pZCAgICAgICAgICAgICAgICAgICAgKCpzZXJpYWwpKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTtcbi0gICAgfTtcbi1cbi1UaGlzIHN0cnVjdHVyZSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgZW1iZWRkZWQgd2l0aGluIHNvbWUgbGFyZ2VyXG4tc3RydWN0dXJlIHNwZWNpZmljIHRvIHRoZSB3b3JrIHRvIGJlIGRvbmUuICBNb3N0IG9mIGl0cyBmaWVsZHMgYXJlIHByaXZhdGUgdG9cbi1wYWRhdGEsIGJ1dCB0aGUgc3RydWN0dXJlIHNob3VsZCBiZSB6ZXJvZWQgYXQgaW5pdGlhbGlzYXRpb24gdGltZSwgYW5kIHRoZVxuLXBhcmFsbGVsKCkgYW5kIHNlcmlhbCgpIGZ1bmN0aW9ucyBzaG91bGQgYmUgcHJvdmlkZWQuICBUaG9zZSBmdW5jdGlvbnMgd2lsbFxuLWJlIGNhbGxlZCBpbiB0aGUgcHJvY2VzcyBvZiBnZXR0aW5nIHRoZSB3b3JrIGRvbmUgYXMgd2Ugd2lsbCBzZWVcbi1tb21lbnRhcmlseS5cbi1cbi1UaGUgc3VibWlzc2lvbiBvZiB0aGUgam9iIGlzIGRvbmUgd2l0aDo6XG4tXG4tICAgIGludCBwYWRhdGFfZG9fcGFyYWxsZWwoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsXG4tXHRcdCAgICAgICAgICAgc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEsIGludCAqY2JfY3B1KTtcbi1cbi1UaGUgcHMgYW5kIHBhZGF0YSBzdHJ1Y3R1cmVzIG11c3QgYmUgc2V0IHVwIGFzIGRlc2NyaWJlZCBhYm92ZTsgY2JfY3B1XG4tcG9pbnRzIHRvIHRoZSBwcmVmZXJyZWQgQ1BVIHRvIGJlIHVzZWQgZm9yIHRoZSBmaW5hbCBjYWxsYmFjayB3aGVuIHRoZSBqb2IgaXNcbi1kb25lOyBpdCBtdXN0IGJlIGluIHRoZSBjdXJyZW50IGluc3RhbmNlJ3MgQ1BVIG1hc2sgKGlmIG5vdCB0aGUgY2JfY3B1IHBvaW50ZXJcbi1pcyB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBDUFUgYWN0dWFsbHkgY2hvc2VuKS4gIFRoZSByZXR1cm4gdmFsdWUgZnJvbVxuLXBhZGF0YV9kb19wYXJhbGxlbCgpIGlzIHplcm8gb24gc3VjY2VzcywgaW5kaWNhdGluZyB0aGF0IHRoZSBqb2IgaXMgaW5cbi1wcm9ncmVzcy4gLUVCVVNZIG1lYW5zIHRoYXQgc29tZWJvZHksIHNvbWV3aGVyZSBlbHNlIGlzIG1lc3Npbmcgd2l0aCB0aGVcbi1pbnN0YW5jZSdzIENQVSBtYXNrLCB3aGlsZSAtRUlOVkFMIGlzIGEgY29tcGxhaW50IGFib3V0IGNiX2NwdSBub3QgYmVpbmcgaW4gdGhlXG4tc2VyaWFsIGNwdW1hc2ssIG5vIG9ubGluZSBDUFVzIGluIHRoZSBwYXJhbGxlbCBvciBzZXJpYWwgY3B1bWFza3MsIG9yIGEgc3RvcHBlZFxuLWluc3RhbmNlLlxuLVxuLUVhY2ggam9iIHN1Ym1pdHRlZCB0byBwYWRhdGFfZG9fcGFyYWxsZWwoKSB3aWxsLCBpbiB0dXJuLCBiZSBwYXNzZWQgdG9cbi1leGFjdGx5IG9uZSBjYWxsIHRvIHRoZSBhYm92ZS1tZW50aW9uZWQgcGFyYWxsZWwoKSBmdW5jdGlvbiwgb24gb25lIENQVSwgc29cbi10cnVlIHBhcmFsbGVsaXNtIGlzIGFjaGlldmVkIGJ5IHN1Ym1pdHRpbmcgbXVsdGlwbGUgam9icy4gIHBhcmFsbGVsKCkgcnVucyB3aXRoXG4tc29mdHdhcmUgaW50ZXJydXB0cyBkaXNhYmxlZCBhbmQgdGh1cyBjYW5ub3Qgc2xlZXAuICBUaGUgcGFyYWxsZWwoKVxuLWZ1bmN0aW9uIGdldHMgdGhlIHBhZGF0YV9wcml2IHN0cnVjdHVyZSBwb2ludGVyIGFzIGl0cyBsb25lIHBhcmFtZXRlcjtcbi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgYWN0dWFsIHdvcmsgdG8gYmUgZG9uZSBpcyBwcm9iYWJseSBvYnRhaW5lZCBieSB1c2luZ1xuLWNvbnRhaW5lcl9vZigpIHRvIGZpbmQgdGhlIGVuY2xvc2luZyBzdHJ1Y3R1cmUuXG4tXG4tTm90ZSB0aGF0IHBhcmFsbGVsKCkgaGFzIG5vIHJldHVybiB2YWx1ZTsgdGhlIHBhZGF0YSBzdWJzeXN0ZW0gYXNzdW1lcyB0aGF0XG4tcGFyYWxsZWwoKSB3aWxsIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBqb2IgZnJvbSB0aGlzIHBvaW50LiAgVGhlIGpvYlxuLW5lZWQgbm90IGJlIGNvbXBsZXRlZCBkdXJpbmcgdGhpcyBjYWxsLCBidXQsIGlmIHBhcmFsbGVsKCkgbGVhdmVzIHdvcmtcbi1vdXRzdGFuZGluZywgaXQgc2hvdWxkIGJlIHByZXBhcmVkIHRvIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIGEgbmV3IGpvYiBiZWZvcmVcbi10aGUgcHJldmlvdXMgb25lIGNvbXBsZXRlcy5cbi1cbi1TZXJpYWxpemluZyBKb2JzXG4tLS0tLS0tLS0tLS0tLS0tLVxuLVxuLVdoZW4gYSBqb2IgZG9lcyBjb21wbGV0ZSwgcGFyYWxsZWwoKSAob3Igd2hhdGV2ZXIgZnVuY3Rpb24gYWN0dWFsbHkgZmluaXNoZXNcbi10aGUgd29yaykgc2hvdWxkIGluZm9ybSBwYWRhdGEgb2YgdGhlIGZhY3Qgd2l0aCBhIGNhbGwgdG86OlxuLVxuLSAgICB2b2lkIHBhZGF0YV9kb19zZXJpYWwoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpO1xuLVxuLUF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSwgcGFkYXRhX2RvX3NlcmlhbCgpIHdpbGwgdHJpZ2dlciBhIGNhbGwgdG8gdGhlXG4tc2VyaWFsKCkgZnVuY3Rpb24gaW4gdGhlIHBhZGF0YV9wcml2IHN0cnVjdHVyZS4gIFRoYXQgY2FsbCB3aWxsIGhhcHBlbiBvblxuLXRoZSBDUFUgcmVxdWVzdGVkIGluIHRoZSBpbml0aWFsIGNhbGwgdG8gcGFkYXRhX2RvX3BhcmFsbGVsKCk7IGl0LCB0b28sIGlzXG4tcnVuIHdpdGggbG9jYWwgc29mdHdhcmUgaW50ZXJydXB0cyBkaXNhYmxlZC5cbi1Ob3RlIHRoYXQgdGhpcyBjYWxsIG1heSBiZSBkZWZlcnJlZCBmb3IgYSB3aGlsZSBzaW5jZSB0aGUgcGFkYXRhIGNvZGUgdGFrZXNcbi1wYWlucyB0byBlbnN1cmUgdGhhdCBqb2JzIGFyZSBjb21wbGV0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZVxuLXN1Ym1pdHRlZC5cbi1cbi1EZXN0cm95aW5nXG4tLS0tLS0tLS0tLVxuLVxuLUNsZWFuaW5nIHVwIGEgcGFkYXRhIGluc3RhbmNlIHByZWRpY3RhYmx5IGludm9sdmVzIGNhbGxpbmcgdGhlIHR3byBmcmVlXG4tZnVuY3Rpb25zIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgYWxsb2NhdGlvbiBpbiByZXZlcnNlOjpcbi1cbi0gICAgdm9pZCBwYWRhdGFfZnJlZV9zaGVsbChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcyk7XG4tICAgIHZvaWQgcGFkYXRhX2ZyZWUoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpO1xuLVxuLUl0IGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIGFsbCBvdXRzdGFuZGluZyBqb2JzIGFyZSBjb21wbGV0ZVxuLWJlZm9yZSBhbnkgb2YgdGhlIGFib3ZlIGFyZSBjYWxsZWQuXG4tXG4gUnVubmluZyBNdWx0aXRocmVhZGVkIEpvYnNcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuIFxuZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlNcbmluZGV4IDgwNmJkMmQ4MGQxNTM1Li4yNjBiM2JkYzc2MTQ4YyAxMDA2NDRcbi0tLSBhL01BSU5UQUlORVJTXG4rKysgYi9NQUlOVEFJTkVSU1xuQEAgLTIxMDg1LDEzICsyMTA4NSw2IEBAIEw6XHRuZXRkZXZAdmdlci5rZXJuZWwub3JnXG4gUzpcdE1haW50YWluZWRcbiBGOlx0ZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3BjbmV0MzIuY1xuIFxuLVBDUllQVCBQQVJBTExFTCBDUllQVE8gRU5HSU5FXG4tTTpcdFN0ZWZmZW4gS2xhc3NlcnQgXHUwMDNjc3RlZmZlbi5rbGFzc2VydEBzZWN1bmV0LmNvbVx1MDAzZVxuLUw6XHRsaW51eC1jcnlwdG9Admdlci5rZXJuZWwub3JnXG4tUzpcdE1haW50YWluZWRcbi1GOlx0Y3J5cHRvL3BjcnlwdC5jXG4tRjpcdGluY2x1ZGUvY3J5cHRvL3BjcnlwdC5oXG4tXG4gUERTIERTQyBWSVJUSU8gREFUQSBQQVRIIEFDQ0VMRVJBVE9SXG4gUjpcdEJyZXR0IENyZWVsZXkgXHUwMDNjYnJldHQuY3JlZWxleUBhbWQuY29tXHUwMDNlXG4gRjpcdGRyaXZlcnMvdmRwYS9wZHMvXG5kaWZmIC0tZ2l0IGEvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjMyX2RlZmNvbmZpZyBiL2FyY2gvbG9vbmdhcmNoL2NvbmZpZ3MvbG9vbmdzb24zMl9kZWZjb25maWdcbmluZGV4IDdjOGYwMTUxM2VkMjdjLi5jZjk3ZjQ0OTM1NzM2ZiAxMDA2NDRcbi0tLSBhL2FyY2gvbG9vbmdhcmNoL2NvbmZpZ3MvbG9vbmdzb24zMl9kZWZjb25maWdcbisrKyBiL2FyY2gvbG9vbmdhcmNoL2NvbmZpZ3MvbG9vbmdzb24zMl9kZWZjb25maWdcbkBAIC0xMDYzLDcgKzEwNjMsNiBAQCBDT05GSUdfU0VDVVJJVFlfWUFNQT15XG4gQ09ORklHX0RFRkFVTFRfU0VDVVJJVFlfREFDPXlcbiBDT05GSUdfQ1JZUFRPX1VTRVI9bVxuIENPTkZJR19DUllQVE9fU0VMRlRFU1RTPXlcbi1DT05GSUdfQ1JZUFRPX1BDUllQVD1tXG4gQ09ORklHX0NSWVBUT19DUllQVEQ9bVxuIENPTkZJR19DUllQVE9fQU5VQklTPW1cbiBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIPW1cbmRpZmYgLS1naXQgYS9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uNjRfZGVmY29uZmlnIGIvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjY0X2RlZmNvbmZpZ1xuaW5kZXggOGUzOTA2ZDNiZDcwY2EuLmQwZWNlNzkyMGYyMTU4IDEwMDY0NFxuLS0tIGEvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjY0X2RlZmNvbmZpZ1xuKysrIGIvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjY0X2RlZmNvbmZpZ1xuQEAgLTEwOTYsNyArMTA5Niw2IEBAIENPTkZJR19TRUNVUklUWV9ZQU1BPXlcbiBDT05GSUdfREVGQVVMVF9TRUNVUklUWV9EQUM9eVxuIENPTkZJR19DUllQVE9fVVNFUj1tXG4gQ09ORklHX0NSWVBUT19TRUxGVEVTVFM9eVxuLUNPTkZJR19DUllQVE9fUENSWVBUPW1cbiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tXG4gQ09ORklHX0NSWVBUT19BTlVCSVM9bVxuIENPTkZJR19DUllQVE9fQkxPV0ZJU0g9bVxuZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jb25maWdzL2RlYnVnX2RlZmNvbmZpZyBiL2FyY2gvczM5MC9jb25maWdzL2RlYnVnX2RlZmNvbmZpZ1xuaW5kZXggNTQ2MzdiZTg3ZmI3MzUuLjE1ZjUxY2I5MjRkYmYwIDEwMDY0NFxuLS0tIGEvYXJjaC9zMzkwL2NvbmZpZ3MvZGVidWdfZGVmY29uZmlnXG4rKysgYi9hcmNoL3MzOTAvY29uZmlncy9kZWJ1Z19kZWZjb25maWdcbkBAIC03NjUsNyArNzY1LDYgQEAgQ09ORklHX0NSWVBUT19VU0VSPW1cbiBDT05GSUdfQ1JZUFRPX1NFTEZURVNUUz15XG4gQ09ORklHX0NSWVBUT19TRUxGVEVTVFNfRlVMTD15XG4gQ09ORklHX0NSWVBUT19OVUxMPXlcbi1DT05GSUdfQ1JZUFRPX1BDUllQVD1tXG4gQ09ORklHX0NSWVBUT19DUllQVEQ9bVxuIENPTkZJR19DUllQVE9fQkVOQ0hNQVJLPW1cbiBDT05GSUdfQ1JZUFRPX0RIPW1cbmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY29uZmlncy9kZWZjb25maWcgYi9hcmNoL3MzOTAvY29uZmlncy9kZWZjb25maWdcbmluZGV4IDVmNTExNGEyNTNjZjdjLi44ODI1N2ZmM2MyYzZhYSAxMDA2NDRcbi0tLSBhL2FyY2gvczM5MC9jb25maWdzL2RlZmNvbmZpZ1xuKysrIGIvYXJjaC9zMzkwL2NvbmZpZ3MvZGVmY29uZmlnXG5AQCAtNzQ5LDcgKzc0OSw2IEBAIENPTkZJR19DUllQVE9fRklQUz15XG4gQ09ORklHX0NSWVBUT19VU0VSPW1cbiBDT05GSUdfQ1JZUFRPX1NFTEZURVNUUz15XG4gQ09ORklHX0NSWVBUT19OVUxMPXlcbi1DT05GSUdfQ1JZUFRPX1BDUllQVD1tXG4gQ09ORklHX0NSWVBUT19DUllQVEQ9bVxuIENPTkZJR19DUllQVE9fQkVOQ0hNQVJLPW1cbiBDT05GSUdfQ1JZUFRPX0RIPW1cbmRpZmYgLS1naXQgYS9jcnlwdG8vS2NvbmZpZyBiL2NyeXB0by9LY29uZmlnXG5pbmRleCBmMWUzNzIxOTUyNzMxNi4uMjI4YTdhYzlmMDYzYTIgMTAwNjQ0XG4tLS0gYS9jcnlwdG8vS2NvbmZpZ1xuKysrIGIvY3J5cHRvL0tjb25maWdcbkBAIC0yMDEsMTYgKzIwMSw2IEBAIGNvbmZpZyBDUllQVE9fTlVMTFxuIFx0aGVscFxuIFx0ICBUaGVzZSBhcmUgJ051bGwnIGFsZ29yaXRobXMsIHVzZWQgYnkgSVBzZWMsIHdoaWNoIGRvIG5vdGhpbmcuXG4gXG4tY29uZmlnIENSWVBUT19QQ1JZUFRcbi1cdHRyaXN0YXRlIFwiUGFyYWxsZWwgY3J5cHRvIGVuZ2luZVwiXG4tXHRkZXBlbmRzIG9uIFNNUFxuLVx0c2VsZWN0IFBBREFUQVxuLVx0c2VsZWN0IENSWVBUT19NQU5BR0VSXG4tXHRzZWxlY3QgQ1JZUFRPX0FFQURcbi1cdGhlbHBcbi1cdCAgVGhpcyBjb252ZXJ0cyBhbiBhcmJpdHJhcnkgY3J5cHRvIGFsZ29yaXRobSBpbnRvIGEgcGFyYWxsZWxcbi1cdCAgYWxnb3JpdGhtIHRoYXQgZXhlY3V0ZXMgaW4ga2VybmVsIHRocmVhZHMuXG4tXG4gY29uZmlnIENSWVBUT19DUllQVERcbiBcdHRyaXN0YXRlIFwiU29mdHdhcmUgYXN5bmMgY3J5cHRvIGRhZW1vblwiXG4gXHRzZWxlY3QgQ1JZUFRPX0FFQURcbmRpZmYgLS1naXQgYS9jcnlwdG8vTWFrZWZpbGUgYi9jcnlwdG8vTWFrZWZpbGVcbmluZGV4IDgzODZkNTVhOTc1NWU3Li4yZTQ4N2M5NDZlNjNkNyAxMDA2NDRcbi0tLSBhL2NyeXB0by9NYWtlZmlsZVxuKysrIGIvY3J5cHRvL01ha2VmaWxlXG5AQCAtMTIwLDcgKzEyMCw2IEBAIENGTEFHU19hZWdpczEyOC1uZW9uLWlubmVyLm8gKz0gJChhZWdpczEyOC1jZmxhZ3MteSlcbiBhZWdpczEyOC0kKENPTkZJR19DUllQVE9fQUVHSVMxMjhfU0lNRCkgKz0gYWVnaXMxMjgtbmVvbi5vIGFlZ2lzMTI4LW5lb24taW5uZXIub1xuIGVuZGlmXG4gXG4tb2JqLSQoQ09ORklHX0NSWVBUT19QQ1JZUFQpICs9IHBjcnlwdC5vXG4gb2JqLSQoQ09ORklHX0NSWVBUT19DUllQVEQpICs9IGNyeXB0ZC5vXG4gb2JqLSQoQ09ORklHX0NSWVBUT19ERVMpICs9IGRlc19nZW5lcmljLm9cbiBvYmotJChDT05GSUdfQ1JZUFRPX0JMT1dGSVNIKSArPSBibG93ZmlzaF9nZW5lcmljLm9cbmRpZmYgLS1naXQgYS9jcnlwdG8vcGNyeXB0LmMgYi9jcnlwdG8vcGNyeXB0LmNcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggOWYzNzI0NDI5ODFlNjUuLjAwMDAwMDAwMDAwMDAwXG4tLS0gYS9jcnlwdG8vcGNyeXB0LmNcbisrKyAvZGV2L251bGxcbkBAIC0xLDM5NCArMCwwIEBAXG4tLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuLS8qXG4tICogcGNyeXB0IC0gUGFyYWxsZWwgY3J5cHRvIHdyYXBwZXIuXG4tICpcbi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgc2VjdW5ldCBTZWN1cml0eSBOZXR3b3JrcyBBR1xuLSAqIENvcHlyaWdodCAoQykgMjAwOSBTdGVmZmVuIEtsYXNzZXJ0IFx1MDAzY3N0ZWZmZW4ua2xhc3NlcnRAc2VjdW5ldC5jb21cdTAwM2Vcbi0gKi9cbi1cbi0jaW5jbHVkZSBcdTAwM2NjcnlwdG8vYWxnYXBpLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NjcnlwdG8vaW50ZXJuYWwvYWVhZC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvYXRvbWljLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9lcnIuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2luaXQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgva29iamVjdC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvY3B1LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NjcnlwdG8vcGNyeXB0LmhcdTAwM2Vcbi1cbi1zdGF0aWMgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGVuY3J5cHQ7XG4tc3RhdGljIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBkZWNyeXB0O1xuLXN0YXRpYyBzdHJ1Y3Qga3NldCAgICAgICAgICAgKnBjcnlwdF9rc2V0O1xuLVxuLXN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4IHtcbi1cdHN0cnVjdCBjcnlwdG9fYWVhZF9zcGF3biBzcGF3bjtcbi1cdHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzZW5jO1xuLVx0c3RydWN0IHBhZGF0YV9zaGVsbCAqcHNkZWM7XG4tXHRhdG9taWNfdCB0Zm1fY291bnQ7XG4tfTtcbi1cbi1zdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4IHtcbi1cdHN0cnVjdCBjcnlwdG9fYWVhZCAqY2hpbGQ7XG4tXHR1bnNpZ25lZCBpbnQgY2JfY3B1O1xuLX07XG4tXG4tc3RhdGljIGlubGluZSBzdHJ1Y3QgcGNyeXB0X2luc3RhbmNlX2N0eCAqcGNyeXB0X3RmbV9pY3R4KFxuLVx0c3RydWN0IGNyeXB0b19hZWFkICp0Zm0pXG4te1xuLVx0cmV0dXJuIGFlYWRfaW5zdGFuY2VfY3R4KGFlYWRfYWxnX2luc3RhbmNlKHRmbSkpO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX3NldGtleShzdHJ1Y3QgY3J5cHRvX2FlYWQgKnBhcmVudCxcbi1cdFx0XHQgICAgICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKVxuLXtcbi1cdHN0cnVjdCBwY3J5cHRfYWVhZF9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eChwYXJlbnQpO1xuLVxuLVx0cmV0dXJuIGNyeXB0b19hZWFkX3NldGtleShjdHgtXHUwMDNlY2hpbGQsIGtleSwga2V5bGVuKTtcbi19XG4tXG4tc3RhdGljIGludCBwY3J5cHRfYWVhZF9zZXRhdXRoc2l6ZShzdHJ1Y3QgY3J5cHRvX2FlYWQgKnBhcmVudCxcbi1cdFx0XHRcdCAgIHVuc2lnbmVkIGludCBhdXRoc2l6ZSlcbi17XG4tXHRzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgocGFyZW50KTtcbi1cbi1cdHJldHVybiBjcnlwdG9fYWVhZF9zZXRhdXRoc2l6ZShjdHgtXHUwMDNlY2hpbGQsIGF1dGhzaXplKTtcbi19XG4tXG4tc3RhdGljIHZvaWQgcGNyeXB0X2FlYWRfc2VyaWFsKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKVxuLXtcbi1cdHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IHBjcnlwdF9wYWRhdGFfcmVxdWVzdChwYWRhdGEpO1xuLVx0c3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxID0gcGNyeXB0X3JlcXVlc3RfY3R4KHByZXEpO1xuLVxuLVx0YWVhZF9yZXF1ZXN0X2NvbXBsZXRlKHJlcS1cdTAwM2ViYXNlLmRhdGEsIHBhZGF0YS1cdTAwM2VpbmZvKTtcbi19XG4tXG4tc3RhdGljIHZvaWQgcGNyeXB0X2FlYWRfZG9uZSh2b2lkICpkYXRhLCBpbnQgZXJyKVxuLXtcbi1cdHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSA9IGRhdGE7XG4tXHRzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnByZXEgPSBhZWFkX3JlcXVlc3RfY3R4KHJlcSk7XG4tXHRzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSA9IHBjcnlwdF9yZXF1ZXN0X3BhZGF0YShwcmVxKTtcbi1cbi1cdGlmIChlcnIgPT0gLUVJTlBST0dSRVNTKVxuLVx0XHRyZXR1cm47XG4tXG4tXHRwYWRhdGEtXHUwMDNlaW5mbyA9IGVycjtcbi1cbi1cdHBhZGF0YV9kb19zZXJpYWwocGFkYXRhKTtcbi19XG4tXG4tc3RhdGljIHZvaWQgcGNyeXB0X2FlYWRfZW5jKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKVxuLXtcbi1cdHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IHBjcnlwdF9wYWRhdGFfcmVxdWVzdChwYWRhdGEpO1xuLVx0c3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxID0gcGNyeXB0X3JlcXVlc3RfY3R4KHByZXEpO1xuLVx0aW50IHJldDtcbi1cbi1cdHJldCA9IGNyeXB0b19hZWFkX2VuY3J5cHQocmVxKTtcbi1cbi1cdGlmIChyZXQgPT0gLUVJTlBST0dSRVNTIHx8IHJldCA9PSAtRUJVU1kpXG4tXHRcdHJldHVybjtcbi1cbi1cdHBhZGF0YS1cdTAwM2VpbmZvID0gcmV0O1xuLVx0cGFkYXRhX2RvX3NlcmlhbChwYWRhdGEpO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX2VuY3J5cHQoc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxKVxuLXtcbi1cdGludCBlcnI7XG4tXHRzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnByZXEgPSBhZWFkX3JlcXVlc3RfY3R4KHJlcSk7XG4tXHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpjcmVxID0gcGNyeXB0X3JlcXVlc3RfY3R4KHByZXEpO1xuLVx0c3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEgPSBwY3J5cHRfcmVxdWVzdF9wYWRhdGEocHJlcSk7XG4tXHRzdHJ1Y3QgY3J5cHRvX2FlYWQgKmFlYWQgPSBjcnlwdG9fYWVhZF9yZXF0Zm0ocmVxKTtcbi1cdHN0cnVjdCBwY3J5cHRfYWVhZF9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eChhZWFkKTtcbi1cdHUzMiBmbGFncyA9IGFlYWRfcmVxdWVzdF9mbGFncyhyZXEpO1xuLVx0c3RydWN0IHBjcnlwdF9pbnN0YW5jZV9jdHggKmljdHg7XG4tXG4tXHRpY3R4ID0gcGNyeXB0X3RmbV9pY3R4KGFlYWQpO1xuLVxuLVx0bWVtc2V0KHBhZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBwYWRhdGFfcHJpdikpO1xuLVxuLVx0cGFkYXRhLVx1MDAzZXBhcmFsbGVsID0gcGNyeXB0X2FlYWRfZW5jO1xuLVx0cGFkYXRhLVx1MDAzZXNlcmlhbCA9IHBjcnlwdF9hZWFkX3NlcmlhbDtcbi1cbi1cdGFlYWRfcmVxdWVzdF9zZXRfdGZtKGNyZXEsIGN0eC1cdTAwM2VjaGlsZCk7XG4tXHRhZWFkX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKGNyZXEsIGZsYWdzIFx1MDAyNiB+Q1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQLFxuLVx0XHRcdFx0ICBwY3J5cHRfYWVhZF9kb25lLCByZXEpO1xuLVx0YWVhZF9yZXF1ZXN0X3NldF9jcnlwdChjcmVxLCByZXEtXHUwMDNlc3JjLCByZXEtXHUwMDNlZHN0LFxuLVx0XHRcdCAgICAgICByZXEtXHUwMDNlY3J5cHRsZW4sIHJlcS1cdTAwM2Vpdik7XG4tXHRhZWFkX3JlcXVlc3Rfc2V0X2FkKGNyZXEsIHJlcS1cdTAwM2Vhc3NvY2xlbik7XG4tXG4tXHRlcnIgPSBwYWRhdGFfZG9fcGFyYWxsZWwoaWN0eC1cdTAwM2Vwc2VuYywgcGFkYXRhLCBcdTAwMjZjdHgtXHUwMDNlY2JfY3B1KTtcbi1cdGlmICghZXJyKVxuLVx0XHRyZXR1cm4gLUVJTlBST0dSRVNTO1xuLVx0aWYgKGVyciA9PSAtRUJVU1kpIHtcbi1cdFx0LyogdHJ5IG5vbi1wYXJhbGxlbCBtb2RlICovXG4tXHRcdGFlYWRfcmVxdWVzdF9zZXRfY2FsbGJhY2soY3JlcSwgZmxhZ3MsIHJlcS1cdTAwM2ViYXNlLmNvbXBsZXRlLFxuLVx0XHRcdFx0XHQgIHJlcS1cdTAwM2ViYXNlLmRhdGEpO1xuLVx0XHRyZXR1cm4gY3J5cHRvX2FlYWRfZW5jcnlwdChjcmVxKTtcbi1cdH1cbi1cbi1cdHJldHVybiBlcnI7XG4tfVxuLVxuLXN0YXRpYyB2b2lkIHBjcnlwdF9hZWFkX2RlYyhzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSlcbi17XG4tXHRzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnByZXEgPSBwY3J5cHRfcGFkYXRhX3JlcXVlc3QocGFkYXRhKTtcbi1cdHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSA9IHBjcnlwdF9yZXF1ZXN0X2N0eChwcmVxKTtcbi1cdGludCByZXQ7XG4tXG4tXHRyZXQgPSBjcnlwdG9fYWVhZF9kZWNyeXB0KHJlcSk7XG4tXG4tXHRpZiAocmV0ID09IC1FSU5QUk9HUkVTUyB8fCByZXQgPT0gLUVCVVNZKVxuLVx0XHRyZXR1cm47XG4tXG4tXHRwYWRhdGEtXHUwMDNlaW5mbyA9IHJldDtcbi1cdHBhZGF0YV9kb19zZXJpYWwocGFkYXRhKTtcbi19XG4tXG4tc3RhdGljIGludCBwY3J5cHRfYWVhZF9kZWNyeXB0KHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSlcbi17XG4tXHRpbnQgZXJyO1xuLVx0c3RydWN0IHBjcnlwdF9yZXF1ZXN0ICpwcmVxID0gYWVhZF9yZXF1ZXN0X2N0eChyZXEpO1xuLVx0c3RydWN0IGFlYWRfcmVxdWVzdCAqY3JlcSA9IHBjcnlwdF9yZXF1ZXN0X2N0eChwcmVxKTtcbi1cdHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhID0gcGNyeXB0X3JlcXVlc3RfcGFkYXRhKHByZXEpO1xuLVx0c3RydWN0IGNyeXB0b19hZWFkICphZWFkID0gY3J5cHRvX2FlYWRfcmVxdGZtKHJlcSk7XG4tXHRzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgoYWVhZCk7XG4tXHR1MzIgZmxhZ3MgPSBhZWFkX3JlcXVlc3RfZmxhZ3MocmVxKTtcbi1cdHN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4ICppY3R4O1xuLVxuLVx0aWN0eCA9IHBjcnlwdF90Zm1faWN0eChhZWFkKTtcbi1cbi1cdG1lbXNldChwYWRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgcGFkYXRhX3ByaXYpKTtcbi1cbi1cdHBhZGF0YS1cdTAwM2VwYXJhbGxlbCA9IHBjcnlwdF9hZWFkX2RlYztcbi1cdHBhZGF0YS1cdTAwM2VzZXJpYWwgPSBwY3J5cHRfYWVhZF9zZXJpYWw7XG4tXG4tXHRhZWFkX3JlcXVlc3Rfc2V0X3RmbShjcmVxLCBjdHgtXHUwMDNlY2hpbGQpO1xuLVx0YWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhjcmVxLCBmbGFncyBcdTAwMjYgfkNSWVBUT19URk1fUkVRX01BWV9TTEVFUCxcbi1cdFx0XHRcdCAgcGNyeXB0X2FlYWRfZG9uZSwgcmVxKTtcbi1cdGFlYWRfcmVxdWVzdF9zZXRfY3J5cHQoY3JlcSwgcmVxLVx1MDAzZXNyYywgcmVxLVx1MDAzZWRzdCxcbi1cdFx0XHQgICAgICAgcmVxLVx1MDAzZWNyeXB0bGVuLCByZXEtXHUwMDNlaXYpO1xuLVx0YWVhZF9yZXF1ZXN0X3NldF9hZChjcmVxLCByZXEtXHUwMDNlYXNzb2NsZW4pO1xuLVxuLVx0ZXJyID0gcGFkYXRhX2RvX3BhcmFsbGVsKGljdHgtXHUwMDNlcHNkZWMsIHBhZGF0YSwgXHUwMDI2Y3R4LVx1MDAzZWNiX2NwdSk7XG4tXHRpZiAoIWVycilcbi1cdFx0cmV0dXJuIC1FSU5QUk9HUkVTUztcbi1cdGlmIChlcnIgPT0gLUVCVVNZKSB7XG4tXHRcdC8qIHRyeSBub24tcGFyYWxsZWwgbW9kZSAqL1xuLVx0XHRhZWFkX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKGNyZXEsIGZsYWdzLCByZXEtXHUwMDNlYmFzZS5jb21wbGV0ZSxcbi1cdFx0XHRcdFx0ICByZXEtXHUwMDNlYmFzZS5kYXRhKTtcbi1cdFx0cmV0dXJuIGNyeXB0b19hZWFkX2RlY3J5cHQoY3JlcSk7XG4tXHR9XG4tXG4tXHRyZXR1cm4gZXJyO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX2luaXRfdGZtKHN0cnVjdCBjcnlwdG9fYWVhZCAqdGZtKVxuLXtcbi1cdGludCBjcHVfaW5kZXg7XG4tXHRzdHJ1Y3QgYWVhZF9pbnN0YW5jZSAqaW5zdCA9IGFlYWRfYWxnX2luc3RhbmNlKHRmbSk7XG4tXHRzdHJ1Y3QgcGNyeXB0X2luc3RhbmNlX2N0eCAqaWN0eCA9IGFlYWRfaW5zdGFuY2VfY3R4KGluc3QpO1xuLVx0c3RydWN0IHBjcnlwdF9hZWFkX2N0eCAqY3R4ID0gY3J5cHRvX2FlYWRfY3R4KHRmbSk7XG4tXHRzdHJ1Y3QgY3J5cHRvX2FlYWQgKmNpcGhlcjtcbi1cbi1cdGNwdV9pbmRleCA9ICh1bnNpZ25lZCBpbnQpYXRvbWljX2luY19yZXR1cm4oXHUwMDI2aWN0eC1cdTAwM2V0Zm1fY291bnQpICVcbi1cdFx0ICAgIGNwdW1hc2tfd2VpZ2h0KGNwdV9vbmxpbmVfbWFzayk7XG4tXG4tXHRjdHgtXHUwMDNlY2JfY3B1ID0gY3B1bWFza19udGgoY3B1X2luZGV4LCBjcHVfb25saW5lX21hc2spO1xuLVx0Y2lwaGVyID0gY3J5cHRvX3NwYXduX2FlYWQoXHUwMDI2aWN0eC1cdTAwM2VzcGF3bik7XG4tXG4tXHRpZiAoSVNfRVJSKGNpcGhlcikpXG4tXHRcdHJldHVybiBQVFJfRVJSKGNpcGhlcik7XG4tXG4tXHRjdHgtXHUwMDNlY2hpbGQgPSBjaXBoZXI7XG4tXHRjcnlwdG9fYWVhZF9zZXRfcmVxc2l6ZSh0Zm0sIHNpemVvZihzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QpICtcbi1cdFx0XHRcdCAgICAgc2l6ZW9mKHN0cnVjdCBhZWFkX3JlcXVlc3QpICtcbi1cdFx0XHRcdCAgICAgY3J5cHRvX2FlYWRfcmVxc2l6ZShjaXBoZXIpKTtcbi1cbi1cdHJldHVybiAwO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBwY3J5cHRfYWVhZF9leGl0X3RmbShzdHJ1Y3QgY3J5cHRvX2FlYWQgKnRmbSlcbi17XG4tXHRzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgodGZtKTtcbi1cbi1cdGNyeXB0b19mcmVlX2FlYWQoY3R4LVx1MDAzZWNoaWxkKTtcbi19XG4tXG4tc3RhdGljIHZvaWQgcGNyeXB0X2ZyZWUoc3RydWN0IGFlYWRfaW5zdGFuY2UgKmluc3QpXG4te1xuLVx0c3RydWN0IHBjcnlwdF9pbnN0YW5jZV9jdHggKmN0eCA9IGFlYWRfaW5zdGFuY2VfY3R4KGluc3QpO1xuLVxuLVx0Y3J5cHRvX2Ryb3BfYWVhZChcdTAwMjZjdHgtXHUwMDNlc3Bhd24pO1xuLVx0cGFkYXRhX2ZyZWVfc2hlbGwoY3R4LVx1MDAzZXBzZGVjKTtcbi1cdHBhZGF0YV9mcmVlX3NoZWxsKGN0eC1cdTAwM2Vwc2VuYyk7XG4tXHRrZnJlZShpbnN0KTtcbi19XG4tXG4tc3RhdGljIGludCBwY3J5cHRfaW5pdF9pbnN0YW5jZShzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICppbnN0LFxuLVx0XHRcdFx0c3RydWN0IGNyeXB0b19hbGcgKmFsZylcbi17XG4tXHRpZiAoc25wcmludGYoaW5zdC1cdTAwM2VhbGcuY3JhX2RyaXZlcl9uYW1lLCBDUllQVE9fTUFYX0FMR19OQU1FLFxuLVx0XHQgICAgIFwicGNyeXB0KCVzKVwiLCBhbGctXHUwMDNlY3JhX2RyaXZlcl9uYW1lKSBcdTAwM2U9IENSWVBUT19NQVhfQUxHX05BTUUpXG4tXHRcdHJldHVybiAtRU5BTUVUT09MT05HO1xuLVxuLVx0bWVtY3B5KGluc3QtXHUwMDNlYWxnLmNyYV9uYW1lLCBhbGctXHUwMDNlY3JhX25hbWUsIENSWVBUT19NQVhfQUxHX05BTUUpO1xuLVxuLVx0aW5zdC1cdTAwM2VhbGcuY3JhX3ByaW9yaXR5ID0gYWxnLVx1MDAzZWNyYV9wcmlvcml0eSArIDEwMDtcbi1cdGluc3QtXHUwMDNlYWxnLmNyYV9ibG9ja3NpemUgPSBhbGctXHUwMDNlY3JhX2Jsb2Nrc2l6ZTtcbi1cdGluc3QtXHUwMDNlYWxnLmNyYV9hbGlnbm1hc2sgPSBhbGctXHUwMDNlY3JhX2FsaWdubWFzaztcbi1cbi1cdHJldHVybiAwO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBjcnlwdF9jcmVhdGVfYWVhZChzdHJ1Y3QgY3J5cHRvX3RlbXBsYXRlICp0bXBsLCBzdHJ1Y3QgcnRhdHRyICoqdGIsXG4tXHRcdFx0ICAgICAgc3RydWN0IGNyeXB0b19hdHRyX3R5cGUgKmFsZ3QpXG4te1xuLVx0c3RydWN0IHBjcnlwdF9pbnN0YW5jZV9jdHggKmN0eDtcbi1cdHN0cnVjdCBhZWFkX2luc3RhbmNlICppbnN0O1xuLVx0c3RydWN0IGFlYWRfYWxnICphbGc7XG4tXHR1MzIgbWFzayA9IGNyeXB0b19hbGd0X2luaGVyaXRlZF9tYXNrKGFsZ3QpO1xuLVx0aW50IGVycjtcbi1cbi1cdGluc3QgPSBremFsbG9jKHNpemVvZigqaW5zdCkgKyBzaXplb2YoKmN0eCksIEdGUF9LRVJORUwpO1xuLVx0aWYgKCFpbnN0KVxuLVx0XHRyZXR1cm4gLUVOT01FTTtcbi1cbi1cdGVyciA9IC1FTk9NRU07XG4tXG4tXHRjdHggPSBhZWFkX2luc3RhbmNlX2N0eChpbnN0KTtcbi1cdGN0eC1cdTAwM2Vwc2VuYyA9IHBhZGF0YV9hbGxvY19zaGVsbChwZW5jcnlwdCk7XG4tXHRpZiAoIWN0eC1cdTAwM2Vwc2VuYylcbi1cdFx0Z290byBlcnJfZnJlZV9pbnN0O1xuLVxuLVx0Y3R4LVx1MDAzZXBzZGVjID0gcGFkYXRhX2FsbG9jX3NoZWxsKHBkZWNyeXB0KTtcbi1cdGlmICghY3R4LVx1MDAzZXBzZGVjKVxuLVx0XHRnb3RvIGVycl9mcmVlX2luc3Q7XG4tXG4tXHRlcnIgPSBjcnlwdG9fZ3JhYl9hZWFkKFx1MDAyNmN0eC1cdTAwM2VzcGF3biwgYWVhZF9jcnlwdG9faW5zdGFuY2UoaW5zdCksXG4tXHRcdFx0ICAgICAgIGNyeXB0b19hdHRyX2FsZ19uYW1lKHRiWzFdKSwgMCwgbWFzayk7XG4tXHRpZiAoZXJyKVxuLVx0XHRnb3RvIGVycl9mcmVlX2luc3Q7XG4tXG4tXHRhbGcgPSBjcnlwdG9fc3Bhd25fYWVhZF9hbGcoXHUwMDI2Y3R4LVx1MDAzZXNwYXduKTtcbi1cdGVyciA9IHBjcnlwdF9pbml0X2luc3RhbmNlKGFlYWRfY3J5cHRvX2luc3RhbmNlKGluc3QpLCBcdTAwMjZhbGctXHUwMDNlYmFzZSk7XG4tXHRpZiAoZXJyKVxuLVx0XHRnb3RvIGVycl9mcmVlX2luc3Q7XG4tXG4tXHRpbnN0LVx1MDAzZWFsZy5iYXNlLmNyYV9mbGFncyB8PSBDUllQVE9fQUxHX0FTWU5DO1xuLVxuLVx0aW5zdC1cdTAwM2VhbGcuaXZzaXplID0gY3J5cHRvX2FlYWRfYWxnX2l2c2l6ZShhbGcpO1xuLVx0aW5zdC1cdTAwM2VhbGcubWF4YXV0aHNpemUgPSBjcnlwdG9fYWVhZF9hbGdfbWF4YXV0aHNpemUoYWxnKTtcbi1cbi1cdGluc3QtXHUwMDNlYWxnLmJhc2UuY3JhX2N0eHNpemUgPSBzaXplb2Yoc3RydWN0IHBjcnlwdF9hZWFkX2N0eCk7XG4tXG4tXHRpbnN0LVx1MDAzZWFsZy5pbml0ID0gcGNyeXB0X2FlYWRfaW5pdF90Zm07XG4tXHRpbnN0LVx1MDAzZWFsZy5leGl0ID0gcGNyeXB0X2FlYWRfZXhpdF90Zm07XG4tXG4tXHRpbnN0LVx1MDAzZWFsZy5zZXRrZXkgPSBwY3J5cHRfYWVhZF9zZXRrZXk7XG4tXHRpbnN0LVx1MDAzZWFsZy5zZXRhdXRoc2l6ZSA9IHBjcnlwdF9hZWFkX3NldGF1dGhzaXplO1xuLVx0aW5zdC1cdTAwM2VhbGcuZW5jcnlwdCA9IHBjcnlwdF9hZWFkX2VuY3J5cHQ7XG4tXHRpbnN0LVx1MDAzZWFsZy5kZWNyeXB0ID0gcGNyeXB0X2FlYWRfZGVjcnlwdDtcbi1cbi1cdGluc3QtXHUwMDNlZnJlZSA9IHBjcnlwdF9mcmVlO1xuLVxuLVx0ZXJyID0gYWVhZF9yZWdpc3Rlcl9pbnN0YW5jZSh0bXBsLCBpbnN0KTtcbi1cdGlmIChlcnIpIHtcbi1lcnJfZnJlZV9pbnN0OlxuLVx0XHRwY3J5cHRfZnJlZShpbnN0KTtcbi1cdH1cbi1cdHJldHVybiBlcnI7XG4tfVxuLVxuLXN0YXRpYyBpbnQgcGNyeXB0X2NyZWF0ZShzdHJ1Y3QgY3J5cHRvX3RlbXBsYXRlICp0bXBsLCBzdHJ1Y3QgcnRhdHRyICoqdGIpXG4te1xuLVx0c3RydWN0IGNyeXB0b19hdHRyX3R5cGUgKmFsZ3Q7XG4tXG4tXHRhbGd0ID0gY3J5cHRvX2dldF9hdHRyX3R5cGUodGIpO1xuLVx0aWYgKElTX0VSUihhbGd0KSlcbi1cdFx0cmV0dXJuIFBUUl9FUlIoYWxndCk7XG4tXG4tXHRzd2l0Y2ggKGFsZ3QtXHUwMDNldHlwZSBcdTAwMjYgYWxndC1cdTAwM2VtYXNrIFx1MDAyNiBDUllQVE9fQUxHX1RZUEVfTUFTSykge1xuLVx0Y2FzZSBDUllQVE9fQUxHX1RZUEVfQUVBRDpcbi1cdFx0cmV0dXJuIHBjcnlwdF9jcmVhdGVfYWVhZCh0bXBsLCB0YiwgYWxndCk7XG4tXHR9XG4tXG4tXHRyZXR1cm4gLUVJTlZBTDtcbi19XG4tXG4tc3RhdGljIGludCBwY3J5cHRfc3lzZnNfYWRkKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBjb25zdCBjaGFyICpuYW1lKVxuLXtcbi1cdGludCByZXQ7XG4tXG4tXHRwaW5zdC1cdTAwM2Vrb2JqLmtzZXQgPSBwY3J5cHRfa3NldDtcbi1cdHJldCA9IGtvYmplY3RfYWRkKFx1MDAyNnBpbnN0LVx1MDAzZWtvYmosIE5VTEwsIFwiJXNcIiwgbmFtZSk7XG4tXHRpZiAoIXJldClcbi1cdFx0a29iamVjdF91ZXZlbnQoXHUwMDI2cGluc3QtXHUwMDNla29iaiwgS09CSl9BREQpO1xuLVxuLVx0cmV0dXJuIHJldDtcbi19XG4tXG4tc3RhdGljIGludCBwY3J5cHRfaW5pdF9wYWRhdGEoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqKnBpbnN0LCBjb25zdCBjaGFyICpuYW1lKVxuLXtcbi1cdGludCByZXQgPSAtRU5PTUVNO1xuLVxuLVx0KnBpbnN0ID0gcGFkYXRhX2FsbG9jKG5hbWUpO1xuLVx0aWYgKCEqcGluc3QpXG4tXHRcdHJldHVybiByZXQ7XG4tXG4tXHRyZXQgPSBwY3J5cHRfc3lzZnNfYWRkKCpwaW5zdCwgbmFtZSk7XG4tXHRpZiAocmV0KVxuLVx0XHRwYWRhdGFfZnJlZSgqcGluc3QpO1xuLVxuLVx0cmV0dXJuIHJldDtcbi19XG4tXG4tc3RhdGljIHN0cnVjdCBjcnlwdG9fdGVtcGxhdGUgcGNyeXB0X3RtcGwgPSB7XG4tXHQubmFtZSA9IFwicGNyeXB0XCIsXG4tXHQuY3JlYXRlID0gcGNyeXB0X2NyZWF0ZSxcbi1cdC5tb2R1bGUgPSBUSElTX01PRFVMRSxcbi19O1xuLVxuLXN0YXRpYyBpbnQgX19pbml0IHBjcnlwdF9pbml0KHZvaWQpXG4te1xuLVx0aW50IGVyciA9IC1FTk9NRU07XG4tXG4tXHRwY3J5cHRfa3NldCA9IGtzZXRfY3JlYXRlX2FuZF9hZGQoXCJwY3J5cHRcIiwgTlVMTCwga2VybmVsX2tvYmopO1xuLVx0aWYgKCFwY3J5cHRfa3NldClcbi1cdFx0Z290byBlcnI7XG4tXG4tXHRlcnIgPSBwY3J5cHRfaW5pdF9wYWRhdGEoXHUwMDI2cGVuY3J5cHQsIFwicGVuY3J5cHRcIik7XG4tXHRpZiAoZXJyKVxuLVx0XHRnb3RvIGVycl91bnJlZ19rc2V0O1xuLVxuLVx0ZXJyID0gcGNyeXB0X2luaXRfcGFkYXRhKFx1MDAyNnBkZWNyeXB0LCBcInBkZWNyeXB0XCIpO1xuLVx0aWYgKGVycilcbi1cdFx0Z290byBlcnJfZGVpbml0X3BlbmNyeXB0O1xuLVxuLVx0cmV0dXJuIGNyeXB0b19yZWdpc3Rlcl90ZW1wbGF0ZShcdTAwMjZwY3J5cHRfdG1wbCk7XG4tXG4tZXJyX2RlaW5pdF9wZW5jcnlwdDpcbi1cdHBhZGF0YV9mcmVlKHBlbmNyeXB0KTtcbi1lcnJfdW5yZWdfa3NldDpcbi1cdGtzZXRfdW5yZWdpc3RlcihwY3J5cHRfa3NldCk7XG4tZXJyOlxuLVx0cmV0dXJuIGVycjtcbi19XG4tXG4tc3RhdGljIHZvaWQgX19leGl0IHBjcnlwdF9leGl0KHZvaWQpXG4te1xuLVx0Y3J5cHRvX3VucmVnaXN0ZXJfdGVtcGxhdGUoXHUwMDI2cGNyeXB0X3RtcGwpO1xuLVxuLVx0cGFkYXRhX2ZyZWUocGVuY3J5cHQpO1xuLVx0cGFkYXRhX2ZyZWUocGRlY3J5cHQpO1xuLVxuLVx0a3NldF91bnJlZ2lzdGVyKHBjcnlwdF9rc2V0KTtcbi19XG4tXG4tbW9kdWxlX2luaXQocGNyeXB0X2luaXQpO1xuLW1vZHVsZV9leGl0KHBjcnlwdF9leGl0KTtcbi1cbi1NT0RVTEVfTElDRU5TRShcIkdQTFwiKTtcbi1NT0RVTEVfQVVUSE9SKFwiU3RlZmZlbiBLbGFzc2VydCBcdTAwM2NzdGVmZmVuLmtsYXNzZXJ0QHNlY3VuZXQuY29tXHUwMDNlXCIpO1xuLU1PRFVMRV9ERVNDUklQVElPTihcIlBhcmFsbGVsIGNyeXB0byB3cmFwcGVyXCIpO1xuLU1PRFVMRV9BTElBU19DUllQVE8oXCJwY3J5cHRcIik7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9jcnlwdG8vcGNyeXB0LmggYi9pbmNsdWRlL2NyeXB0by9wY3J5cHQuaFxuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAyMzRkN2NmM2NmNWVhZC4uMDAwMDAwMDAwMDAwMDBcbi0tLSBhL2luY2x1ZGUvY3J5cHRvL3BjcnlwdC5oXG4rKysgL2Rldi9udWxsXG5AQCAtMSwzOSArMCwwIEBAXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuLS8qXG4tICogcGNyeXB0IC0gUGFyYWxsZWwgY3J5cHRvIGVuZ2luZS5cbi0gKlxuLSAqIENvcHlyaWdodCAoQykgMjAwOSBzZWN1bmV0IFNlY3VyaXR5IE5ldHdvcmtzIEFHXG4tICogQ29weXJpZ2h0IChDKSAyMDA5IFN0ZWZmZW4gS2xhc3NlcnQgXHUwMDNjc3RlZmZlbi5rbGFzc2VydEBzZWN1bmV0LmNvbVx1MDAzZVxuLSAqL1xuLVxuLSNpZm5kZWYgX0NSWVBUT19QQ1JZUFRfSFxuLSNkZWZpbmUgX0NSWVBUT19QQ1JZUFRfSFxuLVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2NvbnRhaW5lcl9vZi5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvY3J5cHRvLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9wYWRhdGEuaFx1MDAzZVxuLVxuLXN0cnVjdCBwY3J5cHRfcmVxdWVzdCB7XG4tXHRzdHJ1Y3QgcGFkYXRhX3ByaXZcdHBhZGF0YTtcbi1cdHZvaWRcdFx0XHQqZGF0YTtcbi1cdHZvaWRcdFx0XHQqX19jdHhbXSBDUllQVE9fTUlOQUxJR05fQVRUUjtcbi19O1xuLVxuLXN0YXRpYyBpbmxpbmUgdm9pZCAqcGNyeXB0X3JlcXVlc3RfY3R4KHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcmVxKVxuLXtcbi1cdHJldHVybiByZXEtXHUwMDNlX19jdHg7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmVcbi1zdHJ1Y3QgcGFkYXRhX3ByaXYgKnBjcnlwdF9yZXF1ZXN0X3BhZGF0YShzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnJlcSlcbi17XG4tXHRyZXR1cm4gXHUwMDI2cmVxLVx1MDAzZXBhZGF0YTtcbi19XG4tXG4tc3RhdGljIGlubGluZVxuLXN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcGNyeXB0X3BhZGF0YV9yZXF1ZXN0KHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKVxuLXtcbi1cdHJldHVybiBjb250YWluZXJfb2YocGFkYXRhLCBzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QsIHBhZGF0YSk7XG4tfVxuLVxuLSNlbmRpZlxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGFkYXRhLmggYi9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oXG5pbmRleCBiNjIzMmJlYTZlZGY1OS4uZWE0NWVhNjgwY2I3OTcgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oXG5AQCAtMTIsMTEyICsxMiw4IEBAXG4gI2lmbmRlZiBQQURBVEFfSFxuICNkZWZpbmUgUEFEQVRBX0hcbiBcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9yZWZjb3VudC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvY29tcGlsZXJfdHlwZXMuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3dvcmtxdWV1ZS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc3BpbmxvY2suaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2xpc3QuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tvYmplY3QuaFx1MDAzZVxuLVxuLSNkZWZpbmUgUEFEQVRBX0NQVV9TRVJJQUwgICAweDAxXG4tI2RlZmluZSBQQURBVEFfQ1BVX1BBUkFMTEVMIDB4MDJcbi1cbi0vKipcbi0gKiBzdHJ1Y3QgcGFkYXRhX3ByaXYgLSBSZXByZXNlbnRzIG9uZSBqb2Jcbi0gKlxuLSAqIEBsaXN0OiBMaXN0IGVudHJ5LCB0byBhdHRhY2ggdG8gdGhlIHBhZGF0YSBsaXN0cy5cbi0gKiBAcGQ6IFBvaW50ZXIgdG8gdGhlIGludGVybmFsIGNvbnRyb2wgc3RydWN0dXJlLlxuLSAqIEBjYl9jcHU6IENhbGxiYWNrIGNwdSBmb3Igc2VyaWFsaXphdGlvb24uXG4tICogQHNlcV9ucjogU2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBwYXJhbGxlbGl6ZWQgZGF0YSBvYmplY3QuXG4tICogQGluZm86IFVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXJhbGxlbCB0byB0aGUgc2VyaWFsIGZ1bmN0aW9uLlxuLSAqIEBwYXJhbGxlbDogUGFyYWxsZWwgZXhlY3V0aW9uIGZ1bmN0aW9uLlxuLSAqIEBzZXJpYWw6IFNlcmlhbCBjb21wbGV0ZSBmdW5jdGlvbi5cbi0gKi9cbi1zdHJ1Y3QgcGFkYXRhX3ByaXYge1xuLVx0c3RydWN0IGxpc3RfaGVhZFx0bGlzdDtcbi1cdHN0cnVjdCBwYXJhbGxlbF9kYXRhXHQqcGQ7XG4tXHRpbnRcdFx0XHRjYl9jcHU7XG4tXHR1bnNpZ25lZCBpbnRcdFx0c2VxX25yO1xuLVx0aW50XHRcdFx0aW5mbztcbi1cdHZvaWQgICAgICAgICAgICAgICAgICAgICgqcGFyYWxsZWwpKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTtcbi1cdHZvaWQgICAgICAgICAgICAgICAgICAgICgqc2VyaWFsKShzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSk7XG4tfTtcbi1cbi0vKipcbi0gKiBzdHJ1Y3QgcGFkYXRhX2xpc3QgLSBvbmUgcGVyIHdvcmsgdHlwZSBwZXIgQ1BVXG4tICpcbi0gKiBAbGlzdDogTGlzdCBoZWFkLlxuLSAqIEBsb2NrOiBMaXN0IGxvY2suXG4tICovXG4tc3RydWN0IHBhZGF0YV9saXN0IHtcbi1cdHN0cnVjdCBsaXN0X2hlYWQgICAgICAgIGxpc3Q7XG4tXHRzcGlubG9ja190ICAgICAgICAgICAgICBsb2NrO1xuLX07XG4tXG4tLyoqXG4tKiBzdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZSAtIFRoZSBwZXJjcHUgcGFkYXRhIHNlcmlhbCBxdWV1ZVxuLSpcbi0qIEBzZXJpYWw6IExpc3QgdG8gd2FpdCBmb3Igc2VyaWFsaXphdGlvbiBhZnRlciByZW9yZGVyaW5nLlxuLSogQHdvcms6IHdvcmsgc3RydWN0IGZvciBzZXJpYWxpemF0aW9uLlxuLSogQHBkOiBCYWNrcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgY29udHJvbCBzdHJ1Y3R1cmUuXG4tKi9cbi1zdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZSB7XG4tICAgICAgIHN0cnVjdCBwYWRhdGFfbGlzdCAgICBzZXJpYWw7XG4tICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCAgICB3b3JrO1xuLSAgICAgICBzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQ7XG4tfTtcbi1cbi0vKipcbi0gKiBzdHJ1Y3QgcGFkYXRhX2NwdW1hc2sgLSBUaGUgY3B1bWFza3MgZm9yIHRoZSBwYXJhbGxlbC9zZXJpYWwgd29ya2Vyc1xuLSAqXG4tICogQHBjcHU6IGNwdW1hc2sgZm9yIHRoZSBwYXJhbGxlbCB3b3JrZXJzLlxuLSAqIEBjYmNwdTogY3B1bWFzayBmb3IgdGhlIHNlcmlhbCAoY2FsbGJhY2spIHdvcmtlcnMuXG4tICovXG4tc3RydWN0IHBhZGF0YV9jcHVtYXNrIHtcbi1cdGNwdW1hc2tfdmFyX3RcdHBjcHU7XG4tXHRjcHVtYXNrX3Zhcl90XHRjYmNwdTtcbi19O1xuLVxuLS8qKlxuLSAqIHN0cnVjdCBwYXJhbGxlbF9kYXRhIC0gSW50ZXJuYWwgY29udHJvbCBzdHJ1Y3R1cmUsIGNvdmVycyBldmVyeXRoaW5nXG4tICogdGhhdCBkZXBlbmRzIG9uIHRoZSBjcHVtYXNrIGluIHVzZS5cbi0gKlxuLSAqIEBwczogcGFkYXRhX3NoZWxsIG9iamVjdC5cbi0gKiBAcmVvcmRlcl9saXN0OiBwZXJjcHUgcmVvcmRlciBsaXN0c1xuLSAqIEBzcXVldWU6IHBlcmNwdSBwYWRhdGEgcXVldWVzIHVzZWQgZm9yIHNlcmlhbHV6YXRpb24uXG4tICogQHJlZmNudDogTnVtYmVyIG9mIG9iamVjdHMgaG9sZGluZyBhIHJlZmVyZW5jZSBvbiB0aGlzIHBhcmFsbGVsX2RhdGEuXG4tICogQHNlcV9ucjogU2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBwYXJhbGxlbGl6ZWQgZGF0YSBvYmplY3QuXG4tICogQHByb2Nlc3NlZDogTnVtYmVyIG9mIGFscmVhZHkgcHJvY2Vzc2VkIG9iamVjdHMuXG4tICogQGNwdTogTmV4dCBDUFUgdG8gYmUgcHJvY2Vzc2VkLlxuLSAqIEBjcHVtYXNrOiBUaGUgY3B1bWFza3MgaW4gdXNlIGZvciBwYXJhbGxlbCBhbmQgc2VyaWFsIHdvcmtlcnMuXG4tICovXG4tc3RydWN0IHBhcmFsbGVsX2RhdGEge1xuLVx0c3RydWN0IHBhZGF0YV9zaGVsbFx0XHQqcHM7XG4tXHRzdHJ1Y3QgcGFkYXRhX2xpc3RcdFx0X19wZXJjcHUgKnJlb3JkZXJfbGlzdDtcbi1cdHN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlXHRfX3BlcmNwdSAqc3F1ZXVlO1xuLVx0cmVmY291bnRfdFx0XHRcdHJlZmNudDtcbi1cdHVuc2lnbmVkIGludFx0XHRcdHNlcV9ucjtcbi1cdHVuc2lnbmVkIGludFx0XHRcdHByb2Nlc3NlZDtcbi1cdGludFx0XHRcdFx0Y3B1O1xuLVx0c3RydWN0IHBhZGF0YV9jcHVtYXNrXHRcdGNwdW1hc2s7XG4tfTtcbi1cbi0vKipcbi0gKiBzdHJ1Y3QgcGFkYXRhX3NoZWxsIC0gV3JhcHBlciBhcm91bmQgc3RydWN0IHBhcmFsbGVsX2RhdGEsIGl0c1xuLSAqIHB1cnBvc2UgaXMgdG8gYWxsb3cgdGhlIHVuZGVybHlpbmcgY29udHJvbCBzdHJ1Y3R1cmUgdG8gYmUgcmVwbGFjZWRcbi0gKiBvbiB0aGUgZmx5IHVzaW5nIFJDVS5cbi0gKlxuLSAqIEBwaW5zdDogcGFkYXQgaW5zdGFuY2UuXG4tICogQHBkOiBBY3R1YWwgcGFyYWxsZWxfZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggbWF5IGJlIHN1YnN0aXR1dGVkIG9uIHRoZSBmbHkuXG4tICogQG9wZDogUG9pbnRlciB0byBvbGQgcGQgdG8gYmUgZnJlZWQgYnkgcGFkYXRhX3JlcGxhY2UuXG4tICogQGxpc3Q6IExpc3QgZW50cnkgaW4gcGFkYXRhX2luc3RhbmNlIGxpc3QuXG4tICovXG4tc3RydWN0IHBhZGF0YV9zaGVsbCB7XG4tXHRzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlXHRcdCpwaW5zdDtcbi1cdHN0cnVjdCBwYXJhbGxlbF9kYXRhIF9fcmN1XHQqcGQ7XG4tXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YVx0XHQqb3BkO1xuLVx0c3RydWN0IGxpc3RfaGVhZFx0XHRsaXN0O1xuLX07XG4rI2luY2x1ZGUgXHUwMDNjbGludXgvaW5pdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvdHlwZXMuaFx1MDAzZVxuIFxuIC8qKlxuICAqIHN0cnVjdCBwYWRhdGFfbXRfam9iIC0gcmVwcmVzZW50cyBvbmUgbXVsdGl0aHJlYWRlZCBqb2JcbkBAIC0xNDYsNDYgKzQyLDkgQEAgc3RydWN0IHBhZGF0YV9tdF9qb2Ige1xuIFx0Ym9vbFx0XHRcdG51bWFfYXdhcmU7XG4gfTtcbiBcbi0vKipcbi0gKiBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlIC0gVGhlIG92ZXJhbGwgY29udHJvbCBzdHJ1Y3R1cmUuXG4tICpcbi0gKiBAY3B1aHBfbm9kZTogTGlua2FnZSBmb3IgQ1BVIGhvdHBsdWcgY2FsbGJhY2tzLlxuLSAqIEBwYXJhbGxlbF93cTogVGhlIHdvcmtxdWV1ZSB1c2VkIGZvciBwYXJhbGxlbCB3b3JrLlxuLSAqIEBzZXJpYWxfd3E6IFRoZSB3b3JrcXVldWUgdXNlZCBmb3Igc2VyaWFsIHdvcmsuXG4tICogQHBzbGlzdDogTGlzdCBvZiBwYWRhdGFfc2hlbGwgb2JqZWN0cyBhdHRhY2hlZCB0byB0aGlzIGluc3RhbmNlLlxuLSAqIEBjcHVtYXNrOiBVc2VyIHN1cHBsaWVkIGNwdW1hc2tzIGZvciBwYXJhbGxlbCBhbmQgc2VyaWFsIHdvcmtzLlxuLSAqIEB2YWxpZGF0ZV9jcHVtYXNrOiBJbnRlcm5hbCBjcHVtYXNrIHVzZWQgdG8gdmFsaWRhdGUgQGNwdW1hc2sgZHVyaW5nIGhvdHBsdWcuXG4tICogQGtvYmo6IHBhZGF0YSBpbnN0YW5jZSBrZXJuZWwgb2JqZWN0LlxuLSAqIEBsb2NrOiBwYWRhdGEgaW5zdGFuY2UgbG9jay5cbi0gKiBAZmxhZ3M6IHBhZGF0YSBmbGFncy5cbi0gKi9cbi1zdHJ1Y3QgcGFkYXRhX2luc3RhbmNlIHtcbi1cdHN0cnVjdCBobGlzdF9ub2RlXHRcdGNwdWhwX25vZGU7XG4tXHRzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdFx0XHQqcGFyYWxsZWxfd3E7XG4tXHRzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdFx0XHQqc2VyaWFsX3dxO1xuLVx0c3RydWN0IGxpc3RfaGVhZFx0XHRwc2xpc3Q7XG4tXHRzdHJ1Y3QgcGFkYXRhX2NwdW1hc2tcdFx0Y3B1bWFzaztcbi1cdGNwdW1hc2tfdmFyX3RcdFx0XHR2YWxpZGF0ZV9jcHVtYXNrO1xuLVx0c3RydWN0IGtvYmplY3QgICAgICAgICAgICAgICAgICAga29iajtcbi1cdHN0cnVjdCBtdXRleFx0XHRcdCBsb2NrO1xuLVx0dThcdFx0XHRcdCBmbGFncztcbi0jZGVmaW5lXHRQQURBVEFfSU5JVFx0MVxuLSNkZWZpbmVcdFBBREFUQV9SRVNFVFx0MlxuLSNkZWZpbmVcdFBBREFUQV9JTlZBTElEXHQ0XG4tfTtcbi1cbiAjaWZkZWYgQ09ORklHX1BBREFUQVxuIGV4dGVybiB2b2lkIF9faW5pdCBwYWRhdGFfaW5pdCh2b2lkKTtcbi1leHRlcm4gc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGFkYXRhX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpO1xuLWV4dGVybiB2b2lkIHBhZGF0YV9mcmVlKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KTtcbi1leHRlcm4gc3RydWN0IHBhZGF0YV9zaGVsbCAqcGFkYXRhX2FsbG9jX3NoZWxsKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KTtcbi1leHRlcm4gdm9pZCBwYWRhdGFfZnJlZV9zaGVsbChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcyk7XG4tZXh0ZXJuIGludCBwYWRhdGFfZG9fcGFyYWxsZWwoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsXG4tXHRcdFx0ICAgICAgc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEsIGludCAqY2JfY3B1KTtcbi1leHRlcm4gdm9pZCBwYWRhdGFfZG9fc2VyaWFsKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTtcbiBleHRlcm4gdm9pZCBfX2luaXQgcGFkYXRhX2RvX211bHRpdGhyZWFkZWQoc3RydWN0IHBhZGF0YV9tdF9qb2IgKmpvYik7XG4tZXh0ZXJuIGludCBwYWRhdGFfc2V0X2NwdW1hc2soc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsIGludCBjcHVtYXNrX3R5cGUsXG4tXHRcdFx0ICAgICAgY3B1bWFza192YXJfdCBjcHVtYXNrKTtcbiAjZWxzZVxuIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgcGFkYXRhX2luaXQodm9pZCkge31cbiBzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IHBhZGF0YV9kb19tdWx0aXRocmVhZGVkKHN0cnVjdCBwYWRhdGFfbXRfam9iICpqb2IpXG5kaWZmIC0tZ2l0IGEva2VybmVsL3BhZGF0YS5jIGIva2VybmVsL3BhZGF0YS5jXG5pbmRleCAwZDNlYTFiNjhiMWY3MC4uNmViMTMwZDMxMDI0YzUgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvcGFkYXRhLmNcbisrKyBiL2tlcm5lbC9wYWRhdGEuY1xuQEAgLTEsNiArMSw2IEBAXG4gLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiAvKlxuLSAqIHBhZGF0YS5jIC0gZ2VuZXJpYyBpbnRlcmZhY2UgdG8gcHJvY2VzcyBkYXRhIHN0cmVhbXMgaW4gcGFyYWxsZWxcbisgKiBwYWRhdGEuYyAtIGdlbmVyaWMgaW50ZXJmYWNlIHRvIHJ1biBtdWx0aXRocmVhZGVkIGpvYnNcbiAgKlxuICAqIFNlZSBEb2N1bWVudGF0aW9uL2NvcmUtYXBpL3BhZGF0YS5yc3QgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICpcbkBAIC0xMSwxNyArMTEsMTcgQEBcbiAgKiBBdXRob3I6IERhbmllbCBKb3JkYW4gXHUwMDNjZGFuaWVsLm0uam9yZGFuQG9yYWNsZS5jb21cdTAwM2VcbiAgKi9cbiBcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9hdG9taWMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2NvbXBsZXRpb24uaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2V4cG9ydC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvY3B1bWFzay5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvZXJyLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9jcHUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2luaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbGlzdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbm9kZW1hc2suaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhZGF0YS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbXV0ZXguaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zeXNmcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvcmN1cGRhdGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NwaW5sb2NrLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC93b3JrcXVldWUuaFx1MDAzZVxuIFxuICNkZWZpbmVcdFBBREFUQV9XT1JLX09OU1RBQ0tcdDFcdC8qIFdvcmsncyBtZW1vcnkgaXMgb24gc3RhY2sgKi9cbiBcbkBAIC00NCwzNiArNDQsOCBAQCBzdHJ1Y3QgcGFkYXRhX210X2pvYl9zdGF0ZSB7XG4gXHR1bnNpZ25lZCBsb25nXHRcdGNodW5rX3NpemU7XG4gfTtcbiBcbi1zdGF0aWMgdm9pZCBwYWRhdGFfZnJlZV9wZChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQpO1xuIHN0YXRpYyB2b2lkIF9faW5pdCBwYWRhdGFfbXRfaGVscGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7XG4gXG4tc3RhdGljIGlubGluZSB2b2lkIHBhZGF0YV9nZXRfcGQoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKVxuLXtcbi1cdHJlZmNvdW50X2luYyhcdTAwMjZwZC1cdTAwM2VyZWZjbnQpO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIHZvaWQgcGFkYXRhX3B1dF9wZF9jbnQoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkLCBpbnQgY250KVxuLXtcbi1cdGlmIChyZWZjb3VudF9zdWJfYW5kX3Rlc3QoY250LCBcdTAwMjZwZC1cdTAwM2VyZWZjbnQpKVxuLVx0XHRwYWRhdGFfZnJlZV9wZChwZCk7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmUgdm9pZCBwYWRhdGFfcHV0X3BkKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZClcbi17XG4tXHRwYWRhdGFfcHV0X3BkX2NudChwZCwgMSk7XG4tfVxuLVxuLXN0YXRpYyBpbnQgcGFkYXRhX2NwdV9oYXNoKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCwgdW5zaWduZWQgaW50IHNlcV9ucilcbi17XG4tXHQvKlxuLVx0ICogSGFzaCB0aGUgc2VxdWVuY2UgbnVtYmVycyB0byB0aGUgY3B1cyBieSB0YWtpbmdcbi1cdCAqIHNlcV9uciBtb2QuIG51bWJlciBvZiBjcHVzIGluIHVzZS5cbi1cdCAqL1xuLVx0aW50IGNwdV9pbmRleCA9IHNlcV9uciAlIGNwdW1hc2tfd2VpZ2h0KHBkLVx1MDAzZWNwdW1hc2sucGNwdSk7XG4tXG4tXHRyZXR1cm4gY3B1bWFza19udGgoY3B1X2luZGV4LCBwZC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLX1cbi1cbiBzdGF0aWMgc3RydWN0IHBhZGF0YV93b3JrICpwYWRhdGFfd29ya19hbGxvYyh2b2lkKVxuIHtcbiBcdHN0cnVjdCBwYWRhdGFfd29yayAqcHc7XG5AQCAtMTQ3LDI2MCArMTE5LDYgQEAgc3RhdGljIHZvaWQgX19pbml0IHBhZGF0YV93b3Jrc19mcmVlKHN0cnVjdCBsaXN0X2hlYWQgKndvcmtzKVxuIFx0c3Bpbl91bmxvY2tfYmgoXHUwMDI2cGFkYXRhX3dvcmtzX2xvY2spO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBwYWRhdGFfcGFyYWxsZWxfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqcGFyYWxsZWxfd29yaylcbi17XG4tXHRzdHJ1Y3QgcGFkYXRhX3dvcmsgKnB3ID0gY29udGFpbmVyX29mKHBhcmFsbGVsX3dvcmssIHN0cnVjdCBwYWRhdGFfd29yayxcbi1cdFx0XHRcdFx0ICAgICAgcHdfd29yayk7XG4tXHRzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSA9IHB3LVx1MDAzZXB3X2RhdGE7XG4tXG4tXHRsb2NhbF9iaF9kaXNhYmxlKCk7XG4tXHRwYWRhdGEtXHUwMDNlcGFyYWxsZWwocGFkYXRhKTtcbi1cdHNwaW5fbG9jayhcdTAwMjZwYWRhdGFfd29ya3NfbG9jayk7XG4tXHRwYWRhdGFfd29ya19mcmVlKHB3KTtcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnBhZGF0YV93b3Jrc19sb2NrKTtcbi1cdGxvY2FsX2JoX2VuYWJsZSgpO1xuLX1cbi1cbi0vKipcbi0gKiBwYWRhdGFfZG9fcGFyYWxsZWwgLSBwYWRhdGEgcGFyYWxsZWxpemF0aW9uIGZ1bmN0aW9uXG4tICpcbi0gKiBAcHM6IHBhZGF0YXNoZWxsXG4tICogQHBhZGF0YTogb2JqZWN0IHRvIGJlIHBhcmFsbGVsaXplZFxuLSAqIEBjYl9jcHU6IHBvaW50ZXIgdG8gdGhlIENQVSB0aGF0IHRoZSBzZXJpYWxpemF0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uIHNob3VsZFxuLSAqICAgICAgICAgIHJ1biBvbi4gIElmIGl0J3Mgbm90IGluIHRoZSBzZXJpYWwgY3B1bWFzayBvZiBAcGluc3Rcbi0gKiAgICAgICAgICAoaS5lLiBjcHVtYXNrLmNiY3B1KSwgdGhpcyBmdW5jdGlvbiBzZWxlY3RzIGEgZmFsbGJhY2sgQ1BVIGFuZCBpZlxuLSAqICAgICAgICAgIG5vbmUgZm91bmQsIHJldHVybnMgLUVJTlZBTC5cbi0gKlxuLSAqIFRoZSBwYXJhbGxlbGl6YXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBydW4gd2l0aCBCSHMgb2ZmLlxuLSAqIE5vdGU6IEV2ZXJ5IG9iamVjdCB3aGljaCBpcyBwYXJhbGxlbGl6ZWQgYnkgcGFkYXRhX2RvX3BhcmFsbGVsXG4tICogbXVzdCBiZSBzZWVuIGJ5IHBhZGF0YV9kb19zZXJpYWwuXG4tICpcbi0gKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBlbHNlIG5lZ2F0aXZlIGVycm9yIGNvZGUuXG4tICovXG4taW50IHBhZGF0YV9kb19wYXJhbGxlbChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcyxcbi1cdFx0ICAgICAgIHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhLCBpbnQgKmNiX2NwdSlcbi17XG4tXHRzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCA9IHBzLVx1MDAzZXBpbnN0O1xuLVx0c3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkO1xuLVx0c3RydWN0IHBhZGF0YV93b3JrICpwdztcbi1cdGludCBjcHVfaW5kZXgsIGVycjtcbi1cbi1cdHJjdV9yZWFkX2xvY2tfYmgoKTtcbi1cbi1cdHBkID0gcmN1X2RlcmVmZXJlbmNlX2JoKHBzLVx1MDAzZXBkKTtcbi1cbi1cdGVyciA9IC1FSU5WQUw7XG4tXHRpZiAoIShwaW5zdC1cdTAwM2VmbGFncyBcdTAwMjYgUEFEQVRBX0lOSVQpIHx8IHBpbnN0LVx1MDAzZWZsYWdzIFx1MDAyNiBQQURBVEFfSU5WQUxJRClcbi1cdFx0Z290byBvdXQ7XG4tXG4tXHRpZiAoIWNwdW1hc2tfdGVzdF9jcHUoKmNiX2NwdSwgcGQtXHUwMDNlY3B1bWFzay5jYmNwdSkpIHtcbi1cdFx0aWYgKGNwdW1hc2tfZW1wdHkocGQtXHUwMDNlY3B1bWFzay5jYmNwdSkpXG4tXHRcdFx0Z290byBvdXQ7XG4tXG4tXHRcdC8qIFNlbGVjdCBhbiBhbHRlcm5hdGUgZmFsbGJhY2sgQ1BVIGFuZCBub3RpZnkgdGhlIGNhbGxlci4gKi9cbi1cdFx0Y3B1X2luZGV4ID0gKmNiX2NwdSAlIGNwdW1hc2tfd2VpZ2h0KHBkLVx1MDAzZWNwdW1hc2suY2JjcHUpO1xuLVx0XHQqY2JfY3B1ID0gY3B1bWFza19udGgoY3B1X2luZGV4LCBwZC1cdTAwM2VjcHVtYXNrLmNiY3B1KTtcbi1cdH1cbi1cbi1cdGVyciA9IC1FQlVTWTtcbi1cdGlmICgocGluc3QtXHUwMDNlZmxhZ3MgXHUwMDI2IFBBREFUQV9SRVNFVCkpXG4tXHRcdGdvdG8gb3V0O1xuLVxuLVx0cGFkYXRhX2dldF9wZChwZCk7XG4tXHRwYWRhdGEtXHUwMDNlcGQgPSBwZDtcbi1cdHBhZGF0YS1cdTAwM2VjYl9jcHUgPSAqY2JfY3B1O1xuLVxuLVx0c3Bpbl9sb2NrKFx1MDAyNnBhZGF0YV93b3Jrc19sb2NrKTtcbi1cdHBhZGF0YS1cdTAwM2VzZXFfbnIgPSArK3BkLVx1MDAzZXNlcV9ucjtcbi1cdHB3ID0gcGFkYXRhX3dvcmtfYWxsb2MoKTtcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnBhZGF0YV93b3Jrc19sb2NrKTtcbi1cbi1cdGlmICghcHcpIHtcbi1cdFx0LyogTWF4aW11bSB3b3JrcyBsaW1pdCBleGNlZWRlZCwgcnVuIGluIHRoZSBjdXJyZW50IHRhc2suICovXG4tXHRcdHBhZGF0YS1cdTAwM2VwYXJhbGxlbChwYWRhdGEpO1xuLVx0fVxuLVxuLVx0cmN1X3JlYWRfdW5sb2NrX2JoKCk7XG4tXG4tXHRpZiAocHcpIHtcbi1cdFx0cGFkYXRhX3dvcmtfaW5pdChwdywgcGFkYXRhX3BhcmFsbGVsX3dvcmtlciwgcGFkYXRhLCAwKTtcbi1cdFx0cXVldWVfd29yayhwaW5zdC1cdTAwM2VwYXJhbGxlbF93cSwgXHUwMDI2cHctXHUwMDNlcHdfd29yayk7XG4tXHR9XG4tXG4tXHRyZXR1cm4gMDtcbi1vdXQ6XG4tXHRyY3VfcmVhZF91bmxvY2tfYmgoKTtcbi1cbi1cdHJldHVybiBlcnI7XG4tfVxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX2RvX3BhcmFsbGVsKTtcbi1cbi0vKlxuLSAqIHBhZGF0YV9maW5kX25leHQgLSBGaW5kIHRoZSBuZXh0IG9iamVjdCB0aGF0IG5lZWRzIHNlcmlhbGl6YXRpb24uXG4tICpcbi0gKiBSZXR1cm46XG4tICogKiBBIHBvaW50ZXIgdG8gdGhlIGNvbnRyb2wgc3RydWN0IG9mIHRoZSBuZXh0IG9iamVjdCB0aGF0IG5lZWRzXG4tICogICBzZXJpYWxpemF0aW9uLCBpZiBwcmVzZW50IGluIG9uZSBvZiB0aGUgcGVyY3B1IHJlb3JkZXIgcXVldWVzLlxuLSAqICogTlVMTCwgaWYgdGhlIG5leHQgb2JqZWN0IHRoYXQgbmVlZHMgc2VyaWFsaXphdGlvbiB3aWxsXG4tICogICBiZSBwYXJhbGxlbCBwcm9jZXNzZWQgYnkgYW5vdGhlciBjcHUgYW5kIGlzIG5vdCB5ZXQgcHJlc2VudCBpblxuLSAqICAgdGhlIGNwdSdzIHJlb3JkZXIgcXVldWUuXG4tICovXG4tc3RhdGljIHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhX2ZpbmRfbmV4dChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQsIGludCBjcHUsXG4tXHRcdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgcHJvY2Vzc2VkKVxuLXtcbi1cdHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhO1xuLVx0c3RydWN0IHBhZGF0YV9saXN0ICpyZW9yZGVyO1xuLVxuLVx0cmVvcmRlciA9IHBlcl9jcHVfcHRyKHBkLVx1MDAzZXJlb3JkZXJfbGlzdCwgY3B1KTtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZyZW9yZGVyLVx1MDAzZWxvY2spO1xuLVx0aWYgKGxpc3RfZW1wdHkoXHUwMDI2cmVvcmRlci1cdTAwM2VsaXN0KSlcbi1cdFx0Z290byBub3Rmb3VuZDtcbi1cbi1cdHBhZGF0YSA9IGxpc3RfZW50cnkocmVvcmRlci1cdTAwM2VsaXN0Lm5leHQsIHN0cnVjdCBwYWRhdGFfcHJpdiwgbGlzdCk7XG4tXG4tXHQvKlxuLVx0ICogQ2hlY2tzIHRoZSByYXJlIGNhc2Ugd2hlcmUgdHdvIG9yIG1vcmUgcGFyYWxsZWwgam9icyBoYXZlIGhhc2hlZCB0b1xuLVx0ICogdGhlIHNhbWUgQ1BVIGFuZCBvbmUgb2YgdGhlIGxhdGVyIG9uZXMgZmluaXNoZXMgZmlyc3QuXG4tXHQgKi9cbi1cdGlmIChwYWRhdGEtXHUwMDNlc2VxX25yICE9IHByb2Nlc3NlZClcbi1cdFx0Z290byBub3Rmb3VuZDtcbi1cbi1cdGxpc3RfZGVsX2luaXQoXHUwMDI2cGFkYXRhLVx1MDAzZWxpc3QpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2cmVvcmRlci1cdTAwM2Vsb2NrKTtcbi1cdHJldHVybiBwYWRhdGE7XG4tXG4tbm90Zm91bmQ6XG4tXHRwZC1cdTAwM2Vwcm9jZXNzZWQgPSBwcm9jZXNzZWQ7XG4tXHRwZC1cdTAwM2VjcHUgPSBjcHU7XG4tXHRzcGluX3VubG9jayhcdTAwMjZyZW9yZGVyLVx1MDAzZWxvY2spO1xuLVx0cmV0dXJuIE5VTEw7XG4tfVxuLVxuLXN0YXRpYyB2b2lkIHBhZGF0YV9yZW9yZGVyKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKVxuLXtcbi1cdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCA9IHBhZGF0YS1cdTAwM2VwZDtcbi1cdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0ID0gcGQtXHUwMDNlcHMtXHUwMDNlcGluc3Q7XG4tXHR1bnNpZ25lZCBpbnQgcHJvY2Vzc2VkO1xuLVx0aW50IGNwdTtcbi1cbi1cdHByb2Nlc3NlZCA9IHBkLVx1MDAzZXByb2Nlc3NlZDtcbi1cdGNwdSA9IHBkLVx1MDAzZWNwdTtcbi1cbi1cdGRvIHtcbi1cdFx0c3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUgKnNxdWV1ZTtcbi1cdFx0aW50IGNiX2NwdTtcbi1cbi1cdFx0cHJvY2Vzc2VkKys7XG4tXHRcdC8qIFdoZW4gc2VxdWVuY2Ugd3JhcHMgYXJvdW5kLCByZXNldCB0byB0aGUgZmlyc3QgQ1BVLiAqL1xuLVx0XHRpZiAodW5saWtlbHkocHJvY2Vzc2VkID09IDApKVxuLVx0XHRcdGNwdSA9IGNwdW1hc2tfZmlyc3QocGQtXHUwMDNlY3B1bWFzay5wY3B1KTtcbi1cdFx0ZWxzZVxuLVx0XHRcdGNwdSA9IGNwdW1hc2tfbmV4dF93cmFwKGNwdSwgcGQtXHUwMDNlY3B1bWFzay5wY3B1KTtcbi1cbi1cdFx0Y2JfY3B1ID0gcGFkYXRhLVx1MDAzZWNiX2NwdTtcbi1cdFx0c3F1ZXVlID0gcGVyX2NwdV9wdHIocGQtXHUwMDNlc3F1ZXVlLCBjYl9jcHUpO1xuLVxuLVx0XHRzcGluX2xvY2soXHUwMDI2c3F1ZXVlLVx1MDAzZXNlcmlhbC5sb2NrKTtcbi1cdFx0bGlzdF9hZGRfdGFpbChcdTAwMjZwYWRhdGEtXHUwMDNlbGlzdCwgXHUwMDI2c3F1ZXVlLVx1MDAzZXNlcmlhbC5saXN0KTtcbi1cdFx0cXVldWVfd29ya19vbihjYl9jcHUsIHBpbnN0LVx1MDAzZXNlcmlhbF93cSwgXHUwMDI2c3F1ZXVlLVx1MDAzZXdvcmspO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBJZiB0aGUgbmV4dCBvYmplY3QgdGhhdCBuZWVkcyBzZXJpYWxpemF0aW9uIGlzIHBhcmFsbGVsXG4tXHRcdCAqIHByb2Nlc3NlZCBieSBhbm90aGVyIGNwdSBhbmQgaXMgc3RpbGwgb24gaXQncyB3YXkgdG8gdGhlXG4tXHRcdCAqIGNwdSdzIHJlb3JkZXIgcXVldWUsIGVuZCB0aGUgbG9vcC5cbi1cdFx0ICovXG4tXHRcdHBhZGF0YSA9IHBhZGF0YV9maW5kX25leHQocGQsIGNwdSwgcHJvY2Vzc2VkKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3F1ZXVlLVx1MDAzZXNlcmlhbC5sb2NrKTtcbi1cdH0gd2hpbGUgKHBhZGF0YSk7XG4tfVxuLVxuLXN0YXRpYyB2b2lkIHBhZGF0YV9zZXJpYWxfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqc2VyaWFsX3dvcmspXG4te1xuLVx0c3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUgKnNxdWV1ZTtcbi1cdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDtcbi1cdExJU1RfSEVBRChsb2NhbF9saXN0KTtcbi1cdGludCBjbnQ7XG4tXG4tXHRsb2NhbF9iaF9kaXNhYmxlKCk7XG4tXHRzcXVldWUgPSBjb250YWluZXJfb2Yoc2VyaWFsX3dvcmssIHN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlLCB3b3JrKTtcbi1cdHBkID0gc3F1ZXVlLVx1MDAzZXBkO1xuLVxuLVx0c3Bpbl9sb2NrKFx1MDAyNnNxdWV1ZS1cdTAwM2VzZXJpYWwubG9jayk7XG4tXHRsaXN0X3JlcGxhY2VfaW5pdChcdTAwMjZzcXVldWUtXHUwMDNlc2VyaWFsLmxpc3QsIFx1MDAyNmxvY2FsX2xpc3QpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3F1ZXVlLVx1MDAzZXNlcmlhbC5sb2NrKTtcbi1cbi1cdGNudCA9IDA7XG4tXG4tXHR3aGlsZSAoIWxpc3RfZW1wdHkoXHUwMDI2bG9jYWxfbGlzdCkpIHtcbi1cdFx0c3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGE7XG4tXG4tXHRcdHBhZGF0YSA9IGxpc3RfZW50cnkobG9jYWxfbGlzdC5uZXh0LFxuLVx0XHRcdFx0ICAgIHN0cnVjdCBwYWRhdGFfcHJpdiwgbGlzdCk7XG4tXG4tXHRcdGxpc3RfZGVsX2luaXQoXHUwMDI2cGFkYXRhLVx1MDAzZWxpc3QpO1xuLVxuLVx0XHRwYWRhdGEtXHUwMDNlc2VyaWFsKHBhZGF0YSk7XG4tXHRcdGNudCsrO1xuLVx0fVxuLVx0bG9jYWxfYmhfZW5hYmxlKCk7XG4tXG4tXHRwYWRhdGFfcHV0X3BkX2NudChwZCwgY250KTtcbi19XG4tXG4tLyoqXG4tICogcGFkYXRhX2RvX3NlcmlhbCAtIHBhZGF0YSBzZXJpYWxpemF0aW9uIGZ1bmN0aW9uXG4tICpcbi0gKiBAcGFkYXRhOiBvYmplY3QgdG8gYmUgc2VyaWFsaXplZC5cbi0gKlxuLSAqIHBhZGF0YV9kb19zZXJpYWwgbXVzdCBiZSBjYWxsZWQgZm9yIGV2ZXJ5IHBhcmFsbGVsaXplZCBvYmplY3QuXG4tICogVGhlIHNlcmlhbGl6YXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBydW4gd2l0aCBCSHMgb2ZmLlxuLSAqL1xuLXZvaWQgcGFkYXRhX2RvX3NlcmlhbChzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSlcbi17XG4tXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQgPSBwYWRhdGEtXHUwMDNlcGQ7XG4tXHRpbnQgaGFzaGVkX2NwdSA9IHBhZGF0YV9jcHVfaGFzaChwZCwgcGFkYXRhLVx1MDAzZXNlcV9ucik7XG4tXHRzdHJ1Y3QgcGFkYXRhX2xpc3QgKnJlb3JkZXIgPSBwZXJfY3B1X3B0cihwZC1cdTAwM2VyZW9yZGVyX2xpc3QsIGhhc2hlZF9jcHUpO1xuLVx0c3RydWN0IHBhZGF0YV9wcml2ICpjdXI7XG4tXHRzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7XG4tXHRib29sIGdvdGl0ID0gdHJ1ZTtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZyZW9yZGVyLVx1MDAzZWxvY2spO1xuLVx0LyogU29ydCBpbiBhc2NlbmRpbmcgb3JkZXIgb2Ygc2VxdWVuY2UgbnVtYmVyLiAqL1xuLVx0bGlzdF9mb3JfZWFjaF9wcmV2KHBvcywgXHUwMDI2cmVvcmRlci1cdTAwM2VsaXN0KSB7XG4tXHRcdGN1ciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgcGFkYXRhX3ByaXYsIGxpc3QpO1xuLVx0XHQvKiBDb21wYXJlIGJ5IGRpZmZlcmVuY2UgdG8gY29uc2lkZXIgaW50ZWdlciB3cmFwIGFyb3VuZCAqL1xuLVx0XHRpZiAoKHNpZ25lZCBpbnQpKGN1ci1cdTAwM2VzZXFfbnIgLSBwYWRhdGEtXHUwMDNlc2VxX25yKSBcdTAwM2MgMClcbi1cdFx0XHRicmVhaztcbi1cdH1cbi1cdGlmIChwYWRhdGEtXHUwMDNlc2VxX25yICE9IHBkLVx1MDAzZXByb2Nlc3NlZCkge1xuLVx0XHRnb3RpdCA9IGZhbHNlO1xuLVx0XHRsaXN0X2FkZChcdTAwMjZwYWRhdGEtXHUwMDNlbGlzdCwgcG9zKTtcbi1cdH1cbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnJlb3JkZXItXHUwMDNlbG9jayk7XG4tXG4tXHRpZiAoZ290aXQpXG4tXHRcdHBhZGF0YV9yZW9yZGVyKHBhZGF0YSk7XG4tfVxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX2RvX3NlcmlhbCk7XG4tXG4tc3RhdGljIGludCBwYWRhdGFfc2V0dXBfY3B1bWFza3Moc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpXG4te1xuLVx0c3RydWN0IHdvcmtxdWV1ZV9hdHRycyAqYXR0cnM7XG4tXHRpbnQgZXJyO1xuLVxuLVx0YXR0cnMgPSBhbGxvY193b3JrcXVldWVfYXR0cnMoKTtcbi1cdGlmICghYXR0cnMpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuLVxuLVx0LyogUmVzdHJpY3QgcGFyYWxsZWxfd3Egd29ya2VycyB0byBwZC1cdTAwM2VjcHVtYXNrLnBjcHUuICovXG4tXHRjcHVtYXNrX2NvcHkoYXR0cnMtXHUwMDNlY3B1bWFzaywgcGluc3QtXHUwMDNlY3B1bWFzay5wY3B1KTtcbi1cdGVyciA9IGFwcGx5X3dvcmtxdWV1ZV9hdHRycyhwaW5zdC1cdTAwM2VwYXJhbGxlbF93cSwgYXR0cnMpO1xuLVx0ZnJlZV93b3JrcXVldWVfYXR0cnMoYXR0cnMpO1xuLVxuLVx0cmV0dXJuIGVycjtcbi19XG4tXG4gc3RhdGljIHZvaWQgX19pbml0IHBhZGF0YV9tdF9oZWxwZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3KVxuIHtcbiBcdHN0cnVjdCBwYWRhdGFfd29yayAqcHcgPSBjb250YWluZXJfb2Yodywgc3RydWN0IHBhZGF0YV93b3JrLCBwd193b3JrKTtcbkBAIC01MDYsNjEzICsyMjQsMTcgQEAgdm9pZCBfX2luaXQgcGFkYXRhX2RvX211bHRpdGhyZWFkZWQoc3RydWN0IHBhZGF0YV9tdF9qb2IgKmpvYilcbiBcdHBhZGF0YV93b3Jrc19mcmVlKFx1MDAyNndvcmtzKTtcbiB9XG4gXG4tLyogSW5pdGlhbGl6ZSBhbGwgcGVyY3B1IHF1ZXVlcyB1c2VkIGJ5IHNlcmlhbCB3b3JrZXJzICovXG4tc3RhdGljIHZvaWQgcGFkYXRhX2luaXRfc3F1ZXVlcyhzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQpXG4te1xuLVx0aW50IGNwdTtcbi1cdHN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlICpzcXVldWU7XG4tXG4tXHRmb3JfZWFjaF9jcHUoY3B1LCBwZC1cdTAwM2VjcHVtYXNrLmNiY3B1KSB7XG4tXHRcdHNxdWV1ZSA9IHBlcl9jcHVfcHRyKHBkLVx1MDAzZXNxdWV1ZSwgY3B1KTtcbi1cdFx0c3F1ZXVlLVx1MDAzZXBkID0gcGQ7XG4tXHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNnNxdWV1ZS1cdTAwM2VzZXJpYWwubGlzdCk7XG4tXHRcdHNwaW5fbG9ja19pbml0KFx1MDAyNnNxdWV1ZS1cdTAwM2VzZXJpYWwubG9jayk7XG4tXHRcdElOSVRfV09SSyhcdTAwMjZzcXVldWUtXHUwMDNld29yaywgcGFkYXRhX3NlcmlhbF93b3JrZXIpO1xuLVx0fVxuLX1cbi1cbi0vKiBJbml0aWFsaXplIHBlci1DUFUgcmVvcmRlciBsaXN0cyAqL1xuLXN0YXRpYyB2b2lkIHBhZGF0YV9pbml0X3Jlb3JkZXJfbGlzdChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQpXG4te1xuLVx0aW50IGNwdTtcbi1cdHN0cnVjdCBwYWRhdGFfbGlzdCAqbGlzdDtcbi1cbi1cdGZvcl9lYWNoX2NwdShjcHUsIHBkLVx1MDAzZWNwdW1hc2sucGNwdSkge1xuLVx0XHRsaXN0ID0gcGVyX2NwdV9wdHIocGQtXHUwMDNlcmVvcmRlcl9saXN0LCBjcHUpO1xuLVx0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZsaXN0LVx1MDAzZWxpc3QpO1xuLVx0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZsaXN0LVx1MDAzZWxvY2spO1xuLVx0fVxuLX1cbi1cbi0vKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgY3B1bWFzayBkZXBlbmRlbmQgcmVzb3VyY2VzLiAqL1xuLXN0YXRpYyBzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGFkYXRhX2FsbG9jX3BkKHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzLFxuLVx0XHRcdFx0XHQgICAgIGludCBvZmZsaW5pbmdfY3B1KVxuLXtcbi1cdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0ID0gcHMtXHUwMDNlcGluc3Q7XG4tXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQ7XG4tXG4tXHRwZCA9IGt6YWxsb2Nfb2JqKHN0cnVjdCBwYXJhbGxlbF9kYXRhKTtcbi1cdGlmICghcGQpXG4tXHRcdGdvdG8gZXJyO1xuLVxuLVx0cGQtXHUwMDNlcmVvcmRlcl9saXN0ID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBwYWRhdGFfbGlzdCk7XG4tXHRpZiAoIXBkLVx1MDAzZXJlb3JkZXJfbGlzdClcbi1cdFx0Z290byBlcnJfZnJlZV9wZDtcbi1cbi1cdHBkLVx1MDAzZXNxdWV1ZSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZSk7XG4tXHRpZiAoIXBkLVx1MDAzZXNxdWV1ZSlcbi1cdFx0Z290byBlcnJfZnJlZV9yZW9yZGVyX2xpc3Q7XG4tXG4tXHRwZC1cdTAwM2VwcyA9IHBzO1xuLVxuLVx0aWYgKCFhbGxvY19jcHVtYXNrX3ZhcihcdTAwMjZwZC1cdTAwM2VjcHVtYXNrLnBjcHUsIEdGUF9LRVJORUwpKVxuLVx0XHRnb3RvIGVycl9mcmVlX3NxdWV1ZTtcbi1cdGlmICghYWxsb2NfY3B1bWFza192YXIoXHUwMDI2cGQtXHUwMDNlY3B1bWFzay5jYmNwdSwgR0ZQX0tFUk5FTCkpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfcGNwdTtcbi1cbi1cdGNwdW1hc2tfYW5kKHBkLVx1MDAzZWNwdW1hc2sucGNwdSwgcGluc3QtXHUwMDNlY3B1bWFzay5wY3B1LCBjcHVfb25saW5lX21hc2spO1xuLVx0Y3B1bWFza19hbmQocGQtXHUwMDNlY3B1bWFzay5jYmNwdSwgcGluc3QtXHUwMDNlY3B1bWFzay5jYmNwdSwgY3B1X29ubGluZV9tYXNrKTtcbi1cdGlmIChvZmZsaW5pbmdfY3B1IFx1MDAzZT0gMCkge1xuLVx0XHRfX2NwdW1hc2tfY2xlYXJfY3B1KG9mZmxpbmluZ19jcHUsIHBkLVx1MDAzZWNwdW1hc2sucGNwdSk7XG4tXHRcdF9fY3B1bWFza19jbGVhcl9jcHUob2ZmbGluaW5nX2NwdSwgcGQtXHUwMDNlY3B1bWFzay5jYmNwdSk7XG4tXHR9XG4tXG4tXHRwYWRhdGFfaW5pdF9yZW9yZGVyX2xpc3QocGQpO1xuLVx0cGFkYXRhX2luaXRfc3F1ZXVlcyhwZCk7XG4tXHRwZC1cdTAwM2VzZXFfbnIgPSAtMTtcbi1cdHJlZmNvdW50X3NldChcdTAwMjZwZC1cdTAwM2VyZWZjbnQsIDEpO1xuLVx0cGQtXHUwMDNlY3B1ID0gY3B1bWFza19maXJzdChwZC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLVxuLVx0cmV0dXJuIHBkO1xuLVxuLWVycl9mcmVlX3BjcHU6XG4tXHRmcmVlX2NwdW1hc2tfdmFyKHBkLVx1MDAzZWNwdW1hc2sucGNwdSk7XG4tZXJyX2ZyZWVfc3F1ZXVlOlxuLVx0ZnJlZV9wZXJjcHUocGQtXHUwMDNlc3F1ZXVlKTtcbi1lcnJfZnJlZV9yZW9yZGVyX2xpc3Q6XG4tXHRmcmVlX3BlcmNwdShwZC1cdTAwM2VyZW9yZGVyX2xpc3QpO1xuLWVycl9mcmVlX3BkOlxuLVx0a2ZyZWUocGQpO1xuLWVycjpcbi1cdHJldHVybiBOVUxMO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBwYWRhdGFfZnJlZV9wZChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQpXG4te1xuLVx0ZnJlZV9jcHVtYXNrX3ZhcihwZC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLVx0ZnJlZV9jcHVtYXNrX3ZhcihwZC1cdTAwM2VjcHVtYXNrLmNiY3B1KTtcbi1cdGZyZWVfcGVyY3B1KHBkLVx1MDAzZXJlb3JkZXJfbGlzdCk7XG4tXHRmcmVlX3BlcmNwdShwZC1cdTAwM2VzcXVldWUpO1xuLVx0a2ZyZWUocGQpO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBfX3BhZGF0YV9zdGFydChzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdClcbi17XG4tXHRwaW5zdC1cdTAwM2VmbGFncyB8PSBQQURBVEFfSU5JVDtcbi19XG4tXG4tc3RhdGljIHZvaWQgX19wYWRhdGFfc3RvcChzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdClcbi17XG4tXHRpZiAoIShwaW5zdC1cdTAwM2VmbGFncyBcdTAwMjYgUEFEQVRBX0lOSVQpKVxuLVx0XHRyZXR1cm47XG4tXG4tXHRwaW5zdC1cdTAwM2VmbGFncyBcdTAwMjY9IH5QQURBVEFfSU5JVDtcbi1cbi1cdHN5bmNocm9uaXplX3JjdSgpO1xuLX1cbi1cbi0vKiBSZXBsYWNlIHRoZSBpbnRlcm5hbCBjb250cm9sIHN0cnVjdHVyZSB3aXRoIGEgbmV3IG9uZS4gKi9cbi1zdGF0aWMgaW50IHBhZGF0YV9yZXBsYWNlX29uZShzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcywgaW50IG9mZmxpbmluZ19jcHUpXG4te1xuLVx0c3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkX25ldztcbi1cbi1cdHBkX25ldyA9IHBhZGF0YV9hbGxvY19wZChwcywgb2ZmbGluaW5nX2NwdSk7XG4tXHRpZiAoIXBkX25ldylcbi1cdFx0cmV0dXJuIC1FTk9NRU07XG4tXG4tXHRwcy1cdTAwM2VvcGQgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHBzLVx1MDAzZXBkLCAxKTtcbi1cdHJjdV9hc3NpZ25fcG9pbnRlcihwcy1cdTAwM2VwZCwgcGRfbmV3KTtcbi1cbi1cdHJldHVybiAwO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBhZGF0YV9yZXBsYWNlKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgb2ZmbGluaW5nX2NwdSlcbi17XG4tXHRzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcztcbi1cdGludCBlcnIgPSAwO1xuLVxuLVx0cGluc3QtXHUwMDNlZmxhZ3MgfD0gUEFEQVRBX1JFU0VUO1xuLVxuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShwcywgXHUwMDI2cGluc3QtXHUwMDNlcHNsaXN0LCBsaXN0KSB7XG4tXHRcdGVyciA9IHBhZGF0YV9yZXBsYWNlX29uZShwcywgb2ZmbGluaW5nX2NwdSk7XG4tXHRcdGlmIChlcnIpXG4tXHRcdFx0YnJlYWs7XG4tXHR9XG4tXG4tXHRzeW5jaHJvbml6ZV9yY3UoKTtcbi1cbi1cdGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWVfcmV2ZXJzZShwcywgXHUwMDI2cGluc3QtXHUwMDNlcHNsaXN0LCBsaXN0KVxuLVx0XHRwYWRhdGFfcHV0X3BkKHBzLVx1MDAzZW9wZCk7XG4tXG4tXHRwaW5zdC1cdTAwM2VmbGFncyBcdTAwMjY9IH5QQURBVEFfUkVTRVQ7XG4tXG4tXHRyZXR1cm4gZXJyO1xuLX1cbi1cbi0vKiBJZiBjcHVtYXNrIGNvbnRhaW5zIG5vIGFjdGl2ZSBjcHUsIHdlIG1hcmsgdGhlIGluc3RhbmNlIGFzIGludmFsaWQuICovXG4tc3RhdGljIGJvb2wgcGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2soc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsXG4tXHRcdFx0XHQgICAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2ssXG4tXHRcdFx0XHQgICAgaW50IG9mZmxpbmluZ19jcHUpXG4te1xuLVx0Y3B1bWFza19jb3B5KHBpbnN0LVx1MDAzZXZhbGlkYXRlX2NwdW1hc2ssIGNwdV9vbmxpbmVfbWFzayk7XG4tXG4tXHQvKlxuLVx0ICogQG9mZmxpbmluZ19jcHUgaXMgc3RpbGwgaW4gY3B1X29ubGluZV9tYXNrLCBzbyByZW1vdmUgaXQgaGVyZSBmb3Jcbi1cdCAqIHZhbGlkYXRpb24uICBVc2luZyBhIHN1Yi1DUFVIUF9URUFSRE9XTl9DUFUgaG90cGx1ZyBzdGF0ZSB3aGVyZVxuLVx0ICogQG9mZmxpbmluZ19jcHUgd291bGRuJ3QgYmUgaW4gdGhlIG9ubGluZSBtYXNrIGRvZXNuJ3Qgd29yayBiZWNhdXNlXG4tXHQgKiBwYWRhdGFfY3B1X29mZmxpbmUoKSBjYW4gZmFpbCBidXQgc3VjaCBhIHN0YXRlIGRvZXNuJ3QgYWxsb3cgZmFpbHVyZS5cbi1cdCAqL1xuLVx0aWYgKG9mZmxpbmluZ19jcHUgXHUwMDNlPSAwKVxuLVx0XHRfX2NwdW1hc2tfY2xlYXJfY3B1KG9mZmxpbmluZ19jcHUsIHBpbnN0LVx1MDAzZXZhbGlkYXRlX2NwdW1hc2spO1xuLVxuLVx0aWYgKCFjcHVtYXNrX2ludGVyc2VjdHMoY3B1bWFzaywgcGluc3QtXHUwMDNldmFsaWRhdGVfY3B1bWFzaykpIHtcbi1cdFx0cGluc3QtXHUwMDNlZmxhZ3MgfD0gUEFEQVRBX0lOVkFMSUQ7XG4tXHRcdHJldHVybiBmYWxzZTtcbi1cdH1cbi1cbi1cdHBpbnN0LVx1MDAzZWZsYWdzIFx1MDAyNj0gflBBREFUQV9JTlZBTElEO1xuLVx0cmV0dXJuIHRydWU7XG4tfVxuLVxuLXN0YXRpYyBpbnQgX19wYWRhdGFfc2V0X2NwdW1hc2tzKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LFxuLVx0XHRcdFx0IGNwdW1hc2tfdmFyX3QgcGNwdW1hc2ssXG4tXHRcdFx0XHQgY3B1bWFza192YXJfdCBjYmNwdW1hc2spXG4te1xuLVx0aW50IHZhbGlkO1xuLVx0aW50IGVycjtcbi1cbi1cdHZhbGlkID0gcGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2socGluc3QsIHBjcHVtYXNrLCAtMSk7XG4tXHRpZiAoIXZhbGlkKSB7XG4tXHRcdF9fcGFkYXRhX3N0b3AocGluc3QpO1xuLVx0XHRnb3RvIG91dF9yZXBsYWNlO1xuLVx0fVxuLVxuLVx0dmFsaWQgPSBwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgY2JjcHVtYXNrLCAtMSk7XG4tXHRpZiAoIXZhbGlkKVxuLVx0XHRfX3BhZGF0YV9zdG9wKHBpbnN0KTtcbi1cbi1vdXRfcmVwbGFjZTpcbi1cdGNwdW1hc2tfY29weShwaW5zdC1cdTAwM2VjcHVtYXNrLnBjcHUsIHBjcHVtYXNrKTtcbi1cdGNwdW1hc2tfY29weShwaW5zdC1cdTAwM2VjcHVtYXNrLmNiY3B1LCBjYmNwdW1hc2spO1xuLVxuLVx0ZXJyID0gcGFkYXRhX3NldHVwX2NwdW1hc2tzKHBpbnN0KSA/OiBwYWRhdGFfcmVwbGFjZShwaW5zdCwgLTEpO1xuLVxuLVx0aWYgKHZhbGlkKVxuLVx0XHRfX3BhZGF0YV9zdGFydChwaW5zdCk7XG4tXG4tXHRyZXR1cm4gZXJyO1xuLX1cbi1cbi0vKipcbi0gKiBwYWRhdGFfc2V0X2NwdW1hc2sgLSBTZXRzIHNwZWNpZmllZCBieSBAY3B1bWFza190eXBlIGNwdW1hc2sgdG8gdGhlIHZhbHVlXG4tICogICAgICAgICAgICAgICAgICAgICAgZXF1aXZhbGVudCB0byBAY3B1bWFzay5cbi0gKiBAcGluc3Q6IHBhZGF0YSBpbnN0YW5jZVxuLSAqIEBjcHVtYXNrX3R5cGU6IFBBREFUQV9DUFVfU0VSSUFMIG9yIFBBREFUQV9DUFVfUEFSQUxMRUwgY29ycmVzcG9uZGluZ1xuLSAqICAgICAgICAgICAgICAgIHRvIHBhcmFsbGVsIGFuZCBzZXJpYWwgY3B1bWFza3MgcmVzcGVjdGl2ZWx5LlxuLSAqIEBjcHVtYXNrOiB0aGUgY3B1bWFzayB0byB1c2Vcbi0gKlxuLSAqIFJldHVybjogMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGVcbi0gKi9cbi1pbnQgcGFkYXRhX3NldF9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgY3B1bWFza190eXBlLFxuLVx0XHQgICAgICAgY3B1bWFza192YXJfdCBjcHVtYXNrKVxuLXtcbi1cdHN0cnVjdCBjcHVtYXNrICpzZXJpYWxfbWFzaywgKnBhcmFsbGVsX21hc2s7XG4tXHRpbnQgZXJyID0gLUVJTlZBTDtcbi1cbi1cdGNwdXNfcmVhZF9sb2NrKCk7XG4tXHRtdXRleF9sb2NrKFx1MDAyNnBpbnN0LVx1MDAzZWxvY2spO1xuLVxuLVx0c3dpdGNoIChjcHVtYXNrX3R5cGUpIHtcbi1cdGNhc2UgUEFEQVRBX0NQVV9QQVJBTExFTDpcbi1cdFx0c2VyaWFsX21hc2sgPSBwaW5zdC1cdTAwM2VjcHVtYXNrLmNiY3B1O1xuLVx0XHRwYXJhbGxlbF9tYXNrID0gY3B1bWFzaztcbi1cdFx0YnJlYWs7XG4tXHRjYXNlIFBBREFUQV9DUFVfU0VSSUFMOlxuLVx0XHRwYXJhbGxlbF9tYXNrID0gcGluc3QtXHUwMDNlY3B1bWFzay5wY3B1O1xuLVx0XHRzZXJpYWxfbWFzayA9IGNwdW1hc2s7XG4tXHRcdGJyZWFrO1xuLVx0ZGVmYXVsdDpcbi1cdFx0IGdvdG8gb3V0O1xuLVx0fVxuLVxuLVx0ZXJyID0gIF9fcGFkYXRhX3NldF9jcHVtYXNrcyhwaW5zdCwgcGFyYWxsZWxfbWFzaywgc2VyaWFsX21hc2spO1xuLVxuLW91dDpcbi1cdG11dGV4X3VubG9jayhcdTAwMjZwaW5zdC1cdTAwM2Vsb2NrKTtcbi1cdGNwdXNfcmVhZF91bmxvY2soKTtcbi1cbi1cdHJldHVybiBlcnI7XG4tfVxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX3NldF9jcHVtYXNrKTtcbi1cbi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVXG4tXG4tc3RhdGljIGlubGluZSBpbnQgcGluc3RfaGFzX2NwdShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdSlcbi17XG4tXHRyZXR1cm4gY3B1bWFza190ZXN0X2NwdShjcHUsIHBpbnN0LVx1MDAzZWNwdW1hc2sucGNwdSkgfHxcbi1cdFx0Y3B1bWFza190ZXN0X2NwdShjcHUsIHBpbnN0LVx1MDAzZWNwdW1hc2suY2JjcHUpO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBhZGF0YV9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKVxuLXtcbi1cdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0O1xuLVx0aW50IHJldDtcbi1cbi1cdHBpbnN0ID0gaGxpc3RfZW50cnlfc2FmZShub2RlLCBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlLCBjcHVocF9ub2RlKTtcbi1cdGlmICghcGluc3RfaGFzX2NwdShwaW5zdCwgY3B1KSlcbi1cdFx0cmV0dXJuIDA7XG4tXG4tXHRtdXRleF9sb2NrKFx1MDAyNnBpbnN0LVx1MDAzZWxvY2spO1xuLVxuLVx0cmV0ID0gcGFkYXRhX3JlcGxhY2UocGluc3QsIC0xKTtcbi1cbi1cdGlmIChwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGluc3QtXHUwMDNlY3B1bWFzay5wY3B1LCAtMSkgXHUwMDI2XHUwMDI2XG4tXHQgICAgcGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2socGluc3QsIHBpbnN0LVx1MDAzZWNwdW1hc2suY2JjcHUsIC0xKSlcbi1cdFx0X19wYWRhdGFfc3RhcnQocGluc3QpO1xuLVxuLVx0bXV0ZXhfdW5sb2NrKFx1MDAyNnBpbnN0LVx1MDAzZWxvY2spO1xuLVx0cmV0dXJuIHJldDtcbi19XG4tXG4tc3RhdGljIGludCBwYWRhdGFfY3B1X29mZmxpbmUodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpXG4te1xuLVx0c3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3Q7XG4tXHRpbnQgcmV0O1xuLVxuLVx0cGluc3QgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UsIGNwdWhwX25vZGUpO1xuLVx0aWYgKCFwaW5zdF9oYXNfY3B1KHBpbnN0LCBjcHUpKVxuLVx0XHRyZXR1cm4gMDtcbi1cbi1cdG11dGV4X2xvY2soXHUwMDI2cGluc3QtXHUwMDNlbG9jayk7XG4tXG4tXHRpZiAoIXBhZGF0YV92YWxpZGF0ZV9jcHVtYXNrKHBpbnN0LCBwaW5zdC1cdTAwM2VjcHVtYXNrLnBjcHUsIGNwdSkgfHxcbi1cdCAgICAhcGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2socGluc3QsIHBpbnN0LVx1MDAzZWNwdW1hc2suY2JjcHUsIGNwdSkpXG4tXHRcdF9fcGFkYXRhX3N0b3AocGluc3QpO1xuLVxuLVx0cmV0ID0gcGFkYXRhX3JlcGxhY2UocGluc3QsIGNwdSk7XG4tXG4tXHRtdXRleF91bmxvY2soXHUwMDI2cGluc3QtXHUwMDNlbG9jayk7XG4tXHRyZXR1cm4gcmV0O1xuLX1cbi1cbi1zdGF0aWMgZW51bSBjcHVocF9zdGF0ZSBocF9vbmxpbmU7XG4tI2VuZGlmXG4tXG4tc3RhdGljIHZvaWQgX19wYWRhdGFfZnJlZShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdClcbi17XG4tI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVVxuLVx0Y3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlX25vY2FsbHMoaHBfb25saW5lLCBcdTAwMjZwaW5zdC1cdTAwM2VjcHVocF9ub2RlKTtcbi0jZW5kaWZcbi1cbi1cdFdBUk5fT04oIWxpc3RfZW1wdHkoXHUwMDI2cGluc3QtXHUwMDNlcHNsaXN0KSk7XG4tXG4tXHRmcmVlX2NwdW1hc2tfdmFyKHBpbnN0LVx1MDAzZWNwdW1hc2sucGNwdSk7XG4tXHRmcmVlX2NwdW1hc2tfdmFyKHBpbnN0LVx1MDAzZWNwdW1hc2suY2JjcHUpO1xuLVx0ZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC1cdTAwM2V2YWxpZGF0ZV9jcHVtYXNrKTtcbi1cdGRlc3Ryb3lfd29ya3F1ZXVlKHBpbnN0LVx1MDAzZXNlcmlhbF93cSk7XG4tXHRkZXN0cm95X3dvcmtxdWV1ZShwaW5zdC1cdTAwM2VwYXJhbGxlbF93cSk7XG4tXHRrZnJlZShwaW5zdCk7XG4tfVxuLVxuLSNkZWZpbmUga29iajJwaW5zdChfa29iailcdFx0XHRcdFx0XFxcbi1cdGNvbnRhaW5lcl9vZihfa29iaiwgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSwga29iailcbi0jZGVmaW5lIGF0dHIycGVudHJ5KF9hdHRyKVx0XHRcdFx0XHRcXFxuLVx0Y29udGFpbmVyX29mX2NvbnN0KF9hdHRyLCBzdHJ1Y3QgcGFkYXRhX3N5c2ZzX2VudHJ5LCBhdHRyKVxuLVxuLXN0YXRpYyB2b2lkIHBhZGF0YV9zeXNmc19yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKVxuLXtcbi1cdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0ID0ga29iajJwaW5zdChrb2JqKTtcbi1cdF9fcGFkYXRhX2ZyZWUocGluc3QpO1xuLX1cbi1cbi1zdHJ1Y3QgcGFkYXRhX3N5c2ZzX2VudHJ5IHtcbi1cdHN0cnVjdCBhdHRyaWJ1dGUgYXR0cjtcbi1cdHNzaXplX3QgKCpzaG93KShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKiwgY2hhciAqKTtcbi1cdHNzaXplX3QgKCpzdG9yZSkoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICosXG4tXHRcdFx0IGNvbnN0IGNoYXIgKiwgc2l6ZV90KTtcbi19O1xuLVxuLXN0YXRpYyBzc2l6ZV90IHNob3dfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCxcbi1cdFx0XHQgICAgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgIGNoYXIgKmJ1Zilcbi17XG4tXHRzdHJ1Y3QgY3B1bWFzayAqY3B1bWFzaztcbi1cdHNzaXplX3QgbGVuO1xuLVxuLVx0bXV0ZXhfbG9jayhcdTAwMjZwaW5zdC1cdTAwM2Vsb2NrKTtcbi1cdGlmICghc3RyY21wKGF0dHItXHUwMDNlbmFtZSwgXCJzZXJpYWxfY3B1bWFza1wiKSlcbi1cdFx0Y3B1bWFzayA9IHBpbnN0LVx1MDAzZWNwdW1hc2suY2JjcHU7XG4tXHRlbHNlXG4tXHRcdGNwdW1hc2sgPSBwaW5zdC1cdTAwM2VjcHVtYXNrLnBjcHU7XG4tXG4tXHRsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgXCIlKnBiXFxuXCIsXG4tXHRcdCAgICAgICBucl9jcHVfaWRzLCBjcHVtYXNrX2JpdHMoY3B1bWFzaykpO1xuLVx0bXV0ZXhfdW5sb2NrKFx1MDAyNnBpbnN0LVx1MDAzZWxvY2spO1xuLVx0cmV0dXJuIGxlbiBcdTAwM2MgUEFHRV9TSVpFID8gbGVuIDogLUVJTlZBTDtcbi19XG4tXG4tc3RhdGljIHNzaXplX3Qgc3RvcmVfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCxcbi1cdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsXG4tXHRcdFx0ICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudClcbi17XG4tXHRjcHVtYXNrX3Zhcl90IG5ld19jcHVtYXNrO1xuLVx0c3NpemVfdCByZXQ7XG4tXHRpbnQgbWFza190eXBlO1xuLVxuLVx0aWYgKCFhbGxvY19jcHVtYXNrX3ZhcihcdTAwMjZuZXdfY3B1bWFzaywgR0ZQX0tFUk5FTCkpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuLVxuLVx0cmV0ID0gYml0bWFwX3BhcnNlKGJ1ZiwgY291bnQsIGNwdW1hc2tfYml0cyhuZXdfY3B1bWFzayksXG4tXHRcdFx0ICAgbnJfY3B1bWFza19iaXRzKTtcbi1cdGlmIChyZXQgXHUwMDNjIDApXG4tXHRcdGdvdG8gb3V0O1xuLVxuLVx0bWFza190eXBlID0gIXN0cmNtcChhdHRyLVx1MDAzZW5hbWUsIFwic2VyaWFsX2NwdW1hc2tcIikgP1xuLVx0XHRQQURBVEFfQ1BVX1NFUklBTCA6IFBBREFUQV9DUFVfUEFSQUxMRUw7XG4tXHRyZXQgPSBwYWRhdGFfc2V0X2NwdW1hc2socGluc3QsIG1hc2tfdHlwZSwgbmV3X2NwdW1hc2spO1xuLVx0aWYgKCFyZXQpXG4tXHRcdHJldCA9IGNvdW50O1xuLVxuLW91dDpcbi1cdGZyZWVfY3B1bWFza192YXIobmV3X2NwdW1hc2spO1xuLVx0cmV0dXJuIHJldDtcbi19XG4tXG4tI2RlZmluZSBQQURBVEFfQVRUUl9SVyhfbmFtZSwgX3Nob3dfbmFtZSwgX3N0b3JlX25hbWUpXHRcdFxcXG4tXHRzdGF0aWMgY29uc3Qgc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSBfbmFtZSMjX2F0dHIgPVx0XFxcbi1cdFx0X19BVFRSKF9uYW1lLCAwNjQ0LCBfc2hvd19uYW1lLCBfc3RvcmVfbmFtZSlcbi0jZGVmaW5lIFBBREFUQV9BVFRSX1JPKF9uYW1lLCBfc2hvd19uYW1lKVx0XHRcdFxcXG4tXHRzdGF0aWMgY29uc3Qgc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSBfbmFtZSMjX2F0dHIgPVx0XFxcbi1cdFx0X19BVFRSKF9uYW1lLCAwNDAwLCBfc2hvd19uYW1lLCBOVUxMKVxuLVxuLVBBREFUQV9BVFRSX1JXKHNlcmlhbF9jcHVtYXNrLCBzaG93X2NwdW1hc2ssIHN0b3JlX2NwdW1hc2spO1xuLVBBREFUQV9BVFRSX1JXKHBhcmFsbGVsX2NwdW1hc2ssIHNob3dfY3B1bWFzaywgc3RvcmVfY3B1bWFzayk7XG4tXG4tLypcbi0gKiBQYWRhdGEgc3lzZnMgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBvYmplY3RzOlxuLSAqIHNlcmlhbF9jcHVtYXNrICAgW1JXXSAtIGNwdW1hc2sgZm9yIHNlcmlhbCB3b3JrZXJzXG4tICogcGFyYWxsZWxfY3B1bWFzayBbUlddIC0gY3B1bWFzayBmb3IgcGFyYWxsZWwgd29ya2Vyc1xuLSAqL1xuLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICpjb25zdCBwYWRhdGFfZGVmYXVsdF9hdHRyc1tdID0ge1xuLVx0XHUwMDI2c2VyaWFsX2NwdW1hc2tfYXR0ci5hdHRyLFxuLVx0XHUwMDI2cGFyYWxsZWxfY3B1bWFza19hdHRyLmF0dHIsXG4tXHROVUxMLFxuLX07XG4tQVRUUklCVVRFX0dST1VQUyhwYWRhdGFfZGVmYXVsdCk7XG4tXG4tc3RhdGljIHNzaXplX3QgcGFkYXRhX3N5c2ZzX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosXG4tXHRcdFx0XHQgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVxuLXtcbi1cdGNvbnN0IHN0cnVjdCBwYWRhdGFfc3lzZnNfZW50cnkgKnBlbnRyeTtcbi1cdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0O1xuLVx0c3NpemVfdCByZXQgPSAtRUlPO1xuLVxuLVx0cGluc3QgPSBrb2JqMnBpbnN0KGtvYmopO1xuLVx0cGVudHJ5ID0gYXR0cjJwZW50cnkoYXR0cik7XG4tXHRpZiAocGVudHJ5LVx1MDAzZXNob3cpXG4tXHRcdHJldCA9IHBlbnRyeS1cdTAwM2VzaG93KHBpbnN0LCBhdHRyLCBidWYpO1xuLVxuLVx0cmV0dXJuIHJldDtcbi19XG4tXG4tc3RhdGljIHNzaXplX3QgcGFkYXRhX3N5c2ZzX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLFxuLVx0XHRcdFx0ICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudClcbi17XG4tXHRjb25zdCBzdHJ1Y3QgcGFkYXRhX3N5c2ZzX2VudHJ5ICpwZW50cnk7XG4tXHRzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdDtcbi1cdHNzaXplX3QgcmV0ID0gLUVJTztcbi1cbi1cdHBpbnN0ID0ga29iajJwaW5zdChrb2JqKTtcbi1cdHBlbnRyeSA9IGF0dHIycGVudHJ5KGF0dHIpO1xuLVx0aWYgKHBlbnRyeS1cdTAwM2VzdG9yZSlcbi1cdFx0cmV0ID0gcGVudHJ5LVx1MDAzZXN0b3JlKHBpbnN0LCBhdHRyLCBidWYsIGNvdW50KTtcbi1cbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIHBhZGF0YV9zeXNmc19vcHMgPSB7XG4tXHQuc2hvdyA9IHBhZGF0YV9zeXNmc19zaG93LFxuLVx0LnN0b3JlID0gcGFkYXRhX3N5c2ZzX3N0b3JlLFxuLX07XG4tXG4tc3RhdGljIGNvbnN0IHN0cnVjdCBrb2JqX3R5cGUgcGFkYXRhX2F0dHJfdHlwZSA9IHtcbi1cdC5zeXNmc19vcHMgPSBcdTAwMjZwYWRhdGFfc3lzZnNfb3BzLFxuLVx0LmRlZmF1bHRfZ3JvdXBzID0gcGFkYXRhX2RlZmF1bHRfZ3JvdXBzLFxuLVx0LnJlbGVhc2UgPSBwYWRhdGFfc3lzZnNfcmVsZWFzZSxcbi19O1xuLVxuLS8qKlxuLSAqIHBhZGF0YV9hbGxvYyAtIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgcGFkYXRhIGluc3RhbmNlXG4tICogQG5hbWU6IHVzZWQgdG8gaWRlbnRpZnkgdGhlIGluc3RhbmNlXG4tICpcbi0gKiBSZXR1cm46IG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLCBOVUxMIG9uIGVycm9yXG4tICovXG4tc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGFkYXRhX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpXG4te1xuLVx0c3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3Q7XG4tXG4tXHRwaW5zdCA9IGt6YWxsb2Nfb2JqKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UpO1xuLVx0aWYgKCFwaW5zdClcbi1cdFx0Z290byBlcnI7XG4tXG4tXHRwaW5zdC1cdTAwM2VwYXJhbGxlbF93cSA9IGFsbG9jX3dvcmtxdWV1ZShcIiVzX3BhcmFsbGVsXCIsIFdRX1VOQk9VTkQsIDAsXG4tXHRcdFx0XHRcdCAgICAgbmFtZSk7XG4tXHRpZiAoIXBpbnN0LVx1MDAzZXBhcmFsbGVsX3dxKVxuLVx0XHRnb3RvIGVycl9mcmVlX2luc3Q7XG4tXG4tXHRjcHVzX3JlYWRfbG9jaygpO1xuLVxuLVx0cGluc3QtXHUwMDNlc2VyaWFsX3dxID0gYWxsb2Nfd29ya3F1ZXVlKFwiJXNfc2VyaWFsXCIsXG4tXHRcdFx0XHRcdCAgIFdRX01FTV9SRUNMQUlNIHwgV1FfQ1BVX0lOVEVOU0lWRSB8IFdRX1BFUkNQVSxcbi1cdFx0XHRcdFx0ICAgMSwgbmFtZSk7XG4tXHRpZiAoIXBpbnN0LVx1MDAzZXNlcmlhbF93cSlcbi1cdFx0Z290byBlcnJfcHV0X2NwdXM7XG4tXG4tXHRpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKFx1MDAyNnBpbnN0LVx1MDAzZWNwdW1hc2sucGNwdSwgR0ZQX0tFUk5FTCkpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfc2VyaWFsX3dxO1xuLVx0aWYgKCFhbGxvY19jcHVtYXNrX3ZhcihcdTAwMjZwaW5zdC1cdTAwM2VjcHVtYXNrLmNiY3B1LCBHRlBfS0VSTkVMKSlcbi1cdFx0Z290byBlcnJfZnJlZV9wX21hc2s7XG4tXHRpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKFx1MDAyNnBpbnN0LVx1MDAzZXZhbGlkYXRlX2NwdW1hc2ssIEdGUF9LRVJORUwpKVxuLVx0XHRnb3RvIGVycl9mcmVlX2NiX21hc2s7XG4tXG4tXHRJTklUX0xJU1RfSEVBRChcdTAwMjZwaW5zdC1cdTAwM2Vwc2xpc3QpO1xuLVxuLVx0Y3B1bWFza19jb3B5KHBpbnN0LVx1MDAzZWNwdW1hc2sucGNwdSwgY3B1X3Bvc3NpYmxlX21hc2spO1xuLVx0Y3B1bWFza19jb3B5KHBpbnN0LVx1MDAzZWNwdW1hc2suY2JjcHUsIGNwdV9wb3NzaWJsZV9tYXNrKTtcbi1cbi1cdGlmIChwYWRhdGFfc2V0dXBfY3B1bWFza3MocGluc3QpKVxuLVx0XHRnb3RvIGVycl9mcmVlX3ZfbWFzaztcbi1cbi1cdF9fcGFkYXRhX3N0YXJ0KHBpbnN0KTtcbi1cbi1cdGtvYmplY3RfaW5pdChcdTAwMjZwaW5zdC1cdTAwM2Vrb2JqLCBcdTAwMjZwYWRhdGFfYXR0cl90eXBlKTtcbi1cdG11dGV4X2luaXQoXHUwMDI2cGluc3QtXHUwMDNlbG9jayk7XG4tXG4tI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVVxuLVx0Y3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlX25vY2FsbHNfY3B1c2xvY2tlZChocF9vbmxpbmUsXG4tXHRcdFx0XHRcdFx0ICAgIFx1MDAyNnBpbnN0LVx1MDAzZWNwdWhwX25vZGUpO1xuLSNlbmRpZlxuLVxuLVx0Y3B1c19yZWFkX3VubG9jaygpO1xuLVxuLVx0cmV0dXJuIHBpbnN0O1xuLVxuLWVycl9mcmVlX3ZfbWFzazpcbi1cdGZyZWVfY3B1bWFza192YXIocGluc3QtXHUwMDNldmFsaWRhdGVfY3B1bWFzayk7XG4tZXJyX2ZyZWVfY2JfbWFzazpcbi1cdGZyZWVfY3B1bWFza192YXIocGluc3QtXHUwMDNlY3B1bWFzay5jYmNwdSk7XG4tZXJyX2ZyZWVfcF9tYXNrOlxuLVx0ZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLWVycl9mcmVlX3NlcmlhbF93cTpcbi1cdGRlc3Ryb3lfd29ya3F1ZXVlKHBpbnN0LVx1MDAzZXNlcmlhbF93cSk7XG4tZXJyX3B1dF9jcHVzOlxuLVx0Y3B1c19yZWFkX3VubG9jaygpO1xuLVx0ZGVzdHJveV93b3JrcXVldWUocGluc3QtXHUwMDNlcGFyYWxsZWxfd3EpO1xuLWVycl9mcmVlX2luc3Q6XG4tXHRrZnJlZShwaW5zdCk7XG4tZXJyOlxuLVx0cmV0dXJuIE5VTEw7XG4tfVxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX2FsbG9jKTtcbi1cbi0vKipcbi0gKiBwYWRhdGFfZnJlZSAtIGZyZWUgYSBwYWRhdGEgaW5zdGFuY2Vcbi0gKlxuLSAqIEBwaW5zdDogcGFkYXRhIGluc3RhbmNlIHRvIGZyZWVcbi0gKi9cbi12b2lkIHBhZGF0YV9mcmVlKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KVxuLXtcbi1cdGtvYmplY3RfcHV0KFx1MDAyNnBpbnN0LVx1MDAzZWtvYmopO1xuLX1cbi1FWFBPUlRfU1lNQk9MKHBhZGF0YV9mcmVlKTtcbi1cbi0vKipcbi0gKiBwYWRhdGFfYWxsb2Nfc2hlbGwgLSBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBwYWRhdGEgc2hlbGwuXG4tICpcbi0gKiBAcGluc3Q6IFBhcmVudCBwYWRhdGFfaW5zdGFuY2Ugb2JqZWN0LlxuLSAqXG4tICogUmV0dXJuOiBuZXcgc2hlbGwgb24gc3VjY2VzcywgTlVMTCBvbiBlcnJvclxuLSAqL1xuLXN0cnVjdCBwYWRhdGFfc2hlbGwgKnBhZGF0YV9hbGxvY19zaGVsbChzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdClcbi17XG4tXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQ7XG4tXHRzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcztcbi1cbi1cdHBzID0ga3phbGxvY19vYmooKnBzKTtcbi1cdGlmICghcHMpXG4tXHRcdGdvdG8gb3V0O1xuLVxuLVx0cHMtXHUwMDNlcGluc3QgPSBwaW5zdDtcbi1cbi1cdGNwdXNfcmVhZF9sb2NrKCk7XG4tXHRwZCA9IHBhZGF0YV9hbGxvY19wZChwcywgLTEpO1xuLVx0Y3B1c19yZWFkX3VubG9jaygpO1xuLVxuLVx0aWYgKCFwZClcbi1cdFx0Z290byBvdXRfZnJlZV9wcztcbi1cbi1cdG11dGV4X2xvY2soXHUwMDI2cGluc3QtXHUwMDNlbG9jayk7XG4tXHRSQ1VfSU5JVF9QT0lOVEVSKHBzLVx1MDAzZXBkLCBwZCk7XG4tXHRsaXN0X2FkZChcdTAwMjZwcy1cdTAwM2VsaXN0LCBcdTAwMjZwaW5zdC1cdTAwM2Vwc2xpc3QpO1xuLVx0bXV0ZXhfdW5sb2NrKFx1MDAyNnBpbnN0LVx1MDAzZWxvY2spO1xuLVxuLVx0cmV0dXJuIHBzO1xuLVxuLW91dF9mcmVlX3BzOlxuLVx0a2ZyZWUocHMpO1xuLW91dDpcbi1cdHJldHVybiBOVUxMO1xuLX1cbi1FWFBPUlRfU1lNQk9MKHBhZGF0YV9hbGxvY19zaGVsbCk7XG4tXG4tLyoqXG4tICogcGFkYXRhX2ZyZWVfc2hlbGwgLSBmcmVlIGEgcGFkYXRhIHNoZWxsXG4tICpcbi0gKiBAcHM6IHBhZGF0YSBzaGVsbCB0byBmcmVlXG4tICovXG4tdm9pZCBwYWRhdGFfZnJlZV9zaGVsbChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcylcbi17XG4tXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQ7XG4tXG4tXHRpZiAoIXBzKVxuLVx0XHRyZXR1cm47XG4tXG4tXHRtdXRleF9sb2NrKFx1MDAyNnBzLVx1MDAzZXBpbnN0LVx1MDAzZWxvY2spO1xuLVx0bGlzdF9kZWwoXHUwMDI2cHMtXHUwMDNlbGlzdCk7XG4tXHRwZCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQocHMtXHUwMDNlcGQsIDEpO1xuLVx0cGFkYXRhX3B1dF9wZChwZCk7XG4tXHRtdXRleF91bmxvY2soXHUwMDI2cHMtXHUwMDNlcGluc3QtXHUwMDNlbG9jayk7XG4tXG4tXHRrZnJlZShwcyk7XG4tfVxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX2ZyZWVfc2hlbGwpO1xuLVxuIHZvaWQgX19pbml0IHBhZGF0YV9pbml0KHZvaWQpXG4ge1xuIFx0dW5zaWduZWQgaW50IGksIHBvc3NpYmxlX2NwdXM7XG4tI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVVxuLVx0aW50IHJldDtcbi1cbi1cdHJldCA9IGNwdWhwX3NldHVwX3N0YXRlX211bHRpKENQVUhQX0FQX09OTElORV9EWU4sIFwicGFkYXRhOm9ubGluZVwiLFxuLVx0XHRcdFx0ICAgICAgcGFkYXRhX2NwdV9vbmxpbmUsIHBhZGF0YV9jcHVfb2ZmbGluZSk7XG4tXHRpZiAocmV0IFx1MDAzYyAwKVxuLVx0XHRnb3RvIGVycjtcbi1cdGhwX29ubGluZSA9IHJldDtcbi0jZW5kaWZcbiBcbiBcdHBvc3NpYmxlX2NwdXMgPSBudW1fcG9zc2libGVfY3B1cygpO1xuIFx0cGFkYXRhX3dvcmtzID0ga21hbGxvY19vYmpzKHN0cnVjdCBwYWRhdGFfd29yaywgcG9zc2libGVfY3B1cyk7XG4tXHRpZiAoIXBhZGF0YV93b3Jrcylcbi1cdFx0Z290byByZW1vdmVfb25saW5lX3N0YXRlO1xuK1x0aWYgKCFwYWRhdGFfd29ya3MpIHtcbitcdFx0cHJfd2FybihcInBhZGF0YTogaW5pdGlhbGl6YXRpb24gZmFpbGVkXFxuXCIpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4gXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBwb3NzaWJsZV9jcHVzOyArK2kpXG4gXHRcdGxpc3RfYWRkKFx1MDAyNnBhZGF0YV93b3Jrc1tpXS5wd19saXN0LCBcdTAwMjZwYWRhdGFfZnJlZV93b3Jrcyk7XG4tXG4tXHRyZXR1cm47XG4tXG4tcmVtb3ZlX29ubGluZV9zdGF0ZTpcbi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVXG4tXHRjcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUoaHBfb25saW5lKTtcbi1lcnI6XG4tI2VuZGlmXG4tXHRwcl93YXJuKFwicGFkYXRhOiBpbml0aWFsaXphdGlvbiBmYWlsZWRcXG5cIik7XG4gfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL2NyeXB0by90Y3J5cHQvdGNyeXB0X3NwZWVkX2NvbXBhcmUucHkgYi90b29scy9jcnlwdG8vdGNyeXB0L3RjcnlwdF9zcGVlZF9jb21wYXJlLnB5XG5pbmRleCBmM2Y1NzgzY2RjMDY2Yi4uMGJmMzhjMDczZGJjMDMgMTAwNzU1XG4tLS0gYS90b29scy9jcnlwdG8vdGNyeXB0L3RjcnlwdF9zcGVlZF9jb21wYXJlLnB5XG4rKysgYi90b29scy9jcnlwdG8vdGNyeXB0L3RjcnlwdF9zcGVlZF9jb21wYXJlLnB5XG5AQCAtMjgsMTkgKzI4LDE2IEBAIG51bV9tYj04XG4gbW9kZT0yMTFcbiBcbiAjIGJhc2Ugc3BlZWQgdGVzdFxuLWxzbW9kIHwgZ3JlcCBwY3J5cHQgXHUwMDI2XHUwMDI2IG1vZHByb2JlIC1yIHBjcnlwdFxuIGRtZXNnIC1DXG4tbW9kcHJvYmUgdGNyeXB0IGFsZz1cInBjcnlwdChyZmM0MTA2KGdjbShhZXMpKSlcIiB0eXBlPTNcbittb2Rwcm9iZSB0Y3J5cHQgYWxnPVwicmZjNDEwNihnY20oYWVzKSlcIiB0eXBlPTNcbiBtb2Rwcm9iZSB0Y3J5cHQgbW9kZT0ke21vZGV9IHNlYz0ke3NlY30gbnVtX21iPSR7bnVtX21ifVxuIGRtZXNnIFx1MDAzZSAke3NlcV9udW19X2Jhc2VfZG1lc2cubG9nXG4gXG4gIyBuZXcgc3BlZWQgdGVzdFxuLWxzbW9kIHwgZ3JlcCBwY3J5cHQgXHUwMDI2XHUwMDI2IG1vZHByb2JlIC1yIHBjcnlwdFxuIGRtZXNnIC1DXG4tbW9kcHJvYmUgdGNyeXB0IGFsZz1cInBjcnlwdChyZmM0MTA2KGdjbShhZXMpKSlcIiB0eXBlPTNcbittb2Rwcm9iZSB0Y3J5cHQgYWxnPVwicmZjNDEwNihnY20oYWVzKSlcIiB0eXBlPTNcbiBtb2Rwcm9iZSB0Y3J5cHQgbW9kZT0ke21vZGV9IHNlYz0ke3NlY30gbnVtX21iPSR7bnVtX21ifVxuIGRtZXNnIFx1MDAzZSAke3NlcV9udW19X25ld19kbWVzZy5sb2dcbi1sc21vZCB8IGdyZXAgcGNyeXB0IFx1MDAyNlx1MDAyNiBtb2Rwcm9iZSAtciBwY3J5cHRcbiBcbiB0b29scy9jcnlwdG8vdGNyeXB0L3RjcnlwdF9zcGVlZF9jb21wYXJlLnB5IFxcXG4gICAgICR7c2VxX251bX1fYmFzZV9kbWVzZy5sb2cgXFxcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDAzOjM1OjE1LjUxNzAxNTc0N1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEyNjczMDQzNDE1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgQXNzZXNzbWVudDogYHBjcnlwdGAgUmVtb3ZhbCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGEgcGF0Y2ggdGhhdCBlc3NlbnRpYWxseSBndXRzIHRoZSBgcGNyeXB0YCBlbmdpbmUgYW5kIGl0cyBzZXJpYWxpemVkIGpvYiBjYXBhYmlsaXRpZXMgd2l0aGluIGBwYWRhdGFgLiAgTXkgaW5pdGlhbCB0aG91Z2h0IGlzLCBcIlRoaXMgaXMgYSAqcmVtb3ZhbCogcGF0Y2gg4oCTIGdvb2QuXCIgIE5vIG5ldyBjb2RlIG1lYW5zIHBvdGVudGlhbGx5IGxlc3Mgd29yayBmb3IgbWUuXG5cbk15IGZvY3VzIGlzIHdoZXRoZXIgdGhlcmUncyBhbnl0aGluZyAqbmV3KiB0byBmdXp6LiBUaGUgcGF0Y2ggY2xlYW5zIHVwIHRoZSBgRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9wYWRhdGEucnN0YCwgYE1BSU5UQUlORVJTYCwgcmVtb3ZlcyB0aGUgYGNyeXB0by9wY3J5cHQuY2AsIGBpbmNsdWRlL2NyeXB0by9wY3J5cHQuaGAsIGFuZCBtb2RpZmllcyBgaW5jbHVkZS9saW51eC9wYWRhdGEuaGAgYW5kIGBrZXJuZWwvcGFkYXRhLmNgLiAgU3BlY2lmaWNhbGx5LCB0aGUgZGVsZXRlZCBjb2RlIGluY2x1ZGVzIGBwYWRhdGFfZG9fcGFyYWxsZWxgLCBgcGFkYXRhX2RvX3NlcmlhbGAsIGFuZCBhIGhvc3Qgb2YgYXNzb2NpYXRlZCBmdW5jdGlvbnMuICBJdCBhbHNvIHJlbW92ZXMgdGhlIGBDT05GSUdfQ1JZUFRPX1BDUllQVGAgY29uZmlnIG9wdGlvbi5cblxuU2luY2UgdGhlIGZ1bmN0aW9uYWxpdHkgcmVtb3ZlZCBpcyB0aGUgcGFyYWxsZWwgY3J5cHRvIGVuZ2luZSBhbmQgdGhlIHNlcmlhbGl6ZWQgam9iIHN1cHBvcnQgZnJvbSBwYWRhdGEsIG15IGFzc3VtcHRpb24gaXMgdGhhdCB0aGlzIGRvZXNuJ3QgbmVjZXNzaXRhdGUgZnV6emluZy4gTXkgbWFpbiBjb25jZXJuIGlzIHRoYXQgcGVyaGFwcyB0aGUgbXVsdGl0aHJlYWRlZCBqb2Igc3VwcG9ydCBoYWQgYmVlbiBhZmZlY3RlZCBpbiBhIHdheSB0aGF0IHJlcXVpcmVzIGZ1enppbmcuXG5cbkknbSBjaGVja2luZyBga2VybmVsL3BhZGF0YS5jYC4gYHBhZGF0YV9kb19tdWx0aXRocmVhZGVkYCByZW1haW5zLiBgcGFkYXRhX2luaXRgIGhhcyBiZWVuIGFkanVzdGVkLCBidXQgaXQncyAqcmVtb3ZpbmcqIENQVSBob3RwbHVnIHN0YXRlIHJlZ2lzdHJhdGlvbiAoYGNwdWhwX3NldHVwX3N0YXRlX211bHRpYCkuIFRoaXMgd2FzIGV4Y2x1c2l2ZWx5IHVzZWQgYnkgdGhlIHNlcmlhbGl6ZWQgam9iIHN1cHBvcnQsIHdoaWNoIGNvbmZpcm1zIG15IGFzc3VtcHRpb24uICBGdW5jdGlvbnMgbGlrZSBgcGFkYXRhX2FsbG9jX3BkYCwgYHBhZGF0YV9mcmVlX3BkYCwgYHBhZGF0YV9yZXBsYWNlYCwgYHBhZGF0YV9zZXRfY3B1bWFza2AgYXJlIGJlaW5nIHJlbW92ZWQgYXMgd2VsbC5cblxuSSdtIHZlcnkgY29uZmlkZW50IGF0IHRoaXMgcG9pbnQgdGhhdCB0aGlzIGlzIGEgcHVyZWx5IGFkZGl0aXZlIHJlbW92YWwgcGF0Y2guICBUaGVyZSdzIG5vIG5ldyBjb2RlIHRvIHRlc3QsIHdoaWNoIG1lYW5zIHRoZXJlJ3Mgbm8gbmV3IGF0dGFjayBzdXJmYWNlIHRvIGZ1enouXG5cbkknbSBkb3VibGUtY2hlY2tpbmcgdGhlIGBrZXJuZWwvcGFkYXRhLmNgIGRpZmYsIGFuZCBjb25maXJtIHRoYXQgdGhlIGFkZGl0aW9ucyBpbiBga2VybmVsL3BhZGF0YS5jYCBhcmUgc2ltcGx5IGAjaW5jbHVkZWBzLCB3aGljaCB3ZXJlIHByZXZpb3VzbHkgaW1wbGljaXRseSBpbmNsdWRlZCBvciByZW9yZGVyZWQsIGFzIHdlbGwgYXMgbWlub3IgYWRqdXN0bWVudHMgdG8gYHBhZGF0YV9pbml0YC5cblxuVGhlcmVmb3JlLCBJJ20gc2V0dGluZyBgV29ydGhGdXp6aW5nPWZhbHNlYC4gVGhlIHJlYXNvbmluZyBpcyB0aGF0IHRoZSBwYXRjaCAqcmVtb3ZlcyogYHBjcnlwdGAgYW5kIGl0cyByZWxhdGVkIGZ1bmN0aW9uYWxpdHkuIEl0IGRvZXMgKm5vdCogaW50cm9kdWNlIG5ldyBmdW5jdGlvbmFsaXR5IHRvIHRlc3QuXG5cbkkgd2lsbCBjYWxsIGBzZXQtcmVzdWx0c2Agd2l0aCBgV29ydGhGdXp6aW5nPWZhbHNlYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjE5MDgsIk91dHB1dFRva2VucyI6NzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDI1LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTRUMDM6MzU6MjguMTkwMDYzMDEyWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNDUwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZW1vdmVzIHRoZSBwY3J5cHQgcGFyYWxsZWwgY3J5cHRvIGVuZ2luZSBhbmQgdGhlIGFzc29jaWF0ZWQgc2VyaWFsaXplZCBqb2Igc3VwcG9ydCBmcm9tIHBhZGF0YS4gSXQgaXMgYSBwdXJlIGNsZWFudXAvcmVtb3ZhbCBwYXRjaCBhbmQgZG9lcyBub3QgaW50cm9kdWNlIGFueSBuZXcgZnVuY3Rpb25hbCBjb2RlIG9yIGxvZ2ljIHRoYXQgcmVxdWlyZXMgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlbW92ZXMgdGhlIHBjcnlwdCBwYXJhbGxlbCBjcnlwdG8gZW5naW5lIGFuZCB0aGUgYXNzb2NpYXRlZCBzZXJpYWxpemVkIGpvYiBzdXBwb3J0IGZyb20gcGFkYXRhLiBJdCBpcyBhIHB1cmUgY2xlYW51cC9yZW1vdmFsIHBhdGNoIGFuZCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IG5ldyBmdW5jdGlvbmFsIGNvZGUgb3IgbG9naWMgdGhhdCByZXF1aXJlcyBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowmrqln[0].run-triage(0) Phase: Succeeded StartedAt: 2026-07-14 03:04:33 +0000 UTC FinishedAt: 2026-07-14 03:35:30 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDAzOjM1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlbW92ZXMgdGhlIHBjcnlwdCBwYXJhbGxlbCBjcnlwdG8gZW5naW5lIGFuZCB0aGUgYXNzb2NpYXRlZCBzZXJpYWxpemVkIGpvYiBzdXBwb3J0IGZyb20gcGFkYXRhLiBJdCBpcyBhIHB1cmUgY2xlYW51cC9yZW1vdmFsIHBhdGNoIGFuZCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IG5ldyBmdW5jdGlvbmFsIGNvZGUgb3IgbG9naWMgdGhhdCByZXF1aXJlcyBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNCAwMzozNTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGNjMzk0Y2M5Y2UxZGNjYzQxNWJjOGZjNjVmZTY1NjdhYThjNzUzNDRcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEp1bCAxNCAwMzozNToxMiAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3BhZGF0YS5yc3QgYi9Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3BhZGF0YS5yc3RcbmluZGV4IDA1YjczYzZjMTA1ZjA0Li5kN2RjN2UzMzA1NGRiZCAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vY29yZS1hcGkvcGFkYXRhLnJzdFxuJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9wYWRhdGEucnN0XG5AQCAtNywxNTIgJiM0Mzs3LDExIEBAIFRoZSBwYWRhdGEgcGFyYWxsZWwgZXhlY3V0aW9uIG1lY2hhbmlzbVxuIDpEYXRlOiBNYXkgMjAyMFxuIFxuIFBhZGF0YSBpcyBhIG1lY2hhbmlzbSBieSB3aGljaCB0aGUga2VybmVsIGNhbiBmYXJtIGpvYnMgb3V0IHRvIGJlIGRvbmUgaW5cbi1wYXJhbGxlbCBvbiBtdWx0aXBsZSBDUFVzIHdoaWxlIG9wdGlvbmFsbHkgcmV0YWluaW5nIHRoZWlyIG9yZGVyaW5nLlxuJiM0MztwYXJhbGxlbCBvbiBtdWx0aXBsZSBDUFVzIHdoaWxlIGNvb3JkaW5hdGluZyBiZXR3ZWVuIHRocmVhZHMuXG4gXG4tSXQgd2FzIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGZvciBJUHNlYywgd2hpY2ggbmVlZHMgdG8gcGVyZm9ybSBlbmNyeXB0aW9uIGFuZFxuLWRlY3J5cHRpb24gb24gbGFyZ2UgbnVtYmVycyBvZiBwYWNrZXRzIHdpdGhvdXQgcmVvcmRlcmluZyB0aG9zZSBwYWNrZXRzLiAgVGhpc1xuLWlzIGN1cnJlbnRseSB0aGUgc29sZSBjb25zdW1lciBvZiBwYWRhdGEmIzM5O3Mgc2VyaWFsaXplZCBqb2Igc3VwcG9ydC5cbi1cbi1QYWRhdGEgYWxzbyBzdXBwb3J0cyBtdWx0aXRocmVhZGVkIGpvYnMsIHNwbGl0dGluZyB1cCB0aGUgam9iIGV2ZW5seSB3aGlsZSBsb2FkXG4mIzQzO1BhZGF0YSBzdXBwb3J0cyBtdWx0aXRocmVhZGVkIGpvYnMsIHNwbGl0dGluZyB1cCB0aGUgam9iIGV2ZW5seSB3aGlsZSBsb2FkXG4gYmFsYW5jaW5nIGFuZCBjb29yZGluYXRpbmcgYmV0d2VlbiB0aHJlYWRzLlxuIFxuLVJ1bm5pbmcgU2VyaWFsaXplZCBKb2JzXG4tPT09PT09PT09PT09PT09PT09PT09PT1cbi1cbi1Jbml0aWFsaXppbmdcbi0tLS0tLS0tLS0tLS1cbi1cbi1UaGUgZmlyc3Qgc3RlcCBpbiB1c2luZyBwYWRhdGEgdG8gcnVuIHNlcmlhbGl6ZWQgam9icyBpcyB0byBzZXQgdXAgYVxuLXBhZGF0YV9pbnN0YW5jZSBzdHJ1Y3R1cmUgZm9yIG92ZXJhbGwgY29udHJvbCBvZiBob3cgam9icyBhcmUgdG8gYmUgcnVuOjpcbi1cbi0gICAgI2luY2x1ZGUgXHUwMDNjbGludXgvcGFkYXRhLmhcdTAwM2Vcbi1cbi0gICAgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGFkYXRhX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpO1xuLVxuLSYjMzk7bmFtZSYjMzk7IHNpbXBseSBpZGVudGlmaWVzIHRoZSBpbnN0YW5jZS5cbi1cbi1UaGVuLCBjb21wbGV0ZSBwYWRhdGEgaW5pdGlhbGl6YXRpb24gYnkgYWxsb2NhdGluZyBhIHBhZGF0YV9zaGVsbDo6XG4tXG4tICAgc3RydWN0IHBhZGF0YV9zaGVsbCAqcGFkYXRhX2FsbG9jX3NoZWxsKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KTtcbi1cbi1BIHBhZGF0YV9zaGVsbCBpcyB1c2VkIHRvIHN1Ym1pdCBhIGpvYiB0byBwYWRhdGEgYW5kIGFsbG93cyBhIHNlcmllcyBvZiBzdWNoXG4tam9icyB0byBiZSBzZXJpYWxpemVkIGluZGVwZW5kZW50bHkuICBBIHBhZGF0YV9pbnN0YW5jZSBtYXkgaGF2ZSBvbmUgb3IgbW9yZVxuLXBhZGF0YV9zaGVsbHMgYXNzb2NpYXRlZCB3aXRoIGl0LCBlYWNoIGFsbG93aW5nIGEgc2VwYXJhdGUgc2VyaWVzIG9mIGpvYnMuXG4tXG4tTW9kaWZ5aW5nIGNwdW1hc2tzXG4tLS0tLS0tLS0tLS0tLS0tLS0tXG4tXG4tVGhlIENQVXMgdXNlZCB0byBydW4gam9icyBjYW4gYmUgY2hhbmdlZCBpbiB0d28gd2F5cywgcHJvZ3JhbW1hdGljYWxseSB3aXRoXG4tcGFkYXRhX3NldF9jcHVtYXNrKCkgb3IgdmlhIHN5c2ZzLiAgVGhlIGZvcm1lciBpcyBkZWZpbmVkOjpcbi1cbi0gICAgaW50IHBhZGF0YV9zZXRfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdW1hc2tfdHlwZSxcbi1cdFx0XHQgICBjcHVtYXNrX3Zhcl90IGNwdW1hc2spO1xuLVxuLUhlcmUgY3B1bWFza190eXBlIGlzIG9uZSBvZiBQQURBVEFfQ1BVX1BBUkFMTEVMIG9yIFBBREFUQV9DUFVfU0VSSUFMLCB3aGVyZSBhXG4tcGFyYWxsZWwgY3B1bWFzayBkZXNjcmliZXMgd2hpY2ggcHJvY2Vzc29ycyB3aWxsIGJlIHVzZWQgdG8gZXhlY3V0ZSBqb2JzXG4tc3VibWl0dGVkIHRvIHRoaXMgaW5zdGFuY2UgaW4gcGFyYWxsZWwgYW5kIGEgc2VyaWFsIGNwdW1hc2sgZGVmaW5lcyB3aGljaFxuLXByb2Nlc3NvcnMgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZCBhcyB0aGUgc2VyaWFsaXphdGlvbiBjYWxsYmFjayBwcm9jZXNzb3IuXG4tY3B1bWFzayBzcGVjaWZpZXMgdGhlIG5ldyBjcHVtYXNrIHRvIHVzZS5cbi1cbi1UaGVyZSBtYXkgYmUgc3lzZnMgZmlsZXMgZm9yIGFuIGluc3RhbmNlJiMzOTtzIGNwdW1hc2tzLiAgRm9yIGV4YW1wbGUsIHBjcnlwdCYjMzk7c1xuLWxpdmUgaW4gL3N5cy9rZXJuZWwvcGNyeXB0L1x1MDAzY2luc3RhbmNlLW5hbWVcdTAwM2UuICBXaXRoaW4gYW4gaW5zdGFuY2UmIzM5O3MgZGlyZWN0b3J5XG4tdGhlcmUgYXJlIHR3byBmaWxlcywgcGFyYWxsZWxfY3B1bWFzayBhbmQgc2VyaWFsX2NwdW1hc2ssIGFuZCBlaXRoZXIgY3B1bWFza1xuLW1heSBiZSBjaGFuZ2VkIGJ5IGVjaG9pbmcgYSBiaXRtYXNrIGludG8gdGhlIGZpbGUsIGZvciBleGFtcGxlOjpcbi1cbi0gICAgZWNobyBmIFx1MDAzZSAvc3lzL2tlcm5lbC9wY3J5cHQvcGVuY3J5cHQvcGFyYWxsZWxfY3B1bWFza1xuLVxuLVJlYWRpbmcgb25lIG9mIHRoZXNlIGZpbGVzIHNob3dzIHRoZSB1c2VyLXN1cHBsaWVkIGNwdW1hc2ssIHdoaWNoIG1heSBiZVxuLWRpZmZlcmVudCBmcm9tIHRoZSAmIzM5O3VzYWJsZSYjMzk7IGNwdW1hc2suXG4tXG4tUGFkYXRhIG1haW50YWlucyB0d28gcGFpcnMgb2YgY3B1bWFza3MgaW50ZXJuYWxseSwgdGhlIHVzZXItc3VwcGxpZWQgY3B1bWFza3Ncbi1hbmQgdGhlICYjMzk7dXNhYmxlJiMzOTsgY3B1bWFza3MuICAoRWFjaCBwYWlyIGNvbnNpc3RzIG9mIGEgcGFyYWxsZWwgYW5kIGEgc2VyaWFsXG4tY3B1bWFzay4pICBUaGUgdXNlci1zdXBwbGllZCBjcHVtYXNrcyBkZWZhdWx0IHRvIGFsbCBwb3NzaWJsZSBDUFVzIG9uIGluc3RhbmNlXG4tYWxsb2NhdGlvbiBhbmQgbWF5IGJlIGNoYW5nZWQgYXMgYWJvdmUuICBUaGUgdXNhYmxlIGNwdW1hc2tzIGFyZSBhbHdheXMgYVxuLXN1YnNldCBvZiB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrcyBhbmQgY29udGFpbiBvbmx5IHRoZSBvbmxpbmUgQ1BVcyBpbiB0aGVcbi11c2VyLXN1cHBsaWVkIG1hc2tzOyB0aGVzZSBhcmUgdGhlIGNwdW1hc2tzIHBhZGF0YSBhY3R1YWxseSB1c2VzLiAgU28gaXQgaXNcbi1sZWdhbCB0byBzdXBwbHkgYSBjcHVtYXNrIHRvIHBhZGF0YSB0aGF0IGNvbnRhaW5zIG9mZmxpbmUgQ1BVcy4gIE9uY2UgYW5cbi1vZmZsaW5lIENQVSBpbiB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrIGNvbWVzIG9ubGluZSwgcGFkYXRhIGlzIGdvaW5nIHRvIHVzZVxuLWl0LlxuLVxuLUNoYW5naW5nIHRoZSBDUFUgbWFza3MgYXJlIGV4cGVuc2l2ZSBvcGVyYXRpb25zLCBzbyBpdCBzaG91bGQgbm90IGJlIGRvbmUgd2l0aFxuLWdyZWF0IGZyZXF1ZW5jeS5cbi1cbi1SdW5uaW5nIEEgSm9iXG4tLS0tLS0tLS0tLS0tLVxuLVxuLUFjdHVhbGx5IHN1Ym1pdHRpbmcgd29yayB0byB0aGUgcGFkYXRhIGluc3RhbmNlIHJlcXVpcmVzIHRoZSBjcmVhdGlvbiBvZiBhXG4tcGFkYXRhX3ByaXYgc3RydWN0dXJlLCB3aGljaCByZXByZXNlbnRzIG9uZSBqb2I6OlxuLVxuLSAgICBzdHJ1Y3QgcGFkYXRhX3ByaXYge1xuLSAgICAgICAgLyogT3RoZXIgc3R1ZmYgaGVyZS4uLiAqL1xuLVx0dm9pZCAgICAgICAgICAgICAgICAgICAgKCpwYXJhbGxlbCkoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpO1xuLVx0dm9pZCAgICAgICAgICAgICAgICAgICAgKCpzZXJpYWwpKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTtcbi0gICAgfTtcbi1cbi1UaGlzIHN0cnVjdHVyZSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgZW1iZWRkZWQgd2l0aGluIHNvbWUgbGFyZ2VyXG4tc3RydWN0dXJlIHNwZWNpZmljIHRvIHRoZSB3b3JrIHRvIGJlIGRvbmUuICBNb3N0IG9mIGl0cyBmaWVsZHMgYXJlIHByaXZhdGUgdG9cbi1wYWRhdGEsIGJ1dCB0aGUgc3RydWN0dXJlIHNob3VsZCBiZSB6ZXJvZWQgYXQgaW5pdGlhbGlzYXRpb24gdGltZSwgYW5kIHRoZVxuLXBhcmFsbGVsKCkgYW5kIHNlcmlhbCgpIGZ1bmN0aW9ucyBzaG91bGQgYmUgcHJvdmlkZWQuICBUaG9zZSBmdW5jdGlvbnMgd2lsbFxuLWJlIGNhbGxlZCBpbiB0aGUgcHJvY2VzcyBvZiBnZXR0aW5nIHRoZSB3b3JrIGRvbmUgYXMgd2Ugd2lsbCBzZWVcbi1tb21lbnRhcmlseS5cbi1cbi1UaGUgc3VibWlzc2lvbiBvZiB0aGUgam9iIGlzIGRvbmUgd2l0aDo6XG4tXG4tICAgIGludCBwYWRhdGFfZG9fcGFyYWxsZWwoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsXG4tXHRcdCAgICAgICAgICAgc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEsIGludCAqY2JfY3B1KTtcbi1cbi1UaGUgcHMgYW5kIHBhZGF0YSBzdHJ1Y3R1cmVzIG11c3QgYmUgc2V0IHVwIGFzIGRlc2NyaWJlZCBhYm92ZTsgY2JfY3B1XG4tcG9pbnRzIHRvIHRoZSBwcmVmZXJyZWQgQ1BVIHRvIGJlIHVzZWQgZm9yIHRoZSBmaW5hbCBjYWxsYmFjayB3aGVuIHRoZSBqb2IgaXNcbi1kb25lOyBpdCBtdXN0IGJlIGluIHRoZSBjdXJyZW50IGluc3RhbmNlJiMzOTtzIENQVSBtYXNrIChpZiBub3QgdGhlIGNiX2NwdSBwb2ludGVyXG4taXMgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgQ1BVIGFjdHVhbGx5IGNob3NlbikuICBUaGUgcmV0dXJuIHZhbHVlIGZyb21cbi1wYWRhdGFfZG9fcGFyYWxsZWwoKSBpcyB6ZXJvIG9uIHN1Y2Nlc3MsIGluZGljYXRpbmcgdGhhdCB0aGUgam9iIGlzIGluXG4tcHJvZ3Jlc3MuIC1FQlVTWSBtZWFucyB0aGF0IHNvbWVib2R5LCBzb21ld2hlcmUgZWxzZSBpcyBtZXNzaW5nIHdpdGggdGhlXG4taW5zdGFuY2UmIzM5O3MgQ1BVIG1hc2ssIHdoaWxlIC1FSU5WQUwgaXMgYSBjb21wbGFpbnQgYWJvdXQgY2JfY3B1IG5vdCBiZWluZyBpbiB0aGVcbi1zZXJpYWwgY3B1bWFzaywgbm8gb25saW5lIENQVXMgaW4gdGhlIHBhcmFsbGVsIG9yIHNlcmlhbCBjcHVtYXNrcywgb3IgYSBzdG9wcGVkXG4taW5zdGFuY2UuXG4tXG4tRWFjaCBqb2Igc3VibWl0dGVkIHRvIHBhZGF0YV9kb19wYXJhbGxlbCgpIHdpbGwsIGluIHR1cm4sIGJlIHBhc3NlZCB0b1xuLWV4YWN0bHkgb25lIGNhbGwgdG8gdGhlIGFib3ZlLW1lbnRpb25lZCBwYXJhbGxlbCgpIGZ1bmN0aW9uLCBvbiBvbmUgQ1BVLCBzb1xuLXRydWUgcGFyYWxsZWxpc20gaXMgYWNoaWV2ZWQgYnkgc3VibWl0dGluZyBtdWx0aXBsZSBqb2JzLiAgcGFyYWxsZWwoKSBydW5zIHdpdGhcbi1zb2Z0d2FyZSBpbnRlcnJ1cHRzIGRpc2FibGVkIGFuZCB0aHVzIGNhbm5vdCBzbGVlcC4gIFRoZSBwYXJhbGxlbCgpXG4tZnVuY3Rpb24gZ2V0cyB0aGUgcGFkYXRhX3ByaXYgc3RydWN0dXJlIHBvaW50ZXIgYXMgaXRzIGxvbmUgcGFyYW1ldGVyO1xuLWluZm9ybWF0aW9uIGFib3V0IHRoZSBhY3R1YWwgd29yayB0byBiZSBkb25lIGlzIHByb2JhYmx5IG9idGFpbmVkIGJ5IHVzaW5nXG4tY29udGFpbmVyX29mKCkgdG8gZmluZCB0aGUgZW5jbG9zaW5nIHN0cnVjdHVyZS5cbi1cbi1Ob3RlIHRoYXQgcGFyYWxsZWwoKSBoYXMgbm8gcmV0dXJuIHZhbHVlOyB0aGUgcGFkYXRhIHN1YnN5c3RlbSBhc3N1bWVzIHRoYXRcbi1wYXJhbGxlbCgpIHdpbGwgdGFrZSByZXNwb25zaWJpbGl0eSBmb3IgdGhlIGpvYiBmcm9tIHRoaXMgcG9pbnQuICBUaGUgam9iXG4tbmVlZCBub3QgYmUgY29tcGxldGVkIGR1cmluZyB0aGlzIGNhbGwsIGJ1dCwgaWYgcGFyYWxsZWwoKSBsZWF2ZXMgd29ya1xuLW91dHN0YW5kaW5nLCBpdCBzaG91bGQgYmUgcHJlcGFyZWQgdG8gYmUgY2FsbGVkIGFnYWluIHdpdGggYSBuZXcgam9iIGJlZm9yZVxuLXRoZSBwcmV2aW91cyBvbmUgY29tcGxldGVzLlxuLVxuLVNlcmlhbGl6aW5nIEpvYnNcbi0tLS0tLS0tLS0tLS0tLS0tXG4tXG4tV2hlbiBhIGpvYiBkb2VzIGNvbXBsZXRlLCBwYXJhbGxlbCgpIChvciB3aGF0ZXZlciBmdW5jdGlvbiBhY3R1YWxseSBmaW5pc2hlc1xuLXRoZSB3b3JrKSBzaG91bGQgaW5mb3JtIHBhZGF0YSBvZiB0aGUgZmFjdCB3aXRoIGEgY2FsbCB0bzo6XG4tXG4tICAgIHZvaWQgcGFkYXRhX2RvX3NlcmlhbChzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSk7XG4tXG4tQXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLCBwYWRhdGFfZG9fc2VyaWFsKCkgd2lsbCB0cmlnZ2VyIGEgY2FsbCB0byB0aGVcbi1zZXJpYWwoKSBmdW5jdGlvbiBpbiB0aGUgcGFkYXRhX3ByaXYgc3RydWN0dXJlLiAgVGhhdCBjYWxsIHdpbGwgaGFwcGVuIG9uXG4tdGhlIENQVSByZXF1ZXN0ZWQgaW4gdGhlIGluaXRpYWwgY2FsbCB0byBwYWRhdGFfZG9fcGFyYWxsZWwoKTsgaXQsIHRvbywgaXNcbi1ydW4gd2l0aCBsb2NhbCBzb2Z0d2FyZSBpbnRlcnJ1cHRzIGRpc2FibGVkLlxuLU5vdGUgdGhhdCB0aGlzIGNhbGwgbWF5IGJlIGRlZmVycmVkIGZvciBhIHdoaWxlIHNpbmNlIHRoZSBwYWRhdGEgY29kZSB0YWtlc1xuLXBhaW5zIHRvIGVuc3VyZSB0aGF0IGpvYnMgYXJlIGNvbXBsZXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlXG4tc3VibWl0dGVkLlxuLVxuLURlc3Ryb3lpbmdcbi0tLS0tLS0tLS0tXG4tXG4tQ2xlYW5pbmcgdXAgYSBwYWRhdGEgaW5zdGFuY2UgcHJlZGljdGFibHkgaW52b2x2ZXMgY2FsbGluZyB0aGUgdHdvIGZyZWVcbi1mdW5jdGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBhbGxvY2F0aW9uIGluIHJldmVyc2U6OlxuLVxuLSAgICB2b2lkIHBhZGF0YV9mcmVlX3NoZWxsKHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzKTtcbi0gICAgdm9pZCBwYWRhdGFfZnJlZShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCk7XG4tXG4tSXQgaXMgdGhlIHVzZXImIzM5O3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIGFsbCBvdXRzdGFuZGluZyBqb2JzIGFyZSBjb21wbGV0ZVxuLWJlZm9yZSBhbnkgb2YgdGhlIGFib3ZlIGFyZSBjYWxsZWQuXG4tXG4gUnVubmluZyBNdWx0aXRocmVhZGVkIEpvYnNcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuIFxuZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlNcbmluZGV4IDgwNmJkMmQ4MGQxNTM1Li4yNjBiM2JkYzc2MTQ4YyAxMDA2NDRcbi0tLSBhL01BSU5UQUlORVJTXG4mIzQzOyYjNDM7JiM0MzsgYi9NQUlOVEFJTkVSU1xuQEAgLTIxMDg1LDEzICYjNDM7MjEwODUsNiBAQCBMOlx0bmV0ZGV2QHZnZXIua2VybmVsLm9yZ1xuIFM6XHRNYWludGFpbmVkXG4gRjpcdGRyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9wY25ldDMyLmNcbiBcbi1QQ1JZUFQgUEFSQUxMRUwgQ1JZUFRPIEVOR0lORVxuLU06XHRTdGVmZmVuIEtsYXNzZXJ0IFx1MDAzY3N0ZWZmZW4ua2xhc3NlcnRAc2VjdW5ldC5jb21cdTAwM2Vcbi1MOlx0bGludXgtY3J5cHRvQHZnZXIua2VybmVsLm9yZ1xuLVM6XHRNYWludGFpbmVkXG4tRjpcdGNyeXB0by9wY3J5cHQuY1xuLUY6XHRpbmNsdWRlL2NyeXB0by9wY3J5cHQuaFxuLVxuIFBEUyBEU0MgVklSVElPIERBVEEgUEFUSCBBQ0NFTEVSQVRPUlxuIFI6XHRCcmV0dCBDcmVlbGV5IFx1MDAzY2JyZXR0LmNyZWVsZXlAYW1kLmNvbVx1MDAzZVxuIEY6XHRkcml2ZXJzL3ZkcGEvcGRzL1xuZGlmZiAtLWdpdCBhL2FyY2gvbG9vbmdhcmNoL2NvbmZpZ3MvbG9vbmdzb24zMl9kZWZjb25maWcgYi9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uMzJfZGVmY29uZmlnXG5pbmRleCA3YzhmMDE1MTNlZDI3Yy4uY2Y5N2Y0NDkzNTczNmYgMTAwNjQ0XG4tLS0gYS9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uMzJfZGVmY29uZmlnXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uMzJfZGVmY29uZmlnXG5AQCAtMTA2Myw3ICYjNDM7MTA2Myw2IEBAIENPTkZJR19TRUNVUklUWV9ZQU1BPXlcbiBDT05GSUdfREVGQVVMVF9TRUNVUklUWV9EQUM9eVxuIENPTkZJR19DUllQVE9fVVNFUj1tXG4gQ09ORklHX0NSWVBUT19TRUxGVEVTVFM9eVxuLUNPTkZJR19DUllQVE9fUENSWVBUPW1cbiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tXG4gQ09ORklHX0NSWVBUT19BTlVCSVM9bVxuIENPTkZJR19DUllQVE9fQkxPV0ZJU0g9bVxuZGlmZiAtLWdpdCBhL2FyY2gvbG9vbmdhcmNoL2NvbmZpZ3MvbG9vbmdzb242NF9kZWZjb25maWcgYi9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uNjRfZGVmY29uZmlnXG5pbmRleCA4ZTM5MDZkM2JkNzBjYS4uZDBlY2U3OTIwZjIxNTggMTAwNjQ0XG4tLS0gYS9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uNjRfZGVmY29uZmlnXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uNjRfZGVmY29uZmlnXG5AQCAtMTA5Niw3ICYjNDM7MTA5Niw2IEBAIENPTkZJR19TRUNVUklUWV9ZQU1BPXlcbiBDT05GSUdfREVGQVVMVF9TRUNVUklUWV9EQUM9eVxuIENPTkZJR19DUllQVE9fVVNFUj1tXG4gQ09ORklHX0NSWVBUT19TRUxGVEVTVFM9eVxuLUNPTkZJR19DUllQVE9fUENSWVBUPW1cbiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tXG4gQ09ORklHX0NSWVBUT19BTlVCSVM9bVxuIENPTkZJR19DUllQVE9fQkxPV0ZJU0g9bVxuZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jb25maWdzL2RlYnVnX2RlZmNvbmZpZyBiL2FyY2gvczM5MC9jb25maWdzL2RlYnVnX2RlZmNvbmZpZ1xuaW5kZXggNTQ2MzdiZTg3ZmI3MzUuLjE1ZjUxY2I5MjRkYmYwIDEwMDY0NFxuLS0tIGEvYXJjaC9zMzkwL2NvbmZpZ3MvZGVidWdfZGVmY29uZmlnXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3MzOTAvY29uZmlncy9kZWJ1Z19kZWZjb25maWdcbkBAIC03NjUsNyAmIzQzOzc2NSw2IEBAIENPTkZJR19DUllQVE9fVVNFUj1tXG4gQ09ORklHX0NSWVBUT19TRUxGVEVTVFM9eVxuIENPTkZJR19DUllQVE9fU0VMRlRFU1RTX0ZVTEw9eVxuIENPTkZJR19DUllQVE9fTlVMTD15XG4tQ09ORklHX0NSWVBUT19QQ1JZUFQ9bVxuIENPTkZJR19DUllQVE9fQ1JZUFREPW1cbiBDT05GSUdfQ1JZUFRPX0JFTkNITUFSSz1tXG4gQ09ORklHX0NSWVBUT19ESD1tXG5kaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NvbmZpZ3MvZGVmY29uZmlnIGIvYXJjaC9zMzkwL2NvbmZpZ3MvZGVmY29uZmlnXG5pbmRleCA1ZjUxMTRhMjUzY2Y3Yy4uODgyNTdmZjNjMmM2YWEgMTAwNjQ0XG4tLS0gYS9hcmNoL3MzOTAvY29uZmlncy9kZWZjb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvczM5MC9jb25maWdzL2RlZmNvbmZpZ1xuQEAgLTc0OSw3ICYjNDM7NzQ5LDYgQEAgQ09ORklHX0NSWVBUT19GSVBTPXlcbiBDT05GSUdfQ1JZUFRPX1VTRVI9bVxuIENPTkZJR19DUllQVE9fU0VMRlRFU1RTPXlcbiBDT05GSUdfQ1JZUFRPX05VTEw9eVxuLUNPTkZJR19DUllQVE9fUENSWVBUPW1cbiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tXG4gQ09ORklHX0NSWVBUT19CRU5DSE1BUks9bVxuIENPTkZJR19DUllQVE9fREg9bVxuZGlmZiAtLWdpdCBhL2NyeXB0by9LY29uZmlnIGIvY3J5cHRvL0tjb25maWdcbmluZGV4IGYxZTM3MjE5NTI3MzE2Li4yMjhhN2FjOWYwNjNhMiAxMDA2NDRcbi0tLSBhL2NyeXB0by9LY29uZmlnXG4mIzQzOyYjNDM7JiM0MzsgYi9jcnlwdG8vS2NvbmZpZ1xuQEAgLTIwMSwxNiAmIzQzOzIwMSw2IEBAIGNvbmZpZyBDUllQVE9fTlVMTFxuIFx0aGVscFxuIFx0ICBUaGVzZSBhcmUgJiMzOTtOdWxsJiMzOTsgYWxnb3JpdGhtcywgdXNlZCBieSBJUHNlYywgd2hpY2ggZG8gbm90aGluZy5cbiBcbi1jb25maWcgQ1JZUFRPX1BDUllQVFxuLVx0dHJpc3RhdGUgXCYjMzQ7UGFyYWxsZWwgY3J5cHRvIGVuZ2luZVwmIzM0O1xuLVx0ZGVwZW5kcyBvbiBTTVBcbi1cdHNlbGVjdCBQQURBVEFcbi1cdHNlbGVjdCBDUllQVE9fTUFOQUdFUlxuLVx0c2VsZWN0IENSWVBUT19BRUFEXG4tXHRoZWxwXG4tXHQgIFRoaXMgY29udmVydHMgYW4gYXJiaXRyYXJ5IGNyeXB0byBhbGdvcml0aG0gaW50byBhIHBhcmFsbGVsXG4tXHQgIGFsZ29yaXRobSB0aGF0IGV4ZWN1dGVzIGluIGtlcm5lbCB0aHJlYWRzLlxuLVxuIGNvbmZpZyBDUllQVE9fQ1JZUFREXG4gXHR0cmlzdGF0ZSBcJiMzNDtTb2Z0d2FyZSBhc3luYyBjcnlwdG8gZGFlbW9uXCYjMzQ7XG4gXHRzZWxlY3QgQ1JZUFRPX0FFQURcbmRpZmYgLS1naXQgYS9jcnlwdG8vTWFrZWZpbGUgYi9jcnlwdG8vTWFrZWZpbGVcbmluZGV4IDgzODZkNTVhOTc1NWU3Li4yZTQ4N2M5NDZlNjNkNyAxMDA2NDRcbi0tLSBhL2NyeXB0by9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvY3J5cHRvL01ha2VmaWxlXG5AQCAtMTIwLDcgJiM0MzsxMjAsNiBAQCBDRkxBR1NfYWVnaXMxMjgtbmVvbi1pbm5lci5vICYjNDM7PSAkKGFlZ2lzMTI4LWNmbGFncy15KVxuIGFlZ2lzMTI4LSQoQ09ORklHX0NSWVBUT19BRUdJUzEyOF9TSU1EKSAmIzQzOz0gYWVnaXMxMjgtbmVvbi5vIGFlZ2lzMTI4LW5lb24taW5uZXIub1xuIGVuZGlmXG4gXG4tb2JqLSQoQ09ORklHX0NSWVBUT19QQ1JZUFQpICYjNDM7PSBwY3J5cHQub1xuIG9iai0kKENPTkZJR19DUllQVE9fQ1JZUFREKSAmIzQzOz0gY3J5cHRkLm9cbiBvYmotJChDT05GSUdfQ1JZUFRPX0RFUykgJiM0Mzs9IGRlc19nZW5lcmljLm9cbiBvYmotJChDT05GSUdfQ1JZUFRPX0JMT1dGSVNIKSAmIzQzOz0gYmxvd2Zpc2hfZ2VuZXJpYy5vXG5kaWZmIC0tZ2l0IGEvY3J5cHRvL3BjcnlwdC5jIGIvY3J5cHRvL3BjcnlwdC5jXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDlmMzcyNDQyOTgxZTY1Li4wMDAwMDAwMDAwMDAwMFxuLS0tIGEvY3J5cHRvL3BjcnlwdC5jXG4mIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsXG5AQCAtMSwzOTQgJiM0MzswLDAgQEBcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tLypcbi0gKiBwY3J5cHQgLSBQYXJhbGxlbCBjcnlwdG8gd3JhcHBlci5cbi0gKlxuLSAqIENvcHlyaWdodCAoQykgMjAwOSBzZWN1bmV0IFNlY3VyaXR5IE5ldHdvcmtzIEFHXG4tICogQ29weXJpZ2h0IChDKSAyMDA5IFN0ZWZmZW4gS2xhc3NlcnQgXHUwMDNjc3RlZmZlbi5rbGFzc2VydEBzZWN1bmV0LmNvbVx1MDAzZVxuLSAqL1xuLVxuLSNpbmNsdWRlIFx1MDAzY2NyeXB0by9hbGdhcGkuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2NyeXB0by9pbnRlcm5hbC9hZWFkLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9hdG9taWMuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2Vyci5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvaW5pdC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbW9kdWxlLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9rb2JqZWN0LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9jcHUuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2NyeXB0by9wY3J5cHQuaFx1MDAzZVxuLVxuLXN0YXRpYyBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwZW5jcnlwdDtcbi1zdGF0aWMgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGRlY3J5cHQ7XG4tc3RhdGljIHN0cnVjdCBrc2V0ICAgICAgICAgICAqcGNyeXB0X2tzZXQ7XG4tXG4tc3RydWN0IHBjcnlwdF9pbnN0YW5jZV9jdHgge1xuLVx0c3RydWN0IGNyeXB0b19hZWFkX3NwYXduIHNwYXduO1xuLVx0c3RydWN0IHBhZGF0YV9zaGVsbCAqcHNlbmM7XG4tXHRzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwc2RlYztcbi1cdGF0b21pY190IHRmbV9jb3VudDtcbi19O1xuLVxuLXN0cnVjdCBwY3J5cHRfYWVhZF9jdHgge1xuLVx0c3RydWN0IGNyeXB0b19hZWFkICpjaGlsZDtcbi1cdHVuc2lnbmVkIGludCBjYl9jcHU7XG4tfTtcbi1cbi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4ICpwY3J5cHRfdGZtX2ljdHgoXG4tXHRzdHJ1Y3QgY3J5cHRvX2FlYWQgKnRmbSlcbi17XG4tXHRyZXR1cm4gYWVhZF9pbnN0YW5jZV9jdHgoYWVhZF9hbGdfaW5zdGFuY2UodGZtKSk7XG4tfVxuLVxuLXN0YXRpYyBpbnQgcGNyeXB0X2FlYWRfc2V0a2V5KHN0cnVjdCBjcnlwdG9fYWVhZCAqcGFyZW50LFxuLVx0XHRcdCAgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pXG4te1xuLVx0c3RydWN0IHBjcnlwdF9hZWFkX2N0eCAqY3R4ID0gY3J5cHRvX2FlYWRfY3R4KHBhcmVudCk7XG4tXG4tXHRyZXR1cm4gY3J5cHRvX2FlYWRfc2V0a2V5KGN0eC1cdTAwM2VjaGlsZCwga2V5LCBrZXlsZW4pO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX3NldGF1dGhzaXplKHN0cnVjdCBjcnlwdG9fYWVhZCAqcGFyZW50LFxuLVx0XHRcdFx0ICAgdW5zaWduZWQgaW50IGF1dGhzaXplKVxuLXtcbi1cdHN0cnVjdCBwY3J5cHRfYWVhZF9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eChwYXJlbnQpO1xuLVxuLVx0cmV0dXJuIGNyeXB0b19hZWFkX3NldGF1dGhzaXplKGN0eC1cdTAwM2VjaGlsZCwgYXV0aHNpemUpO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBwY3J5cHRfYWVhZF9zZXJpYWwoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpXG4te1xuLVx0c3RydWN0IHBjcnlwdF9yZXF1ZXN0ICpwcmVxID0gcGNyeXB0X3BhZGF0YV9yZXF1ZXN0KHBhZGF0YSk7XG4tXHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBwY3J5cHRfcmVxdWVzdF9jdHgocHJlcSk7XG4tXG4tXHRhZWFkX3JlcXVlc3RfY29tcGxldGUocmVxLVx1MDAzZWJhc2UuZGF0YSwgcGFkYXRhLVx1MDAzZWluZm8pO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBwY3J5cHRfYWVhZF9kb25lKHZvaWQgKmRhdGEsIGludCBlcnIpXG4te1xuLVx0c3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxID0gZGF0YTtcbi1cdHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IGFlYWRfcmVxdWVzdF9jdHgocmVxKTtcbi1cdHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhID0gcGNyeXB0X3JlcXVlc3RfcGFkYXRhKHByZXEpO1xuLVxuLVx0aWYgKGVyciA9PSAtRUlOUFJPR1JFU1MpXG4tXHRcdHJldHVybjtcbi1cbi1cdHBhZGF0YS1cdTAwM2VpbmZvID0gZXJyO1xuLVxuLVx0cGFkYXRhX2RvX3NlcmlhbChwYWRhdGEpO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBwY3J5cHRfYWVhZF9lbmMoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpXG4te1xuLVx0c3RydWN0IHBjcnlwdF9yZXF1ZXN0ICpwcmVxID0gcGNyeXB0X3BhZGF0YV9yZXF1ZXN0KHBhZGF0YSk7XG4tXHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBwY3J5cHRfcmVxdWVzdF9jdHgocHJlcSk7XG4tXHRpbnQgcmV0O1xuLVxuLVx0cmV0ID0gY3J5cHRvX2FlYWRfZW5jcnlwdChyZXEpO1xuLVxuLVx0aWYgKHJldCA9PSAtRUlOUFJPR1JFU1MgfHwgcmV0ID09IC1FQlVTWSlcbi1cdFx0cmV0dXJuO1xuLVxuLVx0cGFkYXRhLVx1MDAzZWluZm8gPSByZXQ7XG4tXHRwYWRhdGFfZG9fc2VyaWFsKHBhZGF0YSk7XG4tfVxuLVxuLXN0YXRpYyBpbnQgcGNyeXB0X2FlYWRfZW5jcnlwdChzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEpXG4te1xuLVx0aW50IGVycjtcbi1cdHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IGFlYWRfcmVxdWVzdF9jdHgocmVxKTtcbi1cdHN0cnVjdCBhZWFkX3JlcXVlc3QgKmNyZXEgPSBwY3J5cHRfcmVxdWVzdF9jdHgocHJlcSk7XG4tXHRzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSA9IHBjcnlwdF9yZXF1ZXN0X3BhZGF0YShwcmVxKTtcbi1cdHN0cnVjdCBjcnlwdG9fYWVhZCAqYWVhZCA9IGNyeXB0b19hZWFkX3JlcXRmbShyZXEpO1xuLVx0c3RydWN0IHBjcnlwdF9hZWFkX2N0eCAqY3R4ID0gY3J5cHRvX2FlYWRfY3R4KGFlYWQpO1xuLVx0dTMyIGZsYWdzID0gYWVhZF9yZXF1ZXN0X2ZsYWdzKHJlcSk7XG4tXHRzdHJ1Y3QgcGNyeXB0X2luc3RhbmNlX2N0eCAqaWN0eDtcbi1cbi1cdGljdHggPSBwY3J5cHRfdGZtX2ljdHgoYWVhZCk7XG4tXG4tXHRtZW1zZXQocGFkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHBhZGF0YV9wcml2KSk7XG4tXG4tXHRwYWRhdGEtXHUwMDNlcGFyYWxsZWwgPSBwY3J5cHRfYWVhZF9lbmM7XG4tXHRwYWRhdGEtXHUwMDNlc2VyaWFsID0gcGNyeXB0X2FlYWRfc2VyaWFsO1xuLVxuLVx0YWVhZF9yZXF1ZXN0X3NldF90Zm0oY3JlcSwgY3R4LVx1MDAzZWNoaWxkKTtcbi1cdGFlYWRfcmVxdWVzdF9zZXRfY2FsbGJhY2soY3JlcSwgZmxhZ3MgXHUwMDI2IH5DUllQVE9fVEZNX1JFUV9NQVlfU0xFRVAsXG4tXHRcdFx0XHQgIHBjcnlwdF9hZWFkX2RvbmUsIHJlcSk7XG4tXHRhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KGNyZXEsIHJlcS1cdTAwM2VzcmMsIHJlcS1cdTAwM2Vkc3QsXG4tXHRcdFx0ICAgICAgIHJlcS1cdTAwM2VjcnlwdGxlbiwgcmVxLVx1MDAzZWl2KTtcbi1cdGFlYWRfcmVxdWVzdF9zZXRfYWQoY3JlcSwgcmVxLVx1MDAzZWFzc29jbGVuKTtcbi1cbi1cdGVyciA9IHBhZGF0YV9kb19wYXJhbGxlbChpY3R4LVx1MDAzZXBzZW5jLCBwYWRhdGEsIFx1MDAyNmN0eC1cdTAwM2VjYl9jcHUpO1xuLVx0aWYgKCFlcnIpXG4tXHRcdHJldHVybiAtRUlOUFJPR1JFU1M7XG4tXHRpZiAoZXJyID09IC1FQlVTWSkge1xuLVx0XHQvKiB0cnkgbm9uLXBhcmFsbGVsIG1vZGUgKi9cbi1cdFx0YWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhjcmVxLCBmbGFncywgcmVxLVx1MDAzZWJhc2UuY29tcGxldGUsXG4tXHRcdFx0XHRcdCAgcmVxLVx1MDAzZWJhc2UuZGF0YSk7XG4tXHRcdHJldHVybiBjcnlwdG9fYWVhZF9lbmNyeXB0KGNyZXEpO1xuLVx0fVxuLVxuLVx0cmV0dXJuIGVycjtcbi19XG4tXG4tc3RhdGljIHZvaWQgcGNyeXB0X2FlYWRfZGVjKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKVxuLXtcbi1cdHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IHBjcnlwdF9wYWRhdGFfcmVxdWVzdChwYWRhdGEpO1xuLVx0c3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxID0gcGNyeXB0X3JlcXVlc3RfY3R4KHByZXEpO1xuLVx0aW50IHJldDtcbi1cbi1cdHJldCA9IGNyeXB0b19hZWFkX2RlY3J5cHQocmVxKTtcbi1cbi1cdGlmIChyZXQgPT0gLUVJTlBST0dSRVNTIHx8IHJldCA9PSAtRUJVU1kpXG4tXHRcdHJldHVybjtcbi1cbi1cdHBhZGF0YS1cdTAwM2VpbmZvID0gcmV0O1xuLVx0cGFkYXRhX2RvX3NlcmlhbChwYWRhdGEpO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX2RlY3J5cHQoc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxKVxuLXtcbi1cdGludCBlcnI7XG4tXHRzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnByZXEgPSBhZWFkX3JlcXVlc3RfY3R4KHJlcSk7XG4tXHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpjcmVxID0gcGNyeXB0X3JlcXVlc3RfY3R4KHByZXEpO1xuLVx0c3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEgPSBwY3J5cHRfcmVxdWVzdF9wYWRhdGEocHJlcSk7XG4tXHRzdHJ1Y3QgY3J5cHRvX2FlYWQgKmFlYWQgPSBjcnlwdG9fYWVhZF9yZXF0Zm0ocmVxKTtcbi1cdHN0cnVjdCBwY3J5cHRfYWVhZF9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eChhZWFkKTtcbi1cdHUzMiBmbGFncyA9IGFlYWRfcmVxdWVzdF9mbGFncyhyZXEpO1xuLVx0c3RydWN0IHBjcnlwdF9pbnN0YW5jZV9jdHggKmljdHg7XG4tXG4tXHRpY3R4ID0gcGNyeXB0X3RmbV9pY3R4KGFlYWQpO1xuLVxuLVx0bWVtc2V0KHBhZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBwYWRhdGFfcHJpdikpO1xuLVxuLVx0cGFkYXRhLVx1MDAzZXBhcmFsbGVsID0gcGNyeXB0X2FlYWRfZGVjO1xuLVx0cGFkYXRhLVx1MDAzZXNlcmlhbCA9IHBjcnlwdF9hZWFkX3NlcmlhbDtcbi1cbi1cdGFlYWRfcmVxdWVzdF9zZXRfdGZtKGNyZXEsIGN0eC1cdTAwM2VjaGlsZCk7XG4tXHRhZWFkX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKGNyZXEsIGZsYWdzIFx1MDAyNiB+Q1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQLFxuLVx0XHRcdFx0ICBwY3J5cHRfYWVhZF9kb25lLCByZXEpO1xuLVx0YWVhZF9yZXF1ZXN0X3NldF9jcnlwdChjcmVxLCByZXEtXHUwMDNlc3JjLCByZXEtXHUwMDNlZHN0LFxuLVx0XHRcdCAgICAgICByZXEtXHUwMDNlY3J5cHRsZW4sIHJlcS1cdTAwM2Vpdik7XG4tXHRhZWFkX3JlcXVlc3Rfc2V0X2FkKGNyZXEsIHJlcS1cdTAwM2Vhc3NvY2xlbik7XG4tXG4tXHRlcnIgPSBwYWRhdGFfZG9fcGFyYWxsZWwoaWN0eC1cdTAwM2Vwc2RlYywgcGFkYXRhLCBcdTAwMjZjdHgtXHUwMDNlY2JfY3B1KTtcbi1cdGlmICghZXJyKVxuLVx0XHRyZXR1cm4gLUVJTlBST0dSRVNTO1xuLVx0aWYgKGVyciA9PSAtRUJVU1kpIHtcbi1cdFx0LyogdHJ5IG5vbi1wYXJhbGxlbCBtb2RlICovXG4tXHRcdGFlYWRfcmVxdWVzdF9zZXRfY2FsbGJhY2soY3JlcSwgZmxhZ3MsIHJlcS1cdTAwM2ViYXNlLmNvbXBsZXRlLFxuLVx0XHRcdFx0XHQgIHJlcS1cdTAwM2ViYXNlLmRhdGEpO1xuLVx0XHRyZXR1cm4gY3J5cHRvX2FlYWRfZGVjcnlwdChjcmVxKTtcbi1cdH1cbi1cbi1cdHJldHVybiBlcnI7XG4tfVxuLVxuLXN0YXRpYyBpbnQgcGNyeXB0X2FlYWRfaW5pdF90Zm0oc3RydWN0IGNyeXB0b19hZWFkICp0Zm0pXG4te1xuLVx0aW50IGNwdV9pbmRleDtcbi1cdHN0cnVjdCBhZWFkX2luc3RhbmNlICppbnN0ID0gYWVhZF9hbGdfaW5zdGFuY2UodGZtKTtcbi1cdHN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4ICppY3R4ID0gYWVhZF9pbnN0YW5jZV9jdHgoaW5zdCk7XG4tXHRzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgodGZtKTtcbi1cdHN0cnVjdCBjcnlwdG9fYWVhZCAqY2lwaGVyO1xuLVxuLVx0Y3B1X2luZGV4ID0gKHVuc2lnbmVkIGludClhdG9taWNfaW5jX3JldHVybihcdTAwMjZpY3R4LVx1MDAzZXRmbV9jb3VudCkgJVxuLVx0XHQgICAgY3B1bWFza193ZWlnaHQoY3B1X29ubGluZV9tYXNrKTtcbi1cbi1cdGN0eC1cdTAwM2VjYl9jcHUgPSBjcHVtYXNrX250aChjcHVfaW5kZXgsIGNwdV9vbmxpbmVfbWFzayk7XG4tXHRjaXBoZXIgPSBjcnlwdG9fc3Bhd25fYWVhZChcdTAwMjZpY3R4LVx1MDAzZXNwYXduKTtcbi1cbi1cdGlmIChJU19FUlIoY2lwaGVyKSlcbi1cdFx0cmV0dXJuIFBUUl9FUlIoY2lwaGVyKTtcbi1cbi1cdGN0eC1cdTAwM2VjaGlsZCA9IGNpcGhlcjtcbi1cdGNyeXB0b19hZWFkX3NldF9yZXFzaXplKHRmbSwgc2l6ZW9mKHN0cnVjdCBwY3J5cHRfcmVxdWVzdCkgJiM0Mztcbi1cdFx0XHRcdCAgICAgc2l6ZW9mKHN0cnVjdCBhZWFkX3JlcXVlc3QpICYjNDM7XG4tXHRcdFx0XHQgICAgIGNyeXB0b19hZWFkX3JlcXNpemUoY2lwaGVyKSk7XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4tc3RhdGljIHZvaWQgcGNyeXB0X2FlYWRfZXhpdF90Zm0oc3RydWN0IGNyeXB0b19hZWFkICp0Zm0pXG4te1xuLVx0c3RydWN0IHBjcnlwdF9hZWFkX2N0eCAqY3R4ID0gY3J5cHRvX2FlYWRfY3R4KHRmbSk7XG4tXG4tXHRjcnlwdG9fZnJlZV9hZWFkKGN0eC1cdTAwM2VjaGlsZCk7XG4tfVxuLVxuLXN0YXRpYyB2b2lkIHBjcnlwdF9mcmVlKHN0cnVjdCBhZWFkX2luc3RhbmNlICppbnN0KVxuLXtcbi1cdHN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4ICpjdHggPSBhZWFkX2luc3RhbmNlX2N0eChpbnN0KTtcbi1cbi1cdGNyeXB0b19kcm9wX2FlYWQoXHUwMDI2Y3R4LVx1MDAzZXNwYXduKTtcbi1cdHBhZGF0YV9mcmVlX3NoZWxsKGN0eC1cdTAwM2Vwc2RlYyk7XG4tXHRwYWRhdGFfZnJlZV9zaGVsbChjdHgtXHUwMDNlcHNlbmMpO1xuLVx0a2ZyZWUoaW5zdCk7XG4tfVxuLVxuLXN0YXRpYyBpbnQgcGNyeXB0X2luaXRfaW5zdGFuY2Uoc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdCxcbi1cdFx0XHRcdHN0cnVjdCBjcnlwdG9fYWxnICphbGcpXG4te1xuLVx0aWYgKHNucHJpbnRmKGluc3QtXHUwMDNlYWxnLmNyYV9kcml2ZXJfbmFtZSwgQ1JZUFRPX01BWF9BTEdfTkFNRSxcbi1cdFx0ICAgICBcJiMzNDtwY3J5cHQoJXMpXCYjMzQ7LCBhbGctXHUwMDNlY3JhX2RyaXZlcl9uYW1lKSBcdTAwM2U9IENSWVBUT19NQVhfQUxHX05BTUUpXG4tXHRcdHJldHVybiAtRU5BTUVUT09MT05HO1xuLVxuLVx0bWVtY3B5KGluc3QtXHUwMDNlYWxnLmNyYV9uYW1lLCBhbGctXHUwMDNlY3JhX25hbWUsIENSWVBUT19NQVhfQUxHX05BTUUpO1xuLVxuLVx0aW5zdC1cdTAwM2VhbGcuY3JhX3ByaW9yaXR5ID0gYWxnLVx1MDAzZWNyYV9wcmlvcml0eSAmIzQzOyAxMDA7XG4tXHRpbnN0LVx1MDAzZWFsZy5jcmFfYmxvY2tzaXplID0gYWxnLVx1MDAzZWNyYV9ibG9ja3NpemU7XG4tXHRpbnN0LVx1MDAzZWFsZy5jcmFfYWxpZ25tYXNrID0gYWxnLVx1MDAzZWNyYV9hbGlnbm1hc2s7XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4tc3RhdGljIGludCBwY3J5cHRfY3JlYXRlX2FlYWQoc3RydWN0IGNyeXB0b190ZW1wbGF0ZSAqdG1wbCwgc3RydWN0IHJ0YXR0ciAqKnRiLFxuLVx0XHRcdCAgICAgIHN0cnVjdCBjcnlwdG9fYXR0cl90eXBlICphbGd0KVxuLXtcbi1cdHN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4ICpjdHg7XG4tXHRzdHJ1Y3QgYWVhZF9pbnN0YW5jZSAqaW5zdDtcbi1cdHN0cnVjdCBhZWFkX2FsZyAqYWxnO1xuLVx0dTMyIG1hc2sgPSBjcnlwdG9fYWxndF9pbmhlcml0ZWRfbWFzayhhbGd0KTtcbi1cdGludCBlcnI7XG4tXG4tXHRpbnN0ID0ga3phbGxvYyhzaXplb2YoKmluc3QpICYjNDM7IHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7XG4tXHRpZiAoIWluc3QpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuLVxuLVx0ZXJyID0gLUVOT01FTTtcbi1cbi1cdGN0eCA9IGFlYWRfaW5zdGFuY2VfY3R4KGluc3QpO1xuLVx0Y3R4LVx1MDAzZXBzZW5jID0gcGFkYXRhX2FsbG9jX3NoZWxsKHBlbmNyeXB0KTtcbi1cdGlmICghY3R4LVx1MDAzZXBzZW5jKVxuLVx0XHRnb3RvIGVycl9mcmVlX2luc3Q7XG4tXG4tXHRjdHgtXHUwMDNlcHNkZWMgPSBwYWRhdGFfYWxsb2Nfc2hlbGwocGRlY3J5cHQpO1xuLVx0aWYgKCFjdHgtXHUwMDNlcHNkZWMpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfaW5zdDtcbi1cbi1cdGVyciA9IGNyeXB0b19ncmFiX2FlYWQoXHUwMDI2Y3R4LVx1MDAzZXNwYXduLCBhZWFkX2NyeXB0b19pbnN0YW5jZShpbnN0KSxcbi1cdFx0XHQgICAgICAgY3J5cHRvX2F0dHJfYWxnX25hbWUodGJbMV0pLCAwLCBtYXNrKTtcbi1cdGlmIChlcnIpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfaW5zdDtcbi1cbi1cdGFsZyA9IGNyeXB0b19zcGF3bl9hZWFkX2FsZyhcdTAwMjZjdHgtXHUwMDNlc3Bhd24pO1xuLVx0ZXJyID0gcGNyeXB0X2luaXRfaW5zdGFuY2UoYWVhZF9jcnlwdG9faW5zdGFuY2UoaW5zdCksIFx1MDAyNmFsZy1cdTAwM2ViYXNlKTtcbi1cdGlmIChlcnIpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfaW5zdDtcbi1cbi1cdGluc3QtXHUwMDNlYWxnLmJhc2UuY3JhX2ZsYWdzIHw9IENSWVBUT19BTEdfQVNZTkM7XG4tXG4tXHRpbnN0LVx1MDAzZWFsZy5pdnNpemUgPSBjcnlwdG9fYWVhZF9hbGdfaXZzaXplKGFsZyk7XG4tXHRpbnN0LVx1MDAzZWFsZy5tYXhhdXRoc2l6ZSA9IGNyeXB0b19hZWFkX2FsZ19tYXhhdXRoc2l6ZShhbGcpO1xuLVxuLVx0aW5zdC1cdTAwM2VhbGcuYmFzZS5jcmFfY3R4c2l6ZSA9IHNpemVvZihzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4KTtcbi1cbi1cdGluc3QtXHUwMDNlYWxnLmluaXQgPSBwY3J5cHRfYWVhZF9pbml0X3RmbTtcbi1cdGluc3QtXHUwMDNlYWxnLmV4aXQgPSBwY3J5cHRfYWVhZF9leGl0X3RmbTtcbi1cbi1cdGluc3QtXHUwMDNlYWxnLnNldGtleSA9IHBjcnlwdF9hZWFkX3NldGtleTtcbi1cdGluc3QtXHUwMDNlYWxnLnNldGF1dGhzaXplID0gcGNyeXB0X2FlYWRfc2V0YXV0aHNpemU7XG4tXHRpbnN0LVx1MDAzZWFsZy5lbmNyeXB0ID0gcGNyeXB0X2FlYWRfZW5jcnlwdDtcbi1cdGluc3QtXHUwMDNlYWxnLmRlY3J5cHQgPSBwY3J5cHRfYWVhZF9kZWNyeXB0O1xuLVxuLVx0aW5zdC1cdTAwM2VmcmVlID0gcGNyeXB0X2ZyZWU7XG4tXG4tXHRlcnIgPSBhZWFkX3JlZ2lzdGVyX2luc3RhbmNlKHRtcGwsIGluc3QpO1xuLVx0aWYgKGVycikge1xuLWVycl9mcmVlX2luc3Q6XG4tXHRcdHBjcnlwdF9mcmVlKGluc3QpO1xuLVx0fVxuLVx0cmV0dXJuIGVycjtcbi19XG4tXG4tc3RhdGljIGludCBwY3J5cHRfY3JlYXRlKHN0cnVjdCBjcnlwdG9fdGVtcGxhdGUgKnRtcGwsIHN0cnVjdCBydGF0dHIgKip0Yilcbi17XG4tXHRzdHJ1Y3QgY3J5cHRvX2F0dHJfdHlwZSAqYWxndDtcbi1cbi1cdGFsZ3QgPSBjcnlwdG9fZ2V0X2F0dHJfdHlwZSh0Yik7XG4tXHRpZiAoSVNfRVJSKGFsZ3QpKVxuLVx0XHRyZXR1cm4gUFRSX0VSUihhbGd0KTtcbi1cbi1cdHN3aXRjaCAoYWxndC1cdTAwM2V0eXBlIFx1MDAyNiBhbGd0LVx1MDAzZW1hc2sgXHUwMDI2IENSWVBUT19BTEdfVFlQRV9NQVNLKSB7XG4tXHRjYXNlIENSWVBUT19BTEdfVFlQRV9BRUFEOlxuLVx0XHRyZXR1cm4gcGNyeXB0X2NyZWF0ZV9hZWFkKHRtcGwsIHRiLCBhbGd0KTtcbi1cdH1cbi1cbi1cdHJldHVybiAtRUlOVkFMO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBjcnlwdF9zeXNmc19hZGQoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsIGNvbnN0IGNoYXIgKm5hbWUpXG4te1xuLVx0aW50IHJldDtcbi1cbi1cdHBpbnN0LVx1MDAzZWtvYmoua3NldCA9IHBjcnlwdF9rc2V0O1xuLVx0cmV0ID0ga29iamVjdF9hZGQoXHUwMDI2cGluc3QtXHUwMDNla29iaiwgTlVMTCwgXCYjMzQ7JXNcJiMzNDssIG5hbWUpO1xuLVx0aWYgKCFyZXQpXG4tXHRcdGtvYmplY3RfdWV2ZW50KFx1MDAyNnBpbnN0LVx1MDAzZWtvYmosIEtPQkpfQUREKTtcbi1cbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLXN0YXRpYyBpbnQgcGNyeXB0X2luaXRfcGFkYXRhKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKipwaW5zdCwgY29uc3QgY2hhciAqbmFtZSlcbi17XG4tXHRpbnQgcmV0ID0gLUVOT01FTTtcbi1cbi1cdCpwaW5zdCA9IHBhZGF0YV9hbGxvYyhuYW1lKTtcbi1cdGlmICghKnBpbnN0KVxuLVx0XHRyZXR1cm4gcmV0O1xuLVxuLVx0cmV0ID0gcGNyeXB0X3N5c2ZzX2FkZCgqcGluc3QsIG5hbWUpO1xuLVx0aWYgKHJldClcbi1cdFx0cGFkYXRhX2ZyZWUoKnBpbnN0KTtcbi1cbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLXN0YXRpYyBzdHJ1Y3QgY3J5cHRvX3RlbXBsYXRlIHBjcnlwdF90bXBsID0ge1xuLVx0Lm5hbWUgPSBcJiMzNDtwY3J5cHRcJiMzNDssXG4tXHQuY3JlYXRlID0gcGNyeXB0X2NyZWF0ZSxcbi1cdC5tb2R1bGUgPSBUSElTX01PRFVMRSxcbi19O1xuLVxuLXN0YXRpYyBpbnQgX19pbml0IHBjcnlwdF9pbml0KHZvaWQpXG4te1xuLVx0aW50IGVyciA9IC1FTk9NRU07XG4tXG4tXHRwY3J5cHRfa3NldCA9IGtzZXRfY3JlYXRlX2FuZF9hZGQoXCYjMzQ7cGNyeXB0XCYjMzQ7LCBOVUxMLCBrZXJuZWxfa29iaik7XG4tXHRpZiAoIXBjcnlwdF9rc2V0KVxuLVx0XHRnb3RvIGVycjtcbi1cbi1cdGVyciA9IHBjcnlwdF9pbml0X3BhZGF0YShcdTAwMjZwZW5jcnlwdCwgXCYjMzQ7cGVuY3J5cHRcJiMzNDspO1xuLVx0aWYgKGVycilcbi1cdFx0Z290byBlcnJfdW5yZWdfa3NldDtcbi1cbi1cdGVyciA9IHBjcnlwdF9pbml0X3BhZGF0YShcdTAwMjZwZGVjcnlwdCwgXCYjMzQ7cGRlY3J5cHRcJiMzNDspO1xuLVx0aWYgKGVycilcbi1cdFx0Z290byBlcnJfZGVpbml0X3BlbmNyeXB0O1xuLVxuLVx0cmV0dXJuIGNyeXB0b19yZWdpc3Rlcl90ZW1wbGF0ZShcdTAwMjZwY3J5cHRfdG1wbCk7XG4tXG4tZXJyX2RlaW5pdF9wZW5jcnlwdDpcbi1cdHBhZGF0YV9mcmVlKHBlbmNyeXB0KTtcbi1lcnJfdW5yZWdfa3NldDpcbi1cdGtzZXRfdW5yZWdpc3RlcihwY3J5cHRfa3NldCk7XG4tZXJyOlxuLVx0cmV0dXJuIGVycjtcbi19XG4tXG4tc3RhdGljIHZvaWQgX19leGl0IHBjcnlwdF9leGl0KHZvaWQpXG4te1xuLVx0Y3J5cHRvX3VucmVnaXN0ZXJfdGVtcGxhdGUoXHUwMDI2cGNyeXB0X3RtcGwpO1xuLVxuLVx0cGFkYXRhX2ZyZWUocGVuY3J5cHQpO1xuLVx0cGFkYXRhX2ZyZWUocGRlY3J5cHQpO1xuLVxuLVx0a3NldF91bnJlZ2lzdGVyKHBjcnlwdF9rc2V0KTtcbi19XG4tXG4tbW9kdWxlX2luaXQocGNyeXB0X2luaXQpO1xuLW1vZHVsZV9leGl0KHBjcnlwdF9leGl0KTtcbi1cbi1NT0RVTEVfTElDRU5TRShcJiMzNDtHUExcJiMzNDspO1xuLU1PRFVMRV9BVVRIT1IoXCYjMzQ7U3RlZmZlbiBLbGFzc2VydCBcdTAwM2NzdGVmZmVuLmtsYXNzZXJ0QHNlY3VuZXQuY29tXHUwMDNlXCYjMzQ7KTtcbi1NT0RVTEVfREVTQ1JJUFRJT04oXCYjMzQ7UGFyYWxsZWwgY3J5cHRvIHdyYXBwZXJcJiMzNDspO1xuLU1PRFVMRV9BTElBU19DUllQVE8oXCYjMzQ7cGNyeXB0XCYjMzQ7KTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2NyeXB0by9wY3J5cHQuaCBiL2luY2x1ZGUvY3J5cHRvL3BjcnlwdC5oXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDIzNGQ3Y2YzY2Y1ZWFkLi4wMDAwMDAwMDAwMDAwMFxuLS0tIGEvaW5jbHVkZS9jcnlwdG8vcGNyeXB0LmhcbiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGxcbkBAIC0xLDM5ICYjNDM7MCwwIEBAXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuLS8qXG4tICogcGNyeXB0IC0gUGFyYWxsZWwgY3J5cHRvIGVuZ2luZS5cbi0gKlxuLSAqIENvcHlyaWdodCAoQykgMjAwOSBzZWN1bmV0IFNlY3VyaXR5IE5ldHdvcmtzIEFHXG4tICogQ29weXJpZ2h0IChDKSAyMDA5IFN0ZWZmZW4gS2xhc3NlcnQgXHUwMDNjc3RlZmZlbi5rbGFzc2VydEBzZWN1bmV0LmNvbVx1MDAzZVxuLSAqL1xuLVxuLSNpZm5kZWYgX0NSWVBUT19QQ1JZUFRfSFxuLSNkZWZpbmUgX0NSWVBUT19QQ1JZUFRfSFxuLVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2NvbnRhaW5lcl9vZi5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvY3J5cHRvLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9wYWRhdGEuaFx1MDAzZVxuLVxuLXN0cnVjdCBwY3J5cHRfcmVxdWVzdCB7XG4tXHRzdHJ1Y3QgcGFkYXRhX3ByaXZcdHBhZGF0YTtcbi1cdHZvaWRcdFx0XHQqZGF0YTtcbi1cdHZvaWRcdFx0XHQqX19jdHhbXSBDUllQVE9fTUlOQUxJR05fQVRUUjtcbi19O1xuLVxuLXN0YXRpYyBpbmxpbmUgdm9pZCAqcGNyeXB0X3JlcXVlc3RfY3R4KHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcmVxKVxuLXtcbi1cdHJldHVybiByZXEtXHUwMDNlX19jdHg7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmVcbi1zdHJ1Y3QgcGFkYXRhX3ByaXYgKnBjcnlwdF9yZXF1ZXN0X3BhZGF0YShzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnJlcSlcbi17XG4tXHRyZXR1cm4gXHUwMDI2cmVxLVx1MDAzZXBhZGF0YTtcbi19XG4tXG4tc3RhdGljIGlubGluZVxuLXN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcGNyeXB0X3BhZGF0YV9yZXF1ZXN0KHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKVxuLXtcbi1cdHJldHVybiBjb250YWluZXJfb2YocGFkYXRhLCBzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QsIHBhZGF0YSk7XG4tfVxuLVxuLSNlbmRpZlxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGFkYXRhLmggYi9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oXG5pbmRleCBiNjIzMmJlYTZlZGY1OS4uZWE0NWVhNjgwY2I3OTcgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oXG5AQCAtMTIsMTEyICYjNDM7MTIsOCBAQFxuICNpZm5kZWYgUEFEQVRBX0hcbiAjZGVmaW5lIFBBREFUQV9IXG4gXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvcmVmY291bnQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2NvbXBpbGVyX3R5cGVzLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC93b3JrcXVldWUuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NwaW5sb2NrLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9saXN0LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9rb2JqZWN0LmhcdTAwM2Vcbi1cbi0jZGVmaW5lIFBBREFUQV9DUFVfU0VSSUFMICAgMHgwMVxuLSNkZWZpbmUgUEFEQVRBX0NQVV9QQVJBTExFTCAweDAyXG4tXG4tLyoqXG4tICogc3RydWN0IHBhZGF0YV9wcml2IC0gUmVwcmVzZW50cyBvbmUgam9iXG4tICpcbi0gKiBAbGlzdDogTGlzdCBlbnRyeSwgdG8gYXR0YWNoIHRvIHRoZSBwYWRhdGEgbGlzdHMuXG4tICogQHBkOiBQb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBjb250cm9sIHN0cnVjdHVyZS5cbi0gKiBAY2JfY3B1OiBDYWxsYmFjayBjcHUgZm9yIHNlcmlhbGl6YXRpb29uLlxuLSAqIEBzZXFfbnI6IFNlcXVlbmNlIG51bWJlciBvZiB0aGUgcGFyYWxsZWxpemVkIGRhdGEgb2JqZWN0LlxuLSAqIEBpbmZvOiBVc2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGFyYWxsZWwgdG8gdGhlIHNlcmlhbCBmdW5jdGlvbi5cbi0gKiBAcGFyYWxsZWw6IFBhcmFsbGVsIGV4ZWN1dGlvbiBmdW5jdGlvbi5cbi0gKiBAc2VyaWFsOiBTZXJpYWwgY29tcGxldGUgZnVuY3Rpb24uXG4tICovXG4tc3RydWN0IHBhZGF0YV9wcml2IHtcbi1cdHN0cnVjdCBsaXN0X2hlYWRcdGxpc3Q7XG4tXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YVx0KnBkO1xuLVx0aW50XHRcdFx0Y2JfY3B1O1xuLVx0dW5zaWduZWQgaW50XHRcdHNlcV9ucjtcbi1cdGludFx0XHRcdGluZm87XG4tXHR2b2lkICAgICAgICAgICAgICAgICAgICAoKnBhcmFsbGVsKShzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSk7XG4tXHR2b2lkICAgICAgICAgICAgICAgICAgICAoKnNlcmlhbCkoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpO1xuLX07XG4tXG4tLyoqXG4tICogc3RydWN0IHBhZGF0YV9saXN0IC0gb25lIHBlciB3b3JrIHR5cGUgcGVyIENQVVxuLSAqXG4tICogQGxpc3Q6IExpc3QgaGVhZC5cbi0gKiBAbG9jazogTGlzdCBsb2NrLlxuLSAqL1xuLXN0cnVjdCBwYWRhdGFfbGlzdCB7XG4tXHRzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBsaXN0O1xuLVx0c3BpbmxvY2tfdCAgICAgICAgICAgICAgbG9jaztcbi19O1xuLVxuLS8qKlxuLSogc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUgLSBUaGUgcGVyY3B1IHBhZGF0YSBzZXJpYWwgcXVldWVcbi0qXG4tKiBAc2VyaWFsOiBMaXN0IHRvIHdhaXQgZm9yIHNlcmlhbGl6YXRpb24gYWZ0ZXIgcmVvcmRlcmluZy5cbi0qIEB3b3JrOiB3b3JrIHN0cnVjdCBmb3Igc2VyaWFsaXphdGlvbi5cbi0qIEBwZDogQmFja3BvaW50ZXIgdG8gdGhlIGludGVybmFsIGNvbnRyb2wgc3RydWN0dXJlLlxuLSovXG4tc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUge1xuLSAgICAgICBzdHJ1Y3QgcGFkYXRhX2xpc3QgICAgc2VyaWFsO1xuLSAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgd29yaztcbi0gICAgICAgc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkO1xuLX07XG4tXG4tLyoqXG4tICogc3RydWN0IHBhZGF0YV9jcHVtYXNrIC0gVGhlIGNwdW1hc2tzIGZvciB0aGUgcGFyYWxsZWwvc2VyaWFsIHdvcmtlcnNcbi0gKlxuLSAqIEBwY3B1OiBjcHVtYXNrIGZvciB0aGUgcGFyYWxsZWwgd29ya2Vycy5cbi0gKiBAY2JjcHU6IGNwdW1hc2sgZm9yIHRoZSBzZXJpYWwgKGNhbGxiYWNrKSB3b3JrZXJzLlxuLSAqL1xuLXN0cnVjdCBwYWRhdGFfY3B1bWFzayB7XG4tXHRjcHVtYXNrX3Zhcl90XHRwY3B1O1xuLVx0Y3B1bWFza192YXJfdFx0Y2JjcHU7XG4tfTtcbi1cbi0vKipcbi0gKiBzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAtIEludGVybmFsIGNvbnRyb2wgc3RydWN0dXJlLCBjb3ZlcnMgZXZlcnl0aGluZ1xuLSAqIHRoYXQgZGVwZW5kcyBvbiB0aGUgY3B1bWFzayBpbiB1c2UuXG4tICpcbi0gKiBAcHM6IHBhZGF0YV9zaGVsbCBvYmplY3QuXG4tICogQHJlb3JkZXJfbGlzdDogcGVyY3B1IHJlb3JkZXIgbGlzdHNcbi0gKiBAc3F1ZXVlOiBwZXJjcHUgcGFkYXRhIHF1ZXVlcyB1c2VkIGZvciBzZXJpYWx1emF0aW9uLlxuLSAqIEByZWZjbnQ6IE51bWJlciBvZiBvYmplY3RzIGhvbGRpbmcgYSByZWZlcmVuY2Ugb24gdGhpcyBwYXJhbGxlbF9kYXRhLlxuLSAqIEBzZXFfbnI6IFNlcXVlbmNlIG51bWJlciBvZiB0aGUgcGFyYWxsZWxpemVkIGRhdGEgb2JqZWN0LlxuLSAqIEBwcm9jZXNzZWQ6IE51bWJlciBvZiBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RzLlxuLSAqIEBjcHU6IE5leHQgQ1BVIHRvIGJlIHByb2Nlc3NlZC5cbi0gKiBAY3B1bWFzazogVGhlIGNwdW1hc2tzIGluIHVzZSBmb3IgcGFyYWxsZWwgYW5kIHNlcmlhbCB3b3JrZXJzLlxuLSAqL1xuLXN0cnVjdCBwYXJhbGxlbF9kYXRhIHtcbi1cdHN0cnVjdCBwYWRhdGFfc2hlbGxcdFx0KnBzO1xuLVx0c3RydWN0IHBhZGF0YV9saXN0XHRcdF9fcGVyY3B1ICpyZW9yZGVyX2xpc3Q7XG4tXHRzdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZVx0X19wZXJjcHUgKnNxdWV1ZTtcbi1cdHJlZmNvdW50X3RcdFx0XHRyZWZjbnQ7XG4tXHR1bnNpZ25lZCBpbnRcdFx0XHRzZXFfbnI7XG4tXHR1bnNpZ25lZCBpbnRcdFx0XHRwcm9jZXNzZWQ7XG4tXHRpbnRcdFx0XHRcdGNwdTtcbi1cdHN0cnVjdCBwYWRhdGFfY3B1bWFza1x0XHRjcHVtYXNrO1xuLX07XG4tXG4tLyoqXG4tICogc3RydWN0IHBhZGF0YV9zaGVsbCAtIFdyYXBwZXIgYXJvdW5kIHN0cnVjdCBwYXJhbGxlbF9kYXRhLCBpdHNcbi0gKiBwdXJwb3NlIGlzIHRvIGFsbG93IHRoZSB1bmRlcmx5aW5nIGNvbnRyb2wgc3RydWN0dXJlIHRvIGJlIHJlcGxhY2VkXG4tICogb24gdGhlIGZseSB1c2luZyBSQ1UuXG4tICpcbi0gKiBAcGluc3Q6IHBhZGF0IGluc3RhbmNlLlxuLSAqIEBwZDogQWN0dWFsIHBhcmFsbGVsX2RhdGEgc3RydWN0dXJlIHdoaWNoIG1heSBiZSBzdWJzdGl0dXRlZCBvbiB0aGUgZmx5LlxuLSAqIEBvcGQ6IFBvaW50ZXIgdG8gb2xkIHBkIHRvIGJlIGZyZWVkIGJ5IHBhZGF0YV9yZXBsYWNlLlxuLSAqIEBsaXN0OiBMaXN0IGVudHJ5IGluIHBhZGF0YV9pbnN0YW5jZSBsaXN0LlxuLSAqL1xuLXN0cnVjdCBwYWRhdGFfc2hlbGwge1xuLVx0c3RydWN0IHBhZGF0YV9pbnN0YW5jZVx0XHQqcGluc3Q7XG4tXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YSBfX3JjdVx0KnBkO1xuLVx0c3RydWN0IHBhcmFsbGVsX2RhdGFcdFx0Km9wZDtcbi1cdHN0cnVjdCBsaXN0X2hlYWRcdFx0bGlzdDtcbi19O1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvdHlwZXMuaFx1MDAzZVxuIFxuIC8qKlxuICAqIHN0cnVjdCBwYWRhdGFfbXRfam9iIC0gcmVwcmVzZW50cyBvbmUgbXVsdGl0aHJlYWRlZCBqb2JcbkBAIC0xNDYsNDYgJiM0Mzs0Miw5IEBAIHN0cnVjdCBwYWRhdGFfbXRfam9iIHtcbiBcdGJvb2xcdFx0XHRudW1hX2F3YXJlO1xuIH07XG4gXG4tLyoqXG4tICogc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAtIFRoZSBvdmVyYWxsIGNvbnRyb2wgc3RydWN0dXJlLlxuLSAqXG4tICogQGNwdWhwX25vZGU6IExpbmthZ2UgZm9yIENQVSBob3RwbHVnIGNhbGxiYWNrcy5cbi0gKiBAcGFyYWxsZWxfd3E6IFRoZSB3b3JrcXVldWUgdXNlZCBmb3IgcGFyYWxsZWwgd29yay5cbi0gKiBAc2VyaWFsX3dxOiBUaGUgd29ya3F1ZXVlIHVzZWQgZm9yIHNlcmlhbCB3b3JrLlxuLSAqIEBwc2xpc3Q6IExpc3Qgb2YgcGFkYXRhX3NoZWxsIG9iamVjdHMgYXR0YWNoZWQgdG8gdGhpcyBpbnN0YW5jZS5cbi0gKiBAY3B1bWFzazogVXNlciBzdXBwbGllZCBjcHVtYXNrcyBmb3IgcGFyYWxsZWwgYW5kIHNlcmlhbCB3b3Jrcy5cbi0gKiBAdmFsaWRhdGVfY3B1bWFzazogSW50ZXJuYWwgY3B1bWFzayB1c2VkIHRvIHZhbGlkYXRlIEBjcHVtYXNrIGR1cmluZyBob3RwbHVnLlxuLSAqIEBrb2JqOiBwYWRhdGEgaW5zdGFuY2Uga2VybmVsIG9iamVjdC5cbi0gKiBAbG9jazogcGFkYXRhIGluc3RhbmNlIGxvY2suXG4tICogQGZsYWdzOiBwYWRhdGEgZmxhZ3MuXG4tICovXG4tc3RydWN0IHBhZGF0YV9pbnN0YW5jZSB7XG4tXHRzdHJ1Y3QgaGxpc3Rfbm9kZVx0XHRjcHVocF9ub2RlO1xuLVx0c3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3RcdFx0KnBhcmFsbGVsX3dxO1xuLVx0c3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3RcdFx0KnNlcmlhbF93cTtcbi1cdHN0cnVjdCBsaXN0X2hlYWRcdFx0cHNsaXN0O1xuLVx0c3RydWN0IHBhZGF0YV9jcHVtYXNrXHRcdGNwdW1hc2s7XG4tXHRjcHVtYXNrX3Zhcl90XHRcdFx0dmFsaWRhdGVfY3B1bWFzaztcbi1cdHN0cnVjdCBrb2JqZWN0ICAgICAgICAgICAgICAgICAgIGtvYmo7XG4tXHRzdHJ1Y3QgbXV0ZXhcdFx0XHQgbG9jaztcbi1cdHU4XHRcdFx0XHQgZmxhZ3M7XG4tI2RlZmluZVx0UEFEQVRBX0lOSVRcdDFcbi0jZGVmaW5lXHRQQURBVEFfUkVTRVRcdDJcbi0jZGVmaW5lXHRQQURBVEFfSU5WQUxJRFx0NFxuLX07XG4tXG4gI2lmZGVmIENPTkZJR19QQURBVEFcbiBleHRlcm4gdm9pZCBfX2luaXQgcGFkYXRhX2luaXQodm9pZCk7XG4tZXh0ZXJuIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBhZGF0YV9hbGxvYyhjb25zdCBjaGFyICpuYW1lKTtcbi1leHRlcm4gdm9pZCBwYWRhdGFfZnJlZShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCk7XG4tZXh0ZXJuIHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBhZGF0YV9hbGxvY19zaGVsbChzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCk7XG4tZXh0ZXJuIHZvaWQgcGFkYXRhX2ZyZWVfc2hlbGwoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMpO1xuLWV4dGVybiBpbnQgcGFkYXRhX2RvX3BhcmFsbGVsKHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzLFxuLVx0XHRcdCAgICAgIHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhLCBpbnQgKmNiX2NwdSk7XG4tZXh0ZXJuIHZvaWQgcGFkYXRhX2RvX3NlcmlhbChzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSk7XG4gZXh0ZXJuIHZvaWQgX19pbml0IHBhZGF0YV9kb19tdWx0aXRocmVhZGVkKHN0cnVjdCBwYWRhdGFfbXRfam9iICpqb2IpO1xuLWV4dGVybiBpbnQgcGFkYXRhX3NldF9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgY3B1bWFza190eXBlLFxuLVx0XHRcdCAgICAgIGNwdW1hc2tfdmFyX3QgY3B1bWFzayk7XG4gI2Vsc2VcbiBzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IHBhZGF0YV9pbml0KHZvaWQpIHt9XG4gc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBwYWRhdGFfZG9fbXVsdGl0aHJlYWRlZChzdHJ1Y3QgcGFkYXRhX210X2pvYiAqam9iKVxuZGlmZiAtLWdpdCBhL2tlcm5lbC9wYWRhdGEuYyBiL2tlcm5lbC9wYWRhdGEuY1xuaW5kZXggMGQzZWExYjY4YjFmNzAuLjZlYjEzMGQzMTAyNGM1IDEwMDY0NFxuLS0tIGEva2VybmVsL3BhZGF0YS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvcGFkYXRhLmNcbkBAIC0xLDYgJiM0MzsxLDYgQEBcbiAvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuIC8qXG4tICogcGFkYXRhLmMgLSBnZW5lcmljIGludGVyZmFjZSB0byBwcm9jZXNzIGRhdGEgc3RyZWFtcyBpbiBwYXJhbGxlbFxuJiM0MzsgKiBwYWRhdGEuYyAtIGdlbmVyaWMgaW50ZXJmYWNlIHRvIHJ1biBtdWx0aXRocmVhZGVkIGpvYnNcbiAgKlxuICAqIFNlZSBEb2N1bWVudGF0aW9uL2NvcmUtYXBpL3BhZGF0YS5yc3QgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICpcbkBAIC0xMSwxNyAmIzQzOzExLDE3IEBAXG4gICogQXV0aG9yOiBEYW5pZWwgSm9yZGFuIFx1MDAzY2RhbmllbC5tLmpvcmRhbkBvcmFjbGUuY29tXHUwMDNlXG4gICovXG4gXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2F0b21pYy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvY29tcGxldGlvbi5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvZXhwb3J0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jcHVtYXNrLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9lcnIuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2NwdS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2luaXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9rZXJuZWwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9saXN0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbm9kZW1hc2suaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhZGF0YS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbXV0ZXguaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zeXNmcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvcmN1cGRhdGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zcGlubG9jay5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3dvcmtxdWV1ZS5oXHUwMDNlXG4gXG4gI2RlZmluZVx0UEFEQVRBX1dPUktfT05TVEFDS1x0MVx0LyogV29yayYjMzk7cyBtZW1vcnkgaXMgb24gc3RhY2sgKi9cbiBcbkBAIC00NCwzNiAmIzQzOzQ0LDggQEAgc3RydWN0IHBhZGF0YV9tdF9qb2Jfc3RhdGUge1xuIFx0dW5zaWduZWQgbG9uZ1x0XHRjaHVua19zaXplO1xuIH07XG4gXG4tc3RhdGljIHZvaWQgcGFkYXRhX2ZyZWVfcGQoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKTtcbiBzdGF0aWMgdm9pZCBfX2luaXQgcGFkYXRhX210X2hlbHBlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspO1xuIFxuLXN0YXRpYyBpbmxpbmUgdm9pZCBwYWRhdGFfZ2V0X3BkKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZClcbi17XG4tXHRyZWZjb3VudF9pbmMoXHUwMDI2cGQtXHUwMDNlcmVmY250KTtcbi19XG4tXG4tc3RhdGljIGlubGluZSB2b2lkIHBhZGF0YV9wdXRfcGRfY250KHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCwgaW50IGNudClcbi17XG4tXHRpZiAocmVmY291bnRfc3ViX2FuZF90ZXN0KGNudCwgXHUwMDI2cGQtXHUwMDNlcmVmY250KSlcbi1cdFx0cGFkYXRhX2ZyZWVfcGQocGQpO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIHZvaWQgcGFkYXRhX3B1dF9wZChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQpXG4te1xuLVx0cGFkYXRhX3B1dF9wZF9jbnQocGQsIDEpO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBhZGF0YV9jcHVfaGFzaChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQsIHVuc2lnbmVkIGludCBzZXFfbnIpXG4te1xuLVx0Lypcbi1cdCAqIEhhc2ggdGhlIHNlcXVlbmNlIG51bWJlcnMgdG8gdGhlIGNwdXMgYnkgdGFraW5nXG4tXHQgKiBzZXFfbnIgbW9kLiBudW1iZXIgb2YgY3B1cyBpbiB1c2UuXG4tXHQgKi9cbi1cdGludCBjcHVfaW5kZXggPSBzZXFfbnIgJSBjcHVtYXNrX3dlaWdodChwZC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLVxuLVx0cmV0dXJuIGNwdW1hc2tfbnRoKGNwdV9pbmRleCwgcGQtXHUwMDNlY3B1bWFzay5wY3B1KTtcbi19XG4tXG4gc3RhdGljIHN0cnVjdCBwYWRhdGFfd29yayAqcGFkYXRhX3dvcmtfYWxsb2Modm9pZClcbiB7XG4gXHRzdHJ1Y3QgcGFkYXRhX3dvcmsgKnB3O1xuQEAgLTE0NywyNjAgJiM0MzsxMTksNiBAQCBzdGF0aWMgdm9pZCBfX2luaXQgcGFkYXRhX3dvcmtzX2ZyZWUoc3RydWN0IGxpc3RfaGVhZCAqd29ya3MpXG4gXHRzcGluX3VubG9ja19iaChcdTAwMjZwYWRhdGFfd29ya3NfbG9jayk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIHBhZGF0YV9wYXJhbGxlbF93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICpwYXJhbGxlbF93b3JrKVxuLXtcbi1cdHN0cnVjdCBwYWRhdGFfd29yayAqcHcgPSBjb250YWluZXJfb2YocGFyYWxsZWxfd29yaywgc3RydWN0IHBhZGF0YV93b3JrLFxuLVx0XHRcdFx0XHQgICAgICBwd193b3JrKTtcbi1cdHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhID0gcHctXHUwMDNlcHdfZGF0YTtcbi1cbi1cdGxvY2FsX2JoX2Rpc2FibGUoKTtcbi1cdHBhZGF0YS1cdTAwM2VwYXJhbGxlbChwYWRhdGEpO1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnBhZGF0YV93b3Jrc19sb2NrKTtcbi1cdHBhZGF0YV93b3JrX2ZyZWUocHcpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2cGFkYXRhX3dvcmtzX2xvY2spO1xuLVx0bG9jYWxfYmhfZW5hYmxlKCk7XG4tfVxuLVxuLS8qKlxuLSAqIHBhZGF0YV9kb19wYXJhbGxlbCAtIHBhZGF0YSBwYXJhbGxlbGl6YXRpb24gZnVuY3Rpb25cbi0gKlxuLSAqIEBwczogcGFkYXRhc2hlbGxcbi0gKiBAcGFkYXRhOiBvYmplY3QgdG8gYmUgcGFyYWxsZWxpemVkXG4tICogQGNiX2NwdTogcG9pbnRlciB0byB0aGUgQ1BVIHRoYXQgdGhlIHNlcmlhbGl6YXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gc2hvdWxkXG4tICogICAgICAgICAgcnVuIG9uLiAgSWYgaXQmIzM5O3Mgbm90IGluIHRoZSBzZXJpYWwgY3B1bWFzayBvZiBAcGluc3Rcbi0gKiAgICAgICAgICAoaS5lLiBjcHVtYXNrLmNiY3B1KSwgdGhpcyBmdW5jdGlvbiBzZWxlY3RzIGEgZmFsbGJhY2sgQ1BVIGFuZCBpZlxuLSAqICAgICAgICAgIG5vbmUgZm91bmQsIHJldHVybnMgLUVJTlZBTC5cbi0gKlxuLSAqIFRoZSBwYXJhbGxlbGl6YXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBydW4gd2l0aCBCSHMgb2ZmLlxuLSAqIE5vdGU6IEV2ZXJ5IG9iamVjdCB3aGljaCBpcyBwYXJhbGxlbGl6ZWQgYnkgcGFkYXRhX2RvX3BhcmFsbGVsXG4tICogbXVzdCBiZSBzZWVuIGJ5IHBhZGF0YV9kb19zZXJpYWwuXG4tICpcbi0gKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBlbHNlIG5lZ2F0aXZlIGVycm9yIGNvZGUuXG4tICovXG4taW50IHBhZGF0YV9kb19wYXJhbGxlbChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcyxcbi1cdFx0ICAgICAgIHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhLCBpbnQgKmNiX2NwdSlcbi17XG4tXHRzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCA9IHBzLVx1MDAzZXBpbnN0O1xuLVx0c3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkO1xuLVx0c3RydWN0IHBhZGF0YV93b3JrICpwdztcbi1cdGludCBjcHVfaW5kZXgsIGVycjtcbi1cbi1cdHJjdV9yZWFkX2xvY2tfYmgoKTtcbi1cbi1cdHBkID0gcmN1X2RlcmVmZXJlbmNlX2JoKHBzLVx1MDAzZXBkKTtcbi1cbi1cdGVyciA9IC1FSU5WQUw7XG4tXHRpZiAoIShwaW5zdC1cdTAwM2VmbGFncyBcdTAwMjYgUEFEQVRBX0lOSVQpIHx8IHBpbnN0LVx1MDAzZWZsYWdzIFx1MDAyNiBQQURBVEFfSU5WQUxJRClcbi1cdFx0Z290byBvdXQ7XG4tXG4tXHRpZiAoIWNwdW1hc2tfdGVzdF9jcHUoKmNiX2NwdSwgcGQtXHUwMDNlY3B1bWFzay5jYmNwdSkpIHtcbi1cdFx0aWYgKGNwdW1hc2tfZW1wdHkocGQtXHUwMDNlY3B1bWFzay5jYmNwdSkpXG4tXHRcdFx0Z290byBvdXQ7XG4tXG4tXHRcdC8qIFNlbGVjdCBhbiBhbHRlcm5hdGUgZmFsbGJhY2sgQ1BVIGFuZCBub3RpZnkgdGhlIGNhbGxlci4gKi9cbi1cdFx0Y3B1X2luZGV4ID0gKmNiX2NwdSAlIGNwdW1hc2tfd2VpZ2h0KHBkLVx1MDAzZWNwdW1hc2suY2JjcHUpO1xuLVx0XHQqY2JfY3B1ID0gY3B1bWFza19udGgoY3B1X2luZGV4LCBwZC1cdTAwM2VjcHVtYXNrLmNiY3B1KTtcbi1cdH1cbi1cbi1cdGVyciA9IC1FQlVTWTtcbi1cdGlmICgocGluc3QtXHUwMDNlZmxhZ3MgXHUwMDI2IFBBREFUQV9SRVNFVCkpXG4tXHRcdGdvdG8gb3V0O1xuLVxuLVx0cGFkYXRhX2dldF9wZChwZCk7XG4tXHRwYWRhdGEtXHUwMDNlcGQgPSBwZDtcbi1cdHBhZGF0YS1cdTAwM2VjYl9jcHUgPSAqY2JfY3B1O1xuLVxuLVx0c3Bpbl9sb2NrKFx1MDAyNnBhZGF0YV93b3Jrc19sb2NrKTtcbi1cdHBhZGF0YS1cdTAwM2VzZXFfbnIgPSAmIzQzOyYjNDM7cGQtXHUwMDNlc2VxX25yO1xuLVx0cHcgPSBwYWRhdGFfd29ya19hbGxvYygpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2cGFkYXRhX3dvcmtzX2xvY2spO1xuLVxuLVx0aWYgKCFwdykge1xuLVx0XHQvKiBNYXhpbXVtIHdvcmtzIGxpbWl0IGV4Y2VlZGVkLCBydW4gaW4gdGhlIGN1cnJlbnQgdGFzay4gKi9cbi1cdFx0cGFkYXRhLVx1MDAzZXBhcmFsbGVsKHBhZGF0YSk7XG4tXHR9XG4tXG4tXHRyY3VfcmVhZF91bmxvY2tfYmgoKTtcbi1cbi1cdGlmIChwdykge1xuLVx0XHRwYWRhdGFfd29ya19pbml0KHB3LCBwYWRhdGFfcGFyYWxsZWxfd29ya2VyLCBwYWRhdGEsIDApO1xuLVx0XHRxdWV1ZV93b3JrKHBpbnN0LVx1MDAzZXBhcmFsbGVsX3dxLCBcdTAwMjZwdy1cdTAwM2Vwd193b3JrKTtcbi1cdH1cbi1cbi1cdHJldHVybiAwO1xuLW91dDpcbi1cdHJjdV9yZWFkX3VubG9ja19iaCgpO1xuLVxuLVx0cmV0dXJuIGVycjtcbi19XG4tRVhQT1JUX1NZTUJPTChwYWRhdGFfZG9fcGFyYWxsZWwpO1xuLVxuLS8qXG4tICogcGFkYXRhX2ZpbmRfbmV4dCAtIEZpbmQgdGhlIG5leHQgb2JqZWN0IHRoYXQgbmVlZHMgc2VyaWFsaXphdGlvbi5cbi0gKlxuLSAqIFJldHVybjpcbi0gKiAqIEEgcG9pbnRlciB0byB0aGUgY29udHJvbCBzdHJ1Y3Qgb2YgdGhlIG5leHQgb2JqZWN0IHRoYXQgbmVlZHNcbi0gKiAgIHNlcmlhbGl6YXRpb24sIGlmIHByZXNlbnQgaW4gb25lIG9mIHRoZSBwZXJjcHUgcmVvcmRlciBxdWV1ZXMuXG4tICogKiBOVUxMLCBpZiB0aGUgbmV4dCBvYmplY3QgdGhhdCBuZWVkcyBzZXJpYWxpemF0aW9uIHdpbGxcbi0gKiAgIGJlIHBhcmFsbGVsIHByb2Nlc3NlZCBieSBhbm90aGVyIGNwdSBhbmQgaXMgbm90IHlldCBwcmVzZW50IGluXG4tICogICB0aGUgY3B1JiMzOTtzIHJlb3JkZXIgcXVldWUuXG4tICovXG4tc3RhdGljIHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhX2ZpbmRfbmV4dChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQsIGludCBjcHUsXG4tXHRcdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgcHJvY2Vzc2VkKVxuLXtcbi1cdHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhO1xuLVx0c3RydWN0IHBhZGF0YV9saXN0ICpyZW9yZGVyO1xuLVxuLVx0cmVvcmRlciA9IHBlcl9jcHVfcHRyKHBkLVx1MDAzZXJlb3JkZXJfbGlzdCwgY3B1KTtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZyZW9yZGVyLVx1MDAzZWxvY2spO1xuLVx0aWYgKGxpc3RfZW1wdHkoXHUwMDI2cmVvcmRlci1cdTAwM2VsaXN0KSlcbi1cdFx0Z290byBub3Rmb3VuZDtcbi1cbi1cdHBhZGF0YSA9IGxpc3RfZW50cnkocmVvcmRlci1cdTAwM2VsaXN0Lm5leHQsIHN0cnVjdCBwYWRhdGFfcHJpdiwgbGlzdCk7XG4tXG4tXHQvKlxuLVx0ICogQ2hlY2tzIHRoZSByYXJlIGNhc2Ugd2hlcmUgdHdvIG9yIG1vcmUgcGFyYWxsZWwgam9icyBoYXZlIGhhc2hlZCB0b1xuLVx0ICogdGhlIHNhbWUgQ1BVIGFuZCBvbmUgb2YgdGhlIGxhdGVyIG9uZXMgZmluaXNoZXMgZmlyc3QuXG4tXHQgKi9cbi1cdGlmIChwYWRhdGEtXHUwMDNlc2VxX25yICE9IHByb2Nlc3NlZClcbi1cdFx0Z290byBub3Rmb3VuZDtcbi1cbi1cdGxpc3RfZGVsX2luaXQoXHUwMDI2cGFkYXRhLVx1MDAzZWxpc3QpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2cmVvcmRlci1cdTAwM2Vsb2NrKTtcbi1cdHJldHVybiBwYWRhdGE7XG4tXG4tbm90Zm91bmQ6XG4tXHRwZC1cdTAwM2Vwcm9jZXNzZWQgPSBwcm9jZXNzZWQ7XG4tXHRwZC1cdTAwM2VjcHUgPSBjcHU7XG4tXHRzcGluX3VubG9jayhcdTAwMjZyZW9yZGVyLVx1MDAzZWxvY2spO1xuLVx0cmV0dXJuIE5VTEw7XG4tfVxuLVxuLXN0YXRpYyB2b2lkIHBhZGF0YV9yZW9yZGVyKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKVxuLXtcbi1cdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCA9IHBhZGF0YS1cdTAwM2VwZDtcbi1cdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0ID0gcGQtXHUwMDNlcHMtXHUwMDNlcGluc3Q7XG4tXHR1bnNpZ25lZCBpbnQgcHJvY2Vzc2VkO1xuLVx0aW50IGNwdTtcbi1cbi1cdHByb2Nlc3NlZCA9IHBkLVx1MDAzZXByb2Nlc3NlZDtcbi1cdGNwdSA9IHBkLVx1MDAzZWNwdTtcbi1cbi1cdGRvIHtcbi1cdFx0c3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUgKnNxdWV1ZTtcbi1cdFx0aW50IGNiX2NwdTtcbi1cbi1cdFx0cHJvY2Vzc2VkJiM0MzsmIzQzOztcbi1cdFx0LyogV2hlbiBzZXF1ZW5jZSB3cmFwcyBhcm91bmQsIHJlc2V0IHRvIHRoZSBmaXJzdCBDUFUuICovXG4tXHRcdGlmICh1bmxpa2VseShwcm9jZXNzZWQgPT0gMCkpXG4tXHRcdFx0Y3B1ID0gY3B1bWFza19maXJzdChwZC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLVx0XHRlbHNlXG4tXHRcdFx0Y3B1ID0gY3B1bWFza19uZXh0X3dyYXAoY3B1LCBwZC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLVxuLVx0XHRjYl9jcHUgPSBwYWRhdGEtXHUwMDNlY2JfY3B1O1xuLVx0XHRzcXVldWUgPSBwZXJfY3B1X3B0cihwZC1cdTAwM2VzcXVldWUsIGNiX2NwdSk7XG4tXG4tXHRcdHNwaW5fbG9jayhcdTAwMjZzcXVldWUtXHUwMDNlc2VyaWFsLmxvY2spO1xuLVx0XHRsaXN0X2FkZF90YWlsKFx1MDAyNnBhZGF0YS1cdTAwM2VsaXN0LCBcdTAwMjZzcXVldWUtXHUwMDNlc2VyaWFsLmxpc3QpO1xuLVx0XHRxdWV1ZV93b3JrX29uKGNiX2NwdSwgcGluc3QtXHUwMDNlc2VyaWFsX3dxLCBcdTAwMjZzcXVldWUtXHUwMDNld29yayk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIElmIHRoZSBuZXh0IG9iamVjdCB0aGF0IG5lZWRzIHNlcmlhbGl6YXRpb24gaXMgcGFyYWxsZWxcbi1cdFx0ICogcHJvY2Vzc2VkIGJ5IGFub3RoZXIgY3B1IGFuZCBpcyBzdGlsbCBvbiBpdCYjMzk7cyB3YXkgdG8gdGhlXG4tXHRcdCAqIGNwdSYjMzk7cyByZW9yZGVyIHF1ZXVlLCBlbmQgdGhlIGxvb3AuXG4tXHRcdCAqL1xuLVx0XHRwYWRhdGEgPSBwYWRhdGFfZmluZF9uZXh0KHBkLCBjcHUsIHByb2Nlc3NlZCk7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNxdWV1ZS1cdTAwM2VzZXJpYWwubG9jayk7XG4tXHR9IHdoaWxlIChwYWRhdGEpO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBwYWRhdGFfc2VyaWFsX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnNlcmlhbF93b3JrKVxuLXtcbi1cdHN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlICpzcXVldWU7XG4tXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQ7XG4tXHRMSVNUX0hFQUQobG9jYWxfbGlzdCk7XG4tXHRpbnQgY250O1xuLVxuLVx0bG9jYWxfYmhfZGlzYWJsZSgpO1xuLVx0c3F1ZXVlID0gY29udGFpbmVyX29mKHNlcmlhbF93b3JrLCBzdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZSwgd29yayk7XG4tXHRwZCA9IHNxdWV1ZS1cdTAwM2VwZDtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZzcXVldWUtXHUwMDNlc2VyaWFsLmxvY2spO1xuLVx0bGlzdF9yZXBsYWNlX2luaXQoXHUwMDI2c3F1ZXVlLVx1MDAzZXNlcmlhbC5saXN0LCBcdTAwMjZsb2NhbF9saXN0KTtcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnNxdWV1ZS1cdTAwM2VzZXJpYWwubG9jayk7XG4tXG4tXHRjbnQgPSAwO1xuLVxuLVx0d2hpbGUgKCFsaXN0X2VtcHR5KFx1MDAyNmxvY2FsX2xpc3QpKSB7XG4tXHRcdHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhO1xuLVxuLVx0XHRwYWRhdGEgPSBsaXN0X2VudHJ5KGxvY2FsX2xpc3QubmV4dCxcbi1cdFx0XHRcdCAgICBzdHJ1Y3QgcGFkYXRhX3ByaXYsIGxpc3QpO1xuLVxuLVx0XHRsaXN0X2RlbF9pbml0KFx1MDAyNnBhZGF0YS1cdTAwM2VsaXN0KTtcbi1cbi1cdFx0cGFkYXRhLVx1MDAzZXNlcmlhbChwYWRhdGEpO1xuLVx0XHRjbnQmIzQzOyYjNDM7O1xuLVx0fVxuLVx0bG9jYWxfYmhfZW5hYmxlKCk7XG4tXG4tXHRwYWRhdGFfcHV0X3BkX2NudChwZCwgY250KTtcbi19XG4tXG4tLyoqXG4tICogcGFkYXRhX2RvX3NlcmlhbCAtIHBhZGF0YSBzZXJpYWxpemF0aW9uIGZ1bmN0aW9uXG4tICpcbi0gKiBAcGFkYXRhOiBvYmplY3QgdG8gYmUgc2VyaWFsaXplZC5cbi0gKlxuLSAqIHBhZGF0YV9kb19zZXJpYWwgbXVzdCBiZSBjYWxsZWQgZm9yIGV2ZXJ5IHBhcmFsbGVsaXplZCBvYmplY3QuXG4tICogVGhlIHNlcmlhbGl6YXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBydW4gd2l0aCBCSHMgb2ZmLlxuLSAqL1xuLXZvaWQgcGFkYXRhX2RvX3NlcmlhbChzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSlcbi17XG4tXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQgPSBwYWRhdGEtXHUwMDNlcGQ7XG4tXHRpbnQgaGFzaGVkX2NwdSA9IHBhZGF0YV9jcHVfaGFzaChwZCwgcGFkYXRhLVx1MDAzZXNlcV9ucik7XG4tXHRzdHJ1Y3QgcGFkYXRhX2xpc3QgKnJlb3JkZXIgPSBwZXJfY3B1X3B0cihwZC1cdTAwM2VyZW9yZGVyX2xpc3QsIGhhc2hlZF9jcHUpO1xuLVx0c3RydWN0IHBhZGF0YV9wcml2ICpjdXI7XG4tXHRzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7XG4tXHRib29sIGdvdGl0ID0gdHJ1ZTtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZyZW9yZGVyLVx1MDAzZWxvY2spO1xuLVx0LyogU29ydCBpbiBhc2NlbmRpbmcgb3JkZXIgb2Ygc2VxdWVuY2UgbnVtYmVyLiAqL1xuLVx0bGlzdF9mb3JfZWFjaF9wcmV2KHBvcywgXHUwMDI2cmVvcmRlci1cdTAwM2VsaXN0KSB7XG4tXHRcdGN1ciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgcGFkYXRhX3ByaXYsIGxpc3QpO1xuLVx0XHQvKiBDb21wYXJlIGJ5IGRpZmZlcmVuY2UgdG8gY29uc2lkZXIgaW50ZWdlciB3cmFwIGFyb3VuZCAqL1xuLVx0XHRpZiAoKHNpZ25lZCBpbnQpKGN1ci1cdTAwM2VzZXFfbnIgLSBwYWRhdGEtXHUwMDNlc2VxX25yKSBcdTAwM2MgMClcbi1cdFx0XHRicmVhaztcbi1cdH1cbi1cdGlmIChwYWRhdGEtXHUwMDNlc2VxX25yICE9IHBkLVx1MDAzZXByb2Nlc3NlZCkge1xuLVx0XHRnb3RpdCA9IGZhbHNlO1xuLVx0XHRsaXN0X2FkZChcdTAwMjZwYWRhdGEtXHUwMDNlbGlzdCwgcG9zKTtcbi1cdH1cbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnJlb3JkZXItXHUwMDNlbG9jayk7XG4tXG4tXHRpZiAoZ290aXQpXG4tXHRcdHBhZGF0YV9yZW9yZGVyKHBhZGF0YSk7XG4tfVxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX2RvX3NlcmlhbCk7XG4tXG4tc3RhdGljIGludCBwYWRhdGFfc2V0dXBfY3B1bWFza3Moc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpXG4te1xuLVx0c3RydWN0IHdvcmtxdWV1ZV9hdHRycyAqYXR0cnM7XG4tXHRpbnQgZXJyO1xuLVxuLVx0YXR0cnMgPSBhbGxvY193b3JrcXVldWVfYXR0cnMoKTtcbi1cdGlmICghYXR0cnMpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuLVxuLVx0LyogUmVzdHJpY3QgcGFyYWxsZWxfd3Egd29ya2VycyB0byBwZC1cdTAwM2VjcHVtYXNrLnBjcHUuICovXG4tXHRjcHVtYXNrX2NvcHkoYXR0cnMtXHUwMDNlY3B1bWFzaywgcGluc3QtXHUwMDNlY3B1bWFzay5wY3B1KTtcbi1cdGVyciA9IGFwcGx5X3dvcmtxdWV1ZV9hdHRycyhwaW5zdC1cdTAwM2VwYXJhbGxlbF93cSwgYXR0cnMpO1xuLVx0ZnJlZV93b3JrcXVldWVfYXR0cnMoYXR0cnMpO1xuLVxuLVx0cmV0dXJuIGVycjtcbi19XG4tXG4gc3RhdGljIHZvaWQgX19pbml0IHBhZGF0YV9tdF9oZWxwZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3KVxuIHtcbiBcdHN0cnVjdCBwYWRhdGFfd29yayAqcHcgPSBjb250YWluZXJfb2Yodywgc3RydWN0IHBhZGF0YV93b3JrLCBwd193b3JrKTtcbkBAIC01MDYsNjEzICYjNDM7MjI0LDE3IEBAIHZvaWQgX19pbml0IHBhZGF0YV9kb19tdWx0aXRocmVhZGVkKHN0cnVjdCBwYWRhdGFfbXRfam9iICpqb2IpXG4gXHRwYWRhdGFfd29ya3NfZnJlZShcdTAwMjZ3b3Jrcyk7XG4gfVxuIFxuLS8qIEluaXRpYWxpemUgYWxsIHBlcmNwdSBxdWV1ZXMgdXNlZCBieSBzZXJpYWwgd29ya2VycyAqL1xuLXN0YXRpYyB2b2lkIHBhZGF0YV9pbml0X3NxdWV1ZXMoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKVxuLXtcbi1cdGludCBjcHU7XG4tXHRzdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZSAqc3F1ZXVlO1xuLVxuLVx0Zm9yX2VhY2hfY3B1KGNwdSwgcGQtXHUwMDNlY3B1bWFzay5jYmNwdSkge1xuLVx0XHRzcXVldWUgPSBwZXJfY3B1X3B0cihwZC1cdTAwM2VzcXVldWUsIGNwdSk7XG4tXHRcdHNxdWV1ZS1cdTAwM2VwZCA9IHBkO1xuLVx0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZzcXVldWUtXHUwMDNlc2VyaWFsLmxpc3QpO1xuLVx0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZzcXVldWUtXHUwMDNlc2VyaWFsLmxvY2spO1xuLVx0XHRJTklUX1dPUksoXHUwMDI2c3F1ZXVlLVx1MDAzZXdvcmssIHBhZGF0YV9zZXJpYWxfd29ya2VyKTtcbi1cdH1cbi19XG4tXG4tLyogSW5pdGlhbGl6ZSBwZXItQ1BVIHJlb3JkZXIgbGlzdHMgKi9cbi1zdGF0aWMgdm9pZCBwYWRhdGFfaW5pdF9yZW9yZGVyX2xpc3Qoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKVxuLXtcbi1cdGludCBjcHU7XG4tXHRzdHJ1Y3QgcGFkYXRhX2xpc3QgKmxpc3Q7XG4tXG4tXHRmb3JfZWFjaF9jcHUoY3B1LCBwZC1cdTAwM2VjcHVtYXNrLnBjcHUpIHtcbi1cdFx0bGlzdCA9IHBlcl9jcHVfcHRyKHBkLVx1MDAzZXJlb3JkZXJfbGlzdCwgY3B1KTtcbi1cdFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2bGlzdC1cdTAwM2VsaXN0KTtcbi1cdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2bGlzdC1cdTAwM2Vsb2NrKTtcbi1cdH1cbi19XG4tXG4tLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGludGVybmFsIGNwdW1hc2sgZGVwZW5kZW5kIHJlc291cmNlcy4gKi9cbi1zdGF0aWMgc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBhZGF0YV9hbGxvY19wZChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcyxcbi1cdFx0XHRcdFx0ICAgICBpbnQgb2ZmbGluaW5nX2NwdSlcbi17XG4tXHRzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCA9IHBzLVx1MDAzZXBpbnN0O1xuLVx0c3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkO1xuLVxuLVx0cGQgPSBremFsbG9jX29iaihzdHJ1Y3QgcGFyYWxsZWxfZGF0YSk7XG4tXHRpZiAoIXBkKVxuLVx0XHRnb3RvIGVycjtcbi1cbi1cdHBkLVx1MDAzZXJlb3JkZXJfbGlzdCA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgcGFkYXRhX2xpc3QpO1xuLVx0aWYgKCFwZC1cdTAwM2VyZW9yZGVyX2xpc3QpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfcGQ7XG4tXG4tXHRwZC1cdTAwM2VzcXVldWUgPSBhbGxvY19wZXJjcHUoc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUpO1xuLVx0aWYgKCFwZC1cdTAwM2VzcXVldWUpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfcmVvcmRlcl9saXN0O1xuLVxuLVx0cGQtXHUwMDNlcHMgPSBwcztcbi1cbi1cdGlmICghYWxsb2NfY3B1bWFza192YXIoXHUwMDI2cGQtXHUwMDNlY3B1bWFzay5wY3B1LCBHRlBfS0VSTkVMKSlcbi1cdFx0Z290byBlcnJfZnJlZV9zcXVldWU7XG4tXHRpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKFx1MDAyNnBkLVx1MDAzZWNwdW1hc2suY2JjcHUsIEdGUF9LRVJORUwpKVxuLVx0XHRnb3RvIGVycl9mcmVlX3BjcHU7XG4tXG4tXHRjcHVtYXNrX2FuZChwZC1cdTAwM2VjcHVtYXNrLnBjcHUsIHBpbnN0LVx1MDAzZWNwdW1hc2sucGNwdSwgY3B1X29ubGluZV9tYXNrKTtcbi1cdGNwdW1hc2tfYW5kKHBkLVx1MDAzZWNwdW1hc2suY2JjcHUsIHBpbnN0LVx1MDAzZWNwdW1hc2suY2JjcHUsIGNwdV9vbmxpbmVfbWFzayk7XG4tXHRpZiAob2ZmbGluaW5nX2NwdSBcdTAwM2U9IDApIHtcbi1cdFx0X19jcHVtYXNrX2NsZWFyX2NwdShvZmZsaW5pbmdfY3B1LCBwZC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLVx0XHRfX2NwdW1hc2tfY2xlYXJfY3B1KG9mZmxpbmluZ19jcHUsIHBkLVx1MDAzZWNwdW1hc2suY2JjcHUpO1xuLVx0fVxuLVxuLVx0cGFkYXRhX2luaXRfcmVvcmRlcl9saXN0KHBkKTtcbi1cdHBhZGF0YV9pbml0X3NxdWV1ZXMocGQpO1xuLVx0cGQtXHUwMDNlc2VxX25yID0gLTE7XG4tXHRyZWZjb3VudF9zZXQoXHUwMDI2cGQtXHUwMDNlcmVmY250LCAxKTtcbi1cdHBkLVx1MDAzZWNwdSA9IGNwdW1hc2tfZmlyc3QocGQtXHUwMDNlY3B1bWFzay5wY3B1KTtcbi1cbi1cdHJldHVybiBwZDtcbi1cbi1lcnJfZnJlZV9wY3B1OlxuLVx0ZnJlZV9jcHVtYXNrX3ZhcihwZC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLWVycl9mcmVlX3NxdWV1ZTpcbi1cdGZyZWVfcGVyY3B1KHBkLVx1MDAzZXNxdWV1ZSk7XG4tZXJyX2ZyZWVfcmVvcmRlcl9saXN0OlxuLVx0ZnJlZV9wZXJjcHUocGQtXHUwMDNlcmVvcmRlcl9saXN0KTtcbi1lcnJfZnJlZV9wZDpcbi1cdGtmcmVlKHBkKTtcbi1lcnI6XG4tXHRyZXR1cm4gTlVMTDtcbi19XG4tXG4tc3RhdGljIHZvaWQgcGFkYXRhX2ZyZWVfcGQoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKVxuLXtcbi1cdGZyZWVfY3B1bWFza192YXIocGQtXHUwMDNlY3B1bWFzay5wY3B1KTtcbi1cdGZyZWVfY3B1bWFza192YXIocGQtXHUwMDNlY3B1bWFzay5jYmNwdSk7XG4tXHRmcmVlX3BlcmNwdShwZC1cdTAwM2VyZW9yZGVyX2xpc3QpO1xuLVx0ZnJlZV9wZXJjcHUocGQtXHUwMDNlc3F1ZXVlKTtcbi1cdGtmcmVlKHBkKTtcbi19XG4tXG4tc3RhdGljIHZvaWQgX19wYWRhdGFfc3RhcnQoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpXG4te1xuLVx0cGluc3QtXHUwMDNlZmxhZ3MgfD0gUEFEQVRBX0lOSVQ7XG4tfVxuLVxuLXN0YXRpYyB2b2lkIF9fcGFkYXRhX3N0b3Aoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpXG4te1xuLVx0aWYgKCEocGluc3QtXHUwMDNlZmxhZ3MgXHUwMDI2IFBBREFUQV9JTklUKSlcbi1cdFx0cmV0dXJuO1xuLVxuLVx0cGluc3QtXHUwMDNlZmxhZ3MgXHUwMDI2PSB+UEFEQVRBX0lOSVQ7XG4tXG4tXHRzeW5jaHJvbml6ZV9yY3UoKTtcbi19XG4tXG4tLyogUmVwbGFjZSB0aGUgaW50ZXJuYWwgY29udHJvbCBzdHJ1Y3R1cmUgd2l0aCBhIG5ldyBvbmUuICovXG4tc3RhdGljIGludCBwYWRhdGFfcmVwbGFjZV9vbmUoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsIGludCBvZmZsaW5pbmdfY3B1KVxuLXtcbi1cdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZF9uZXc7XG4tXG4tXHRwZF9uZXcgPSBwYWRhdGFfYWxsb2NfcGQocHMsIG9mZmxpbmluZ19jcHUpO1xuLVx0aWYgKCFwZF9uZXcpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuLVxuLVx0cHMtXHUwMDNlb3BkID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChwcy1cdTAwM2VwZCwgMSk7XG4tXHRyY3VfYXNzaWduX3BvaW50ZXIocHMtXHUwMDNlcGQsIHBkX25ldyk7XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4tc3RhdGljIGludCBwYWRhdGFfcmVwbGFjZShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IG9mZmxpbmluZ19jcHUpXG4te1xuLVx0c3RydWN0IHBhZGF0YV9zaGVsbCAqcHM7XG4tXHRpbnQgZXJyID0gMDtcbi1cbi1cdHBpbnN0LVx1MDAzZWZsYWdzIHw9IFBBREFUQV9SRVNFVDtcbi1cbi1cdGxpc3RfZm9yX2VhY2hfZW50cnkocHMsIFx1MDAyNnBpbnN0LVx1MDAzZXBzbGlzdCwgbGlzdCkge1xuLVx0XHRlcnIgPSBwYWRhdGFfcmVwbGFjZV9vbmUocHMsIG9mZmxpbmluZ19jcHUpO1xuLVx0XHRpZiAoZXJyKVxuLVx0XHRcdGJyZWFrO1xuLVx0fVxuLVxuLVx0c3luY2hyb25pemVfcmN1KCk7XG4tXG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JldmVyc2UocHMsIFx1MDAyNnBpbnN0LVx1MDAzZXBzbGlzdCwgbGlzdClcbi1cdFx0cGFkYXRhX3B1dF9wZChwcy1cdTAwM2VvcGQpO1xuLVxuLVx0cGluc3QtXHUwMDNlZmxhZ3MgXHUwMDI2PSB+UEFEQVRBX1JFU0VUO1xuLVxuLVx0cmV0dXJuIGVycjtcbi19XG4tXG4tLyogSWYgY3B1bWFzayBjb250YWlucyBubyBhY3RpdmUgY3B1LCB3ZSBtYXJrIHRoZSBpbnN0YW5jZSBhcyBpbnZhbGlkLiAqL1xuLXN0YXRpYyBib29sIHBhZGF0YV92YWxpZGF0ZV9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LFxuLVx0XHRcdFx0ICAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrLFxuLVx0XHRcdFx0ICAgIGludCBvZmZsaW5pbmdfY3B1KVxuLXtcbi1cdGNwdW1hc2tfY29weShwaW5zdC1cdTAwM2V2YWxpZGF0ZV9jcHVtYXNrLCBjcHVfb25saW5lX21hc2spO1xuLVxuLVx0Lypcbi1cdCAqIEBvZmZsaW5pbmdfY3B1IGlzIHN0aWxsIGluIGNwdV9vbmxpbmVfbWFzaywgc28gcmVtb3ZlIGl0IGhlcmUgZm9yXG4tXHQgKiB2YWxpZGF0aW9uLiAgVXNpbmcgYSBzdWItQ1BVSFBfVEVBUkRPV05fQ1BVIGhvdHBsdWcgc3RhdGUgd2hlcmVcbi1cdCAqIEBvZmZsaW5pbmdfY3B1IHdvdWxkbiYjMzk7dCBiZSBpbiB0aGUgb25saW5lIG1hc2sgZG9lc24mIzM5O3Qgd29yayBiZWNhdXNlXG4tXHQgKiBwYWRhdGFfY3B1X29mZmxpbmUoKSBjYW4gZmFpbCBidXQgc3VjaCBhIHN0YXRlIGRvZXNuJiMzOTt0IGFsbG93IGZhaWx1cmUuXG4tXHQgKi9cbi1cdGlmIChvZmZsaW5pbmdfY3B1IFx1MDAzZT0gMClcbi1cdFx0X19jcHVtYXNrX2NsZWFyX2NwdShvZmZsaW5pbmdfY3B1LCBwaW5zdC1cdTAwM2V2YWxpZGF0ZV9jcHVtYXNrKTtcbi1cbi1cdGlmICghY3B1bWFza19pbnRlcnNlY3RzKGNwdW1hc2ssIHBpbnN0LVx1MDAzZXZhbGlkYXRlX2NwdW1hc2spKSB7XG4tXHRcdHBpbnN0LVx1MDAzZWZsYWdzIHw9IFBBREFUQV9JTlZBTElEO1xuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXHR9XG4tXG4tXHRwaW5zdC1cdTAwM2VmbGFncyBcdTAwMjY9IH5QQURBVEFfSU5WQUxJRDtcbi1cdHJldHVybiB0cnVlO1xuLX1cbi1cbi1zdGF0aWMgaW50IF9fcGFkYXRhX3NldF9jcHVtYXNrcyhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCxcbi1cdFx0XHRcdCBjcHVtYXNrX3Zhcl90IHBjcHVtYXNrLFxuLVx0XHRcdFx0IGNwdW1hc2tfdmFyX3QgY2JjcHVtYXNrKVxuLXtcbi1cdGludCB2YWxpZDtcbi1cdGludCBlcnI7XG4tXG4tXHR2YWxpZCA9IHBhZGF0YV92YWxpZGF0ZV9jcHVtYXNrKHBpbnN0LCBwY3B1bWFzaywgLTEpO1xuLVx0aWYgKCF2YWxpZCkge1xuLVx0XHRfX3BhZGF0YV9zdG9wKHBpbnN0KTtcbi1cdFx0Z290byBvdXRfcmVwbGFjZTtcbi1cdH1cbi1cbi1cdHZhbGlkID0gcGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2socGluc3QsIGNiY3B1bWFzaywgLTEpO1xuLVx0aWYgKCF2YWxpZClcbi1cdFx0X19wYWRhdGFfc3RvcChwaW5zdCk7XG4tXG4tb3V0X3JlcGxhY2U6XG4tXHRjcHVtYXNrX2NvcHkocGluc3QtXHUwMDNlY3B1bWFzay5wY3B1LCBwY3B1bWFzayk7XG4tXHRjcHVtYXNrX2NvcHkocGluc3QtXHUwMDNlY3B1bWFzay5jYmNwdSwgY2JjcHVtYXNrKTtcbi1cbi1cdGVyciA9IHBhZGF0YV9zZXR1cF9jcHVtYXNrcyhwaW5zdCkgPzogcGFkYXRhX3JlcGxhY2UocGluc3QsIC0xKTtcbi1cbi1cdGlmICh2YWxpZClcbi1cdFx0X19wYWRhdGFfc3RhcnQocGluc3QpO1xuLVxuLVx0cmV0dXJuIGVycjtcbi19XG4tXG4tLyoqXG4tICogcGFkYXRhX3NldF9jcHVtYXNrIC0gU2V0cyBzcGVjaWZpZWQgYnkgQGNwdW1hc2tfdHlwZSBjcHVtYXNrIHRvIHRoZSB2YWx1ZVxuLSAqICAgICAgICAgICAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8gQGNwdW1hc2suXG4tICogQHBpbnN0OiBwYWRhdGEgaW5zdGFuY2Vcbi0gKiBAY3B1bWFza190eXBlOiBQQURBVEFfQ1BVX1NFUklBTCBvciBQQURBVEFfQ1BVX1BBUkFMTEVMIGNvcnJlc3BvbmRpbmdcbi0gKiAgICAgICAgICAgICAgICB0byBwYXJhbGxlbCBhbmQgc2VyaWFsIGNwdW1hc2tzIHJlc3BlY3RpdmVseS5cbi0gKiBAY3B1bWFzazogdGhlIGNwdW1hc2sgdG8gdXNlXG4tICpcbi0gKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlXG4tICovXG4taW50IHBhZGF0YV9zZXRfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdW1hc2tfdHlwZSxcbi1cdFx0ICAgICAgIGNwdW1hc2tfdmFyX3QgY3B1bWFzaylcbi17XG4tXHRzdHJ1Y3QgY3B1bWFzayAqc2VyaWFsX21hc2ssICpwYXJhbGxlbF9tYXNrO1xuLVx0aW50IGVyciA9IC1FSU5WQUw7XG4tXG4tXHRjcHVzX3JlYWRfbG9jaygpO1xuLVx0bXV0ZXhfbG9jayhcdTAwMjZwaW5zdC1cdTAwM2Vsb2NrKTtcbi1cbi1cdHN3aXRjaCAoY3B1bWFza190eXBlKSB7XG4tXHRjYXNlIFBBREFUQV9DUFVfUEFSQUxMRUw6XG4tXHRcdHNlcmlhbF9tYXNrID0gcGluc3QtXHUwMDNlY3B1bWFzay5jYmNwdTtcbi1cdFx0cGFyYWxsZWxfbWFzayA9IGNwdW1hc2s7XG4tXHRcdGJyZWFrO1xuLVx0Y2FzZSBQQURBVEFfQ1BVX1NFUklBTDpcbi1cdFx0cGFyYWxsZWxfbWFzayA9IHBpbnN0LVx1MDAzZWNwdW1hc2sucGNwdTtcbi1cdFx0c2VyaWFsX21hc2sgPSBjcHVtYXNrO1xuLVx0XHRicmVhaztcbi1cdGRlZmF1bHQ6XG4tXHRcdCBnb3RvIG91dDtcbi1cdH1cbi1cbi1cdGVyciA9ICBfX3BhZGF0YV9zZXRfY3B1bWFza3MocGluc3QsIHBhcmFsbGVsX21hc2ssIHNlcmlhbF9tYXNrKTtcbi1cbi1vdXQ6XG4tXHRtdXRleF91bmxvY2soXHUwMDI2cGluc3QtXHUwMDNlbG9jayk7XG4tXHRjcHVzX3JlYWRfdW5sb2NrKCk7XG4tXG4tXHRyZXR1cm4gZXJyO1xuLX1cbi1FWFBPUlRfU1lNQk9MKHBhZGF0YV9zZXRfY3B1bWFzayk7XG4tXG4tI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVVxuLVxuLXN0YXRpYyBpbmxpbmUgaW50IHBpbnN0X2hhc19jcHUoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsIGludCBjcHUpXG4te1xuLVx0cmV0dXJuIGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBwaW5zdC1cdTAwM2VjcHVtYXNrLnBjcHUpIHx8XG4tXHRcdGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBwaW5zdC1cdTAwM2VjcHVtYXNrLmNiY3B1KTtcbi19XG4tXG4tc3RhdGljIGludCBwYWRhdGFfY3B1X29ubGluZSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSlcbi17XG4tXHRzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdDtcbi1cdGludCByZXQ7XG4tXG4tXHRwaW5zdCA9IGhsaXN0X2VudHJ5X3NhZmUobm9kZSwgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSwgY3B1aHBfbm9kZSk7XG4tXHRpZiAoIXBpbnN0X2hhc19jcHUocGluc3QsIGNwdSkpXG4tXHRcdHJldHVybiAwO1xuLVxuLVx0bXV0ZXhfbG9jayhcdTAwMjZwaW5zdC1cdTAwM2Vsb2NrKTtcbi1cbi1cdHJldCA9IHBhZGF0YV9yZXBsYWNlKHBpbnN0LCAtMSk7XG4tXG4tXHRpZiAocGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2socGluc3QsIHBpbnN0LVx1MDAzZWNwdW1hc2sucGNwdSwgLTEpIFx1MDAyNlx1MDAyNlxuLVx0ICAgIHBhZGF0YV92YWxpZGF0ZV9jcHVtYXNrKHBpbnN0LCBwaW5zdC1cdTAwM2VjcHVtYXNrLmNiY3B1LCAtMSkpXG4tXHRcdF9fcGFkYXRhX3N0YXJ0KHBpbnN0KTtcbi1cbi1cdG11dGV4X3VubG9jayhcdTAwMjZwaW5zdC1cdTAwM2Vsb2NrKTtcbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLXN0YXRpYyBpbnQgcGFkYXRhX2NwdV9vZmZsaW5lKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKVxuLXtcbi1cdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0O1xuLVx0aW50IHJldDtcbi1cbi1cdHBpbnN0ID0gaGxpc3RfZW50cnlfc2FmZShub2RlLCBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlLCBjcHVocF9ub2RlKTtcbi1cdGlmICghcGluc3RfaGFzX2NwdShwaW5zdCwgY3B1KSlcbi1cdFx0cmV0dXJuIDA7XG4tXG4tXHRtdXRleF9sb2NrKFx1MDAyNnBpbnN0LVx1MDAzZWxvY2spO1xuLVxuLVx0aWYgKCFwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGluc3QtXHUwMDNlY3B1bWFzay5wY3B1LCBjcHUpIHx8XG4tXHQgICAgIXBhZGF0YV92YWxpZGF0ZV9jcHVtYXNrKHBpbnN0LCBwaW5zdC1cdTAwM2VjcHVtYXNrLmNiY3B1LCBjcHUpKVxuLVx0XHRfX3BhZGF0YV9zdG9wKHBpbnN0KTtcbi1cbi1cdHJldCA9IHBhZGF0YV9yZXBsYWNlKHBpbnN0LCBjcHUpO1xuLVxuLVx0bXV0ZXhfdW5sb2NrKFx1MDAyNnBpbnN0LVx1MDAzZWxvY2spO1xuLVx0cmV0dXJuIHJldDtcbi19XG4tXG4tc3RhdGljIGVudW0gY3B1aHBfc3RhdGUgaHBfb25saW5lO1xuLSNlbmRpZlxuLVxuLXN0YXRpYyB2b2lkIF9fcGFkYXRhX2ZyZWUoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpXG4te1xuLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFVcbi1cdGNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzKGhwX29ubGluZSwgXHUwMDI2cGluc3QtXHUwMDNlY3B1aHBfbm9kZSk7XG4tI2VuZGlmXG4tXG4tXHRXQVJOX09OKCFsaXN0X2VtcHR5KFx1MDAyNnBpbnN0LVx1MDAzZXBzbGlzdCkpO1xuLVxuLVx0ZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLVx0ZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC1cdTAwM2VjcHVtYXNrLmNiY3B1KTtcbi1cdGZyZWVfY3B1bWFza192YXIocGluc3QtXHUwMDNldmFsaWRhdGVfY3B1bWFzayk7XG4tXHRkZXN0cm95X3dvcmtxdWV1ZShwaW5zdC1cdTAwM2VzZXJpYWxfd3EpO1xuLVx0ZGVzdHJveV93b3JrcXVldWUocGluc3QtXHUwMDNlcGFyYWxsZWxfd3EpO1xuLVx0a2ZyZWUocGluc3QpO1xuLX1cbi1cbi0jZGVmaW5lIGtvYmoycGluc3QoX2tvYmopXHRcdFx0XHRcdFxcXG4tXHRjb250YWluZXJfb2YoX2tvYmosIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UsIGtvYmopXG4tI2RlZmluZSBhdHRyMnBlbnRyeShfYXR0cilcdFx0XHRcdFx0XFxcbi1cdGNvbnRhaW5lcl9vZl9jb25zdChfYXR0ciwgc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSwgYXR0cilcbi1cbi1zdGF0aWMgdm9pZCBwYWRhdGFfc3lzZnNfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iailcbi17XG4tXHRzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCA9IGtvYmoycGluc3Qoa29iaik7XG4tXHRfX3BhZGF0YV9mcmVlKHBpbnN0KTtcbi19XG4tXG4tc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSB7XG4tXHRzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7XG4tXHRzc2l6ZV90ICgqc2hvdykoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICosIGNoYXIgKik7XG4tXHRzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKiwgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqLFxuLVx0XHRcdCBjb25zdCBjaGFyICosIHNpemVfdCk7XG4tfTtcbi1cbi1zdGF0aWMgc3NpemVfdCBzaG93X2NwdW1hc2soc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsXG4tXHRcdFx0ICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsICBjaGFyICpidWYpXG4te1xuLVx0c3RydWN0IGNwdW1hc2sgKmNwdW1hc2s7XG4tXHRzc2l6ZV90IGxlbjtcbi1cbi1cdG11dGV4X2xvY2soXHUwMDI2cGluc3QtXHUwMDNlbG9jayk7XG4tXHRpZiAoIXN0cmNtcChhdHRyLVx1MDAzZW5hbWUsIFwmIzM0O3NlcmlhbF9jcHVtYXNrXCYjMzQ7KSlcbi1cdFx0Y3B1bWFzayA9IHBpbnN0LVx1MDAzZWNwdW1hc2suY2JjcHU7XG4tXHRlbHNlXG4tXHRcdGNwdW1hc2sgPSBwaW5zdC1cdTAwM2VjcHVtYXNrLnBjcHU7XG4tXG4tXHRsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgXCYjMzQ7JSpwYlxcblwmIzM0Oyxcbi1cdFx0ICAgICAgIG5yX2NwdV9pZHMsIGNwdW1hc2tfYml0cyhjcHVtYXNrKSk7XG4tXHRtdXRleF91bmxvY2soXHUwMDI2cGluc3QtXHUwMDNlbG9jayk7XG4tXHRyZXR1cm4gbGVuIFx1MDAzYyBQQUdFX1NJWkUgPyBsZW4gOiAtRUlOVkFMO1xuLX1cbi1cbi1zdGF0aWMgc3NpemVfdCBzdG9yZV9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LFxuLVx0XHRcdCAgICAgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cixcbi1cdFx0XHQgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KVxuLXtcbi1cdGNwdW1hc2tfdmFyX3QgbmV3X2NwdW1hc2s7XG4tXHRzc2l6ZV90IHJldDtcbi1cdGludCBtYXNrX3R5cGU7XG4tXG4tXHRpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKFx1MDAyNm5ld19jcHVtYXNrLCBHRlBfS0VSTkVMKSlcbi1cdFx0cmV0dXJuIC1FTk9NRU07XG4tXG4tXHRyZXQgPSBiaXRtYXBfcGFyc2UoYnVmLCBjb3VudCwgY3B1bWFza19iaXRzKG5ld19jcHVtYXNrKSxcbi1cdFx0XHQgICBucl9jcHVtYXNrX2JpdHMpO1xuLVx0aWYgKHJldCBcdTAwM2MgMClcbi1cdFx0Z290byBvdXQ7XG4tXG4tXHRtYXNrX3R5cGUgPSAhc3RyY21wKGF0dHItXHUwMDNlbmFtZSwgXCYjMzQ7c2VyaWFsX2NwdW1hc2tcJiMzNDspID9cbi1cdFx0UEFEQVRBX0NQVV9TRVJJQUwgOiBQQURBVEFfQ1BVX1BBUkFMTEVMO1xuLVx0cmV0ID0gcGFkYXRhX3NldF9jcHVtYXNrKHBpbnN0LCBtYXNrX3R5cGUsIG5ld19jcHVtYXNrKTtcbi1cdGlmICghcmV0KVxuLVx0XHRyZXQgPSBjb3VudDtcbi1cbi1vdXQ6XG4tXHRmcmVlX2NwdW1hc2tfdmFyKG5ld19jcHVtYXNrKTtcbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLSNkZWZpbmUgUEFEQVRBX0FUVFJfUlcoX25hbWUsIF9zaG93X25hbWUsIF9zdG9yZV9uYW1lKVx0XHRcXFxuLVx0c3RhdGljIGNvbnN0IHN0cnVjdCBwYWRhdGFfc3lzZnNfZW50cnkgX25hbWUjI19hdHRyID1cdFxcXG4tXHRcdF9fQVRUUihfbmFtZSwgMDY0NCwgX3Nob3dfbmFtZSwgX3N0b3JlX25hbWUpXG4tI2RlZmluZSBQQURBVEFfQVRUUl9STyhfbmFtZSwgX3Nob3dfbmFtZSlcdFx0XHRcXFxuLVx0c3RhdGljIGNvbnN0IHN0cnVjdCBwYWRhdGFfc3lzZnNfZW50cnkgX25hbWUjI19hdHRyID1cdFxcXG4tXHRcdF9fQVRUUihfbmFtZSwgMDQwMCwgX3Nob3dfbmFtZSwgTlVMTClcbi1cbi1QQURBVEFfQVRUUl9SVyhzZXJpYWxfY3B1bWFzaywgc2hvd19jcHVtYXNrLCBzdG9yZV9jcHVtYXNrKTtcbi1QQURBVEFfQVRUUl9SVyhwYXJhbGxlbF9jcHVtYXNrLCBzaG93X2NwdW1hc2ssIHN0b3JlX2NwdW1hc2spO1xuLVxuLS8qXG4tICogUGFkYXRhIHN5c2ZzIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgb2JqZWN0czpcbi0gKiBzZXJpYWxfY3B1bWFzayAgIFtSV10gLSBjcHVtYXNrIGZvciBzZXJpYWwgd29ya2Vyc1xuLSAqIHBhcmFsbGVsX2NwdW1hc2sgW1JXXSAtIGNwdW1hc2sgZm9yIHBhcmFsbGVsIHdvcmtlcnNcbi0gKi9cbi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqY29uc3QgcGFkYXRhX2RlZmF1bHRfYXR0cnNbXSA9IHtcbi1cdFx1MDAyNnNlcmlhbF9jcHVtYXNrX2F0dHIuYXR0cixcbi1cdFx1MDAyNnBhcmFsbGVsX2NwdW1hc2tfYXR0ci5hdHRyLFxuLVx0TlVMTCxcbi19O1xuLUFUVFJJQlVURV9HUk9VUFMocGFkYXRhX2RlZmF1bHQpO1xuLVxuLXN0YXRpYyBzc2l6ZV90IHBhZGF0YV9zeXNmc19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLFxuLVx0XHRcdFx0IHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zilcbi17XG4tXHRjb25zdCBzdHJ1Y3QgcGFkYXRhX3N5c2ZzX2VudHJ5ICpwZW50cnk7XG4tXHRzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdDtcbi1cdHNzaXplX3QgcmV0ID0gLUVJTztcbi1cbi1cdHBpbnN0ID0ga29iajJwaW5zdChrb2JqKTtcbi1cdHBlbnRyeSA9IGF0dHIycGVudHJ5KGF0dHIpO1xuLVx0aWYgKHBlbnRyeS1cdTAwM2VzaG93KVxuLVx0XHRyZXQgPSBwZW50cnktXHUwMDNlc2hvdyhwaW5zdCwgYXR0ciwgYnVmKTtcbi1cbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLXN0YXRpYyBzc2l6ZV90IHBhZGF0YV9zeXNmc19zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cixcbi1cdFx0XHRcdCAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpXG4te1xuLVx0Y29uc3Qgc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSAqcGVudHJ5O1xuLVx0c3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3Q7XG4tXHRzc2l6ZV90IHJldCA9IC1FSU87XG4tXG4tXHRwaW5zdCA9IGtvYmoycGluc3Qoa29iaik7XG4tXHRwZW50cnkgPSBhdHRyMnBlbnRyeShhdHRyKTtcbi1cdGlmIChwZW50cnktXHUwMDNlc3RvcmUpXG4tXHRcdHJldCA9IHBlbnRyeS1cdTAwM2VzdG9yZShwaW5zdCwgYXR0ciwgYnVmLCBjb3VudCk7XG4tXG4tXHRyZXR1cm4gcmV0O1xuLX1cbi1cbi1zdGF0aWMgY29uc3Qgc3RydWN0IHN5c2ZzX29wcyBwYWRhdGFfc3lzZnNfb3BzID0ge1xuLVx0LnNob3cgPSBwYWRhdGFfc3lzZnNfc2hvdyxcbi1cdC5zdG9yZSA9IHBhZGF0YV9zeXNmc19zdG9yZSxcbi19O1xuLVxuLXN0YXRpYyBjb25zdCBzdHJ1Y3Qga29ial90eXBlIHBhZGF0YV9hdHRyX3R5cGUgPSB7XG4tXHQuc3lzZnNfb3BzID0gXHUwMDI2cGFkYXRhX3N5c2ZzX29wcyxcbi1cdC5kZWZhdWx0X2dyb3VwcyA9IHBhZGF0YV9kZWZhdWx0X2dyb3Vwcyxcbi1cdC5yZWxlYXNlID0gcGFkYXRhX3N5c2ZzX3JlbGVhc2UsXG4tfTtcbi1cbi0vKipcbi0gKiBwYWRhdGFfYWxsb2MgLSBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIHBhZGF0YSBpbnN0YW5jZVxuLSAqIEBuYW1lOiB1c2VkIHRvIGlkZW50aWZ5IHRoZSBpbnN0YW5jZVxuLSAqXG4tICogUmV0dXJuOiBuZXcgaW5zdGFuY2Ugb24gc3VjY2VzcywgTlVMTCBvbiBlcnJvclxuLSAqL1xuLXN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBhZGF0YV9hbGxvYyhjb25zdCBjaGFyICpuYW1lKVxuLXtcbi1cdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0O1xuLVxuLVx0cGluc3QgPSBremFsbG9jX29iaihzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlKTtcbi1cdGlmICghcGluc3QpXG4tXHRcdGdvdG8gZXJyO1xuLVxuLVx0cGluc3QtXHUwMDNlcGFyYWxsZWxfd3EgPSBhbGxvY193b3JrcXVldWUoXCYjMzQ7JXNfcGFyYWxsZWxcJiMzNDssIFdRX1VOQk9VTkQsIDAsXG4tXHRcdFx0XHRcdCAgICAgbmFtZSk7XG4tXHRpZiAoIXBpbnN0LVx1MDAzZXBhcmFsbGVsX3dxKVxuLVx0XHRnb3RvIGVycl9mcmVlX2luc3Q7XG4tXG4tXHRjcHVzX3JlYWRfbG9jaygpO1xuLVxuLVx0cGluc3QtXHUwMDNlc2VyaWFsX3dxID0gYWxsb2Nfd29ya3F1ZXVlKFwmIzM0OyVzX3NlcmlhbFwmIzM0Oyxcbi1cdFx0XHRcdFx0ICAgV1FfTUVNX1JFQ0xBSU0gfCBXUV9DUFVfSU5URU5TSVZFIHwgV1FfUEVSQ1BVLFxuLVx0XHRcdFx0XHQgICAxLCBuYW1lKTtcbi1cdGlmICghcGluc3QtXHUwMDNlc2VyaWFsX3dxKVxuLVx0XHRnb3RvIGVycl9wdXRfY3B1cztcbi1cbi1cdGlmICghYWxsb2NfY3B1bWFza192YXIoXHUwMDI2cGluc3QtXHUwMDNlY3B1bWFzay5wY3B1LCBHRlBfS0VSTkVMKSlcbi1cdFx0Z290byBlcnJfZnJlZV9zZXJpYWxfd3E7XG4tXHRpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKFx1MDAyNnBpbnN0LVx1MDAzZWNwdW1hc2suY2JjcHUsIEdGUF9LRVJORUwpKVxuLVx0XHRnb3RvIGVycl9mcmVlX3BfbWFzaztcbi1cdGlmICghYWxsb2NfY3B1bWFza192YXIoXHUwMDI2cGluc3QtXHUwMDNldmFsaWRhdGVfY3B1bWFzaywgR0ZQX0tFUk5FTCkpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfY2JfbWFzaztcbi1cbi1cdElOSVRfTElTVF9IRUFEKFx1MDAyNnBpbnN0LVx1MDAzZXBzbGlzdCk7XG4tXG4tXHRjcHVtYXNrX2NvcHkocGluc3QtXHUwMDNlY3B1bWFzay5wY3B1LCBjcHVfcG9zc2libGVfbWFzayk7XG4tXHRjcHVtYXNrX2NvcHkocGluc3QtXHUwMDNlY3B1bWFzay5jYmNwdSwgY3B1X3Bvc3NpYmxlX21hc2spO1xuLVxuLVx0aWYgKHBhZGF0YV9zZXR1cF9jcHVtYXNrcyhwaW5zdCkpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfdl9tYXNrO1xuLVxuLVx0X19wYWRhdGFfc3RhcnQocGluc3QpO1xuLVxuLVx0a29iamVjdF9pbml0KFx1MDAyNnBpbnN0LVx1MDAzZWtvYmosIFx1MDAyNnBhZGF0YV9hdHRyX3R5cGUpO1xuLVx0bXV0ZXhfaW5pdChcdTAwMjZwaW5zdC1cdTAwM2Vsb2NrKTtcbi1cbi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVXG4tXHRjcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2Vfbm9jYWxsc19jcHVzbG9ja2VkKGhwX29ubGluZSxcbi1cdFx0XHRcdFx0XHQgICAgXHUwMDI2cGluc3QtXHUwMDNlY3B1aHBfbm9kZSk7XG4tI2VuZGlmXG4tXG4tXHRjcHVzX3JlYWRfdW5sb2NrKCk7XG4tXG4tXHRyZXR1cm4gcGluc3Q7XG4tXG4tZXJyX2ZyZWVfdl9tYXNrOlxuLVx0ZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC1cdTAwM2V2YWxpZGF0ZV9jcHVtYXNrKTtcbi1lcnJfZnJlZV9jYl9tYXNrOlxuLVx0ZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC1cdTAwM2VjcHVtYXNrLmNiY3B1KTtcbi1lcnJfZnJlZV9wX21hc2s6XG4tXHRmcmVlX2NwdW1hc2tfdmFyKHBpbnN0LVx1MDAzZWNwdW1hc2sucGNwdSk7XG4tZXJyX2ZyZWVfc2VyaWFsX3dxOlxuLVx0ZGVzdHJveV93b3JrcXVldWUocGluc3QtXHUwMDNlc2VyaWFsX3dxKTtcbi1lcnJfcHV0X2NwdXM6XG4tXHRjcHVzX3JlYWRfdW5sb2NrKCk7XG4tXHRkZXN0cm95X3dvcmtxdWV1ZShwaW5zdC1cdTAwM2VwYXJhbGxlbF93cSk7XG4tZXJyX2ZyZWVfaW5zdDpcbi1cdGtmcmVlKHBpbnN0KTtcbi1lcnI6XG4tXHRyZXR1cm4gTlVMTDtcbi19XG4tRVhQT1JUX1NZTUJPTChwYWRhdGFfYWxsb2MpO1xuLVxuLS8qKlxuLSAqIHBhZGF0YV9mcmVlIC0gZnJlZSBhIHBhZGF0YSBpbnN0YW5jZVxuLSAqXG4tICogQHBpbnN0OiBwYWRhdGEgaW5zdGFuY2UgdG8gZnJlZVxuLSAqL1xuLXZvaWQgcGFkYXRhX2ZyZWUoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpXG4te1xuLVx0a29iamVjdF9wdXQoXHUwMDI2cGluc3QtXHUwMDNla29iaik7XG4tfVxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX2ZyZWUpO1xuLVxuLS8qKlxuLSAqIHBhZGF0YV9hbGxvY19zaGVsbCAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHBhZGF0YSBzaGVsbC5cbi0gKlxuLSAqIEBwaW5zdDogUGFyZW50IHBhZGF0YV9pbnN0YW5jZSBvYmplY3QuXG4tICpcbi0gKiBSZXR1cm46IG5ldyBzaGVsbCBvbiBzdWNjZXNzLCBOVUxMIG9uIGVycm9yXG4tICovXG4tc3RydWN0IHBhZGF0YV9zaGVsbCAqcGFkYXRhX2FsbG9jX3NoZWxsKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KVxuLXtcbi1cdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDtcbi1cdHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzO1xuLVxuLVx0cHMgPSBremFsbG9jX29iaigqcHMpO1xuLVx0aWYgKCFwcylcbi1cdFx0Z290byBvdXQ7XG4tXG4tXHRwcy1cdTAwM2VwaW5zdCA9IHBpbnN0O1xuLVxuLVx0Y3B1c19yZWFkX2xvY2soKTtcbi1cdHBkID0gcGFkYXRhX2FsbG9jX3BkKHBzLCAtMSk7XG4tXHRjcHVzX3JlYWRfdW5sb2NrKCk7XG4tXG4tXHRpZiAoIXBkKVxuLVx0XHRnb3RvIG91dF9mcmVlX3BzO1xuLVxuLVx0bXV0ZXhfbG9jayhcdTAwMjZwaW5zdC1cdTAwM2Vsb2NrKTtcbi1cdFJDVV9JTklUX1BPSU5URVIocHMtXHUwMDNlcGQsIHBkKTtcbi1cdGxpc3RfYWRkKFx1MDAyNnBzLVx1MDAzZWxpc3QsIFx1MDAyNnBpbnN0LVx1MDAzZXBzbGlzdCk7XG4tXHRtdXRleF91bmxvY2soXHUwMDI2cGluc3QtXHUwMDNlbG9jayk7XG4tXG4tXHRyZXR1cm4gcHM7XG4tXG4tb3V0X2ZyZWVfcHM6XG4tXHRrZnJlZShwcyk7XG4tb3V0OlxuLVx0cmV0dXJuIE5VTEw7XG4tfVxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX2FsbG9jX3NoZWxsKTtcbi1cbi0vKipcbi0gKiBwYWRhdGFfZnJlZV9zaGVsbCAtIGZyZWUgYSBwYWRhdGEgc2hlbGxcbi0gKlxuLSAqIEBwczogcGFkYXRhIHNoZWxsIHRvIGZyZWVcbi0gKi9cbi12b2lkIHBhZGF0YV9mcmVlX3NoZWxsKHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzKVxuLXtcbi1cdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDtcbi1cbi1cdGlmICghcHMpXG4tXHRcdHJldHVybjtcbi1cbi1cdG11dGV4X2xvY2soXHUwMDI2cHMtXHUwMDNlcGluc3QtXHUwMDNlbG9jayk7XG4tXHRsaXN0X2RlbChcdTAwMjZwcy1cdTAwM2VsaXN0KTtcbi1cdHBkID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChwcy1cdTAwM2VwZCwgMSk7XG4tXHRwYWRhdGFfcHV0X3BkKHBkKTtcbi1cdG11dGV4X3VubG9jayhcdTAwMjZwcy1cdTAwM2VwaW5zdC1cdTAwM2Vsb2NrKTtcbi1cbi1cdGtmcmVlKHBzKTtcbi19XG4tRVhQT1JUX1NZTUJPTChwYWRhdGFfZnJlZV9zaGVsbCk7XG4tXG4gdm9pZCBfX2luaXQgcGFkYXRhX2luaXQodm9pZClcbiB7XG4gXHR1bnNpZ25lZCBpbnQgaSwgcG9zc2libGVfY3B1cztcbi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVXG4tXHRpbnQgcmV0O1xuLVxuLVx0cmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkoQ1BVSFBfQVBfT05MSU5FX0RZTiwgXCYjMzQ7cGFkYXRhOm9ubGluZVwmIzM0Oyxcbi1cdFx0XHRcdCAgICAgIHBhZGF0YV9jcHVfb25saW5lLCBwYWRhdGFfY3B1X29mZmxpbmUpO1xuLVx0aWYgKHJldCBcdTAwM2MgMClcbi1cdFx0Z290byBlcnI7XG4tXHRocF9vbmxpbmUgPSByZXQ7XG4tI2VuZGlmXG4gXG4gXHRwb3NzaWJsZV9jcHVzID0gbnVtX3Bvc3NpYmxlX2NwdXMoKTtcbiBcdHBhZGF0YV93b3JrcyA9IGttYWxsb2Nfb2JqcyhzdHJ1Y3QgcGFkYXRhX3dvcmssIHBvc3NpYmxlX2NwdXMpO1xuLVx0aWYgKCFwYWRhdGFfd29ya3MpXG4tXHRcdGdvdG8gcmVtb3ZlX29ubGluZV9zdGF0ZTtcbiYjNDM7XHRpZiAoIXBhZGF0YV93b3Jrcykge1xuJiM0MztcdFx0cHJfd2FybihcJiMzNDtwYWRhdGE6IGluaXRpYWxpemF0aW9uIGZhaWxlZFxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuIFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgcG9zc2libGVfY3B1czsgJiM0MzsmIzQzO2kpXG4gXHRcdGxpc3RfYWRkKFx1MDAyNnBhZGF0YV93b3Jrc1tpXS5wd19saXN0LCBcdTAwMjZwYWRhdGFfZnJlZV93b3Jrcyk7XG4tXG4tXHRyZXR1cm47XG4tXG4tcmVtb3ZlX29ubGluZV9zdGF0ZTpcbi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVXG4tXHRjcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUoaHBfb25saW5lKTtcbi1lcnI6XG4tI2VuZGlmXG4tXHRwcl93YXJuKFwmIzM0O3BhZGF0YTogaW5pdGlhbGl6YXRpb24gZmFpbGVkXFxuXCYjMzQ7KTtcbiB9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvY3J5cHRvL3RjcnlwdC90Y3J5cHRfc3BlZWRfY29tcGFyZS5weSBiL3Rvb2xzL2NyeXB0by90Y3J5cHQvdGNyeXB0X3NwZWVkX2NvbXBhcmUucHlcbmluZGV4IGYzZjU3ODNjZGMwNjZiLi4wYmYzOGMwNzNkYmMwMyAxMDA3NTVcbi0tLSBhL3Rvb2xzL2NyeXB0by90Y3J5cHQvdGNyeXB0X3NwZWVkX2NvbXBhcmUucHlcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2NyeXB0by90Y3J5cHQvdGNyeXB0X3NwZWVkX2NvbXBhcmUucHlcbkBAIC0yOCwxOSAmIzQzOzI4LDE2IEBAIG51bV9tYj04XG4gbW9kZT0yMTFcbiBcbiAjIGJhc2Ugc3BlZWQgdGVzdFxuLWxzbW9kIHwgZ3JlcCBwY3J5cHQgXHUwMDI2XHUwMDI2IG1vZHByb2JlIC1yIHBjcnlwdFxuIGRtZXNnIC1DXG4tbW9kcHJvYmUgdGNyeXB0IGFsZz1cJiMzNDtwY3J5cHQocmZjNDEwNihnY20oYWVzKSkpXCYjMzQ7IHR5cGU9M1xuJiM0Mzttb2Rwcm9iZSB0Y3J5cHQgYWxnPVwmIzM0O3JmYzQxMDYoZ2NtKGFlcykpXCYjMzQ7IHR5cGU9M1xuIG1vZHByb2JlIHRjcnlwdCBtb2RlPSR7bW9kZX0gc2VjPSR7c2VjfSBudW1fbWI9JHtudW1fbWJ9XG4gZG1lc2cgXHUwMDNlICR7c2VxX251bX1fYmFzZV9kbWVzZy5sb2dcbiBcbiAjIG5ldyBzcGVlZCB0ZXN0XG4tbHNtb2QgfCBncmVwIHBjcnlwdCBcdTAwMjZcdTAwMjYgbW9kcHJvYmUgLXIgcGNyeXB0XG4gZG1lc2cgLUNcbi1tb2Rwcm9iZSB0Y3J5cHQgYWxnPVwmIzM0O3BjcnlwdChyZmM0MTA2KGdjbShhZXMpKSlcJiMzNDsgdHlwZT0zXG4mIzQzO21vZHByb2JlIHRjcnlwdCBhbGc9XCYjMzQ7cmZjNDEwNihnY20oYWVzKSlcJiMzNDsgdHlwZT0zXG4gbW9kcHJvYmUgdGNyeXB0IG1vZGU9JHttb2RlfSBzZWM9JHtzZWN9IG51bV9tYj0ke251bV9tYn1cbiBkbWVzZyBcdTAwM2UgJHtzZXFfbnVtfV9uZXdfZG1lc2cubG9nXG4tbHNtb2QgfCBncmVwIHBjcnlwdCBcdTAwMjZcdTAwMjYgbW9kcHJvYmUgLXIgcGNyeXB0XG4gXG4gdG9vbHMvY3J5cHRvL3RjcnlwdC90Y3J5cHRfc3BlZWRfY29tcGFyZS5weSBcXFxuICAgICAke3NlcV9udW19X2Jhc2VfZG1lc2cubG9nIFxcXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTQgMDM6MzU8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVtb3ZlcyB0aGUgcGNyeXB0IHBhcmFsbGVsIGNyeXB0byBlbmdpbmUgYW5kIHRoZSBhc3NvY2lhdGVkIHNlcmlhbGl6ZWQgam9iIHN1cHBvcnQgZnJvbSBwYWRhdGEuIEl0IGlzIGEgcHVyZSBjbGVhbnVwL3JlbW92YWwgcGF0Y2ggYW5kIGRvZXMgbm90IGludHJvZHVjZSBhbnkgbmV3IGZ1bmN0aW9uYWwgY29kZSBvciBsb2dpYyB0aGF0IHJlcXVpcmVzIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdAogICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksCiAgIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBjYzM5NGNjOWNlMWRjY2M0MTViYzhmYzY1ZmU2NTY3YWE4Yzc1MzQ0CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFR1ZSBKdWwgMTQgMDM6MzU6MTIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3BhZGF0YS5yc3QgYi9Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3BhZGF0YS5yc3QKaW5kZXggMDViNzNjNmMxMDVmMDQuLmQ3ZGM3ZTMzMDU0ZGJkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3BhZGF0YS5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9wYWRhdGEucnN0CkBAIC03LDE1MiAmIzQzOzcsMTEgQEAgVGhlIHBhZGF0YSBwYXJhbGxlbCBleGVjdXRpb24gbWVjaGFuaXNtCiA6RGF0ZTogTWF5IDIwMjAKIAogUGFkYXRhIGlzIGEgbWVjaGFuaXNtIGJ5IHdoaWNoIHRoZSBrZXJuZWwgY2FuIGZhcm0gam9icyBvdXQgdG8gYmUgZG9uZSBpbgotcGFyYWxsZWwgb24gbXVsdGlwbGUgQ1BVcyB3aGlsZSBvcHRpb25hbGx5IHJldGFpbmluZyB0aGVpciBvcmRlcmluZy4KJiM0MztwYXJhbGxlbCBvbiBtdWx0aXBsZSBDUFVzIHdoaWxlIGNvb3JkaW5hdGluZyBiZXR3ZWVuIHRocmVhZHMuCiAKLUl0IHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCBmb3IgSVBzZWMsIHdoaWNoIG5lZWRzIHRvIHBlcmZvcm0gZW5jcnlwdGlvbiBhbmQKLWRlY3J5cHRpb24gb24gbGFyZ2UgbnVtYmVycyBvZiBwYWNrZXRzIHdpdGhvdXQgcmVvcmRlcmluZyB0aG9zZSBwYWNrZXRzLiAgVGhpcwotaXMgY3VycmVudGx5IHRoZSBzb2xlIGNvbnN1bWVyIG9mIHBhZGF0YSYjMzk7cyBzZXJpYWxpemVkIGpvYiBzdXBwb3J0LgotCi1QYWRhdGEgYWxzbyBzdXBwb3J0cyBtdWx0aXRocmVhZGVkIGpvYnMsIHNwbGl0dGluZyB1cCB0aGUgam9iIGV2ZW5seSB3aGlsZSBsb2FkCiYjNDM7UGFkYXRhIHN1cHBvcnRzIG11bHRpdGhyZWFkZWQgam9icywgc3BsaXR0aW5nIHVwIHRoZSBqb2IgZXZlbmx5IHdoaWxlIGxvYWQKIGJhbGFuY2luZyBhbmQgY29vcmRpbmF0aW5nIGJldHdlZW4gdGhyZWFkcy4KIAotUnVubmluZyBTZXJpYWxpemVkIEpvYnMKLT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUluaXRpYWxpemluZwotLS0tLS0tLS0tLS0tCi0KLVRoZSBmaXJzdCBzdGVwIGluIHVzaW5nIHBhZGF0YSB0byBydW4gc2VyaWFsaXplZCBqb2JzIGlzIHRvIHNldCB1cCBhCi1wYWRhdGFfaW5zdGFuY2Ugc3RydWN0dXJlIGZvciBvdmVyYWxsIGNvbnRyb2wgb2YgaG93IGpvYnMgYXJlIHRvIGJlIHJ1bjo6Ci0KLSAgICAjaW5jbHVkZSAmbHQ7bGludXgvcGFkYXRhLmgmZ3Q7Ci0KLSAgICBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwYWRhdGFfYWxsb2MoY29uc3QgY2hhciAqbmFtZSk7Ci0KLSYjMzk7bmFtZSYjMzk7IHNpbXBseSBpZGVudGlmaWVzIHRoZSBpbnN0YW5jZS4KLQotVGhlbiwgY29tcGxldGUgcGFkYXRhIGluaXRpYWxpemF0aW9uIGJ5IGFsbG9jYXRpbmcgYSBwYWRhdGFfc2hlbGw6OgotCi0gICBzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwYWRhdGFfYWxsb2Nfc2hlbGwoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpOwotCi1BIHBhZGF0YV9zaGVsbCBpcyB1c2VkIHRvIHN1Ym1pdCBhIGpvYiB0byBwYWRhdGEgYW5kIGFsbG93cyBhIHNlcmllcyBvZiBzdWNoCi1qb2JzIHRvIGJlIHNlcmlhbGl6ZWQgaW5kZXBlbmRlbnRseS4gIEEgcGFkYXRhX2luc3RhbmNlIG1heSBoYXZlIG9uZSBvciBtb3JlCi1wYWRhdGFfc2hlbGxzIGFzc29jaWF0ZWQgd2l0aCBpdCwgZWFjaCBhbGxvd2luZyBhIHNlcGFyYXRlIHNlcmllcyBvZiBqb2JzLgotCi1Nb2RpZnlpbmcgY3B1bWFza3MKLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgQ1BVcyB1c2VkIHRvIHJ1biBqb2JzIGNhbiBiZSBjaGFuZ2VkIGluIHR3byB3YXlzLCBwcm9ncmFtbWF0aWNhbGx5IHdpdGgKLXBhZGF0YV9zZXRfY3B1bWFzaygpIG9yIHZpYSBzeXNmcy4gIFRoZSBmb3JtZXIgaXMgZGVmaW5lZDo6Ci0KLSAgICBpbnQgcGFkYXRhX3NldF9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgY3B1bWFza190eXBlLAotCQkJICAgY3B1bWFza192YXJfdCBjcHVtYXNrKTsKLQotSGVyZSBjcHVtYXNrX3R5cGUgaXMgb25lIG9mIFBBREFUQV9DUFVfUEFSQUxMRUwgb3IgUEFEQVRBX0NQVV9TRVJJQUwsIHdoZXJlIGEKLXBhcmFsbGVsIGNwdW1hc2sgZGVzY3JpYmVzIHdoaWNoIHByb2Nlc3NvcnMgd2lsbCBiZSB1c2VkIHRvIGV4ZWN1dGUgam9icwotc3VibWl0dGVkIHRvIHRoaXMgaW5zdGFuY2UgaW4gcGFyYWxsZWwgYW5kIGEgc2VyaWFsIGNwdW1hc2sgZGVmaW5lcyB3aGljaAotcHJvY2Vzc29ycyBhcmUgYWxsb3dlZCB0byBiZSB1c2VkIGFzIHRoZSBzZXJpYWxpemF0aW9uIGNhbGxiYWNrIHByb2Nlc3Nvci4KLWNwdW1hc2sgc3BlY2lmaWVzIHRoZSBuZXcgY3B1bWFzayB0byB1c2UuCi0KLVRoZXJlIG1heSBiZSBzeXNmcyBmaWxlcyBmb3IgYW4gaW5zdGFuY2UmIzM5O3MgY3B1bWFza3MuICBGb3IgZXhhbXBsZSwgcGNyeXB0JiMzOTtzCi1saXZlIGluIC9zeXMva2VybmVsL3BjcnlwdC8mbHQ7aW5zdGFuY2UtbmFtZSZndDsuICBXaXRoaW4gYW4gaW5zdGFuY2UmIzM5O3MgZGlyZWN0b3J5Ci10aGVyZSBhcmUgdHdvIGZpbGVzLCBwYXJhbGxlbF9jcHVtYXNrIGFuZCBzZXJpYWxfY3B1bWFzaywgYW5kIGVpdGhlciBjcHVtYXNrCi1tYXkgYmUgY2hhbmdlZCBieSBlY2hvaW5nIGEgYml0bWFzayBpbnRvIHRoZSBmaWxlLCBmb3IgZXhhbXBsZTo6Ci0KLSAgICBlY2hvIGYgJmd0OyAvc3lzL2tlcm5lbC9wY3J5cHQvcGVuY3J5cHQvcGFyYWxsZWxfY3B1bWFzawotCi1SZWFkaW5nIG9uZSBvZiB0aGVzZSBmaWxlcyBzaG93cyB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrLCB3aGljaCBtYXkgYmUKLWRpZmZlcmVudCBmcm9tIHRoZSAmIzM5O3VzYWJsZSYjMzk7IGNwdW1hc2suCi0KLVBhZGF0YSBtYWludGFpbnMgdHdvIHBhaXJzIG9mIGNwdW1hc2tzIGludGVybmFsbHksIHRoZSB1c2VyLXN1cHBsaWVkIGNwdW1hc2tzCi1hbmQgdGhlICYjMzk7dXNhYmxlJiMzOTsgY3B1bWFza3MuICAoRWFjaCBwYWlyIGNvbnNpc3RzIG9mIGEgcGFyYWxsZWwgYW5kIGEgc2VyaWFsCi1jcHVtYXNrLikgIFRoZSB1c2VyLXN1cHBsaWVkIGNwdW1hc2tzIGRlZmF1bHQgdG8gYWxsIHBvc3NpYmxlIENQVXMgb24gaW5zdGFuY2UKLWFsbG9jYXRpb24gYW5kIG1heSBiZSBjaGFuZ2VkIGFzIGFib3ZlLiAgVGhlIHVzYWJsZSBjcHVtYXNrcyBhcmUgYWx3YXlzIGEKLXN1YnNldCBvZiB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrcyBhbmQgY29udGFpbiBvbmx5IHRoZSBvbmxpbmUgQ1BVcyBpbiB0aGUKLXVzZXItc3VwcGxpZWQgbWFza3M7IHRoZXNlIGFyZSB0aGUgY3B1bWFza3MgcGFkYXRhIGFjdHVhbGx5IHVzZXMuICBTbyBpdCBpcwotbGVnYWwgdG8gc3VwcGx5IGEgY3B1bWFzayB0byBwYWRhdGEgdGhhdCBjb250YWlucyBvZmZsaW5lIENQVXMuICBPbmNlIGFuCi1vZmZsaW5lIENQVSBpbiB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrIGNvbWVzIG9ubGluZSwgcGFkYXRhIGlzIGdvaW5nIHRvIHVzZQotaXQuCi0KLUNoYW5naW5nIHRoZSBDUFUgbWFza3MgYXJlIGV4cGVuc2l2ZSBvcGVyYXRpb25zLCBzbyBpdCBzaG91bGQgbm90IGJlIGRvbmUgd2l0aAotZ3JlYXQgZnJlcXVlbmN5LgotCi1SdW5uaW5nIEEgSm9iCi0tLS0tLS0tLS0tLS0tCi0KLUFjdHVhbGx5IHN1Ym1pdHRpbmcgd29yayB0byB0aGUgcGFkYXRhIGluc3RhbmNlIHJlcXVpcmVzIHRoZSBjcmVhdGlvbiBvZiBhCi1wYWRhdGFfcHJpdiBzdHJ1Y3R1cmUsIHdoaWNoIHJlcHJlc2VudHMgb25lIGpvYjo6Ci0KLSAgICBzdHJ1Y3QgcGFkYXRhX3ByaXYgewotICAgICAgICAvKiBPdGhlciBzdHVmZiBoZXJlLi4uICovCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgKCpwYXJhbGxlbCkoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICgqc2VyaWFsKShzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSk7Ci0gICAgfTsKLQotVGhpcyBzdHJ1Y3R1cmUgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGVtYmVkZGVkIHdpdGhpbiBzb21lIGxhcmdlcgotc3RydWN0dXJlIHNwZWNpZmljIHRvIHRoZSB3b3JrIHRvIGJlIGRvbmUuICBNb3N0IG9mIGl0cyBmaWVsZHMgYXJlIHByaXZhdGUgdG8KLXBhZGF0YSwgYnV0IHRoZSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIHplcm9lZCBhdCBpbml0aWFsaXNhdGlvbiB0aW1lLCBhbmQgdGhlCi1wYXJhbGxlbCgpIGFuZCBzZXJpYWwoKSBmdW5jdGlvbnMgc2hvdWxkIGJlIHByb3ZpZGVkLiAgVGhvc2UgZnVuY3Rpb25zIHdpbGwKLWJlIGNhbGxlZCBpbiB0aGUgcHJvY2VzcyBvZiBnZXR0aW5nIHRoZSB3b3JrIGRvbmUgYXMgd2Ugd2lsbCBzZWUKLW1vbWVudGFyaWx5LgotCi1UaGUgc3VibWlzc2lvbiBvZiB0aGUgam9iIGlzIGRvbmUgd2l0aDo6Ci0KLSAgICBpbnQgcGFkYXRhX2RvX3BhcmFsbGVsKHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzLAotCQkgICAgICAgICAgIHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhLCBpbnQgKmNiX2NwdSk7Ci0KLVRoZSBwcyBhbmQgcGFkYXRhIHN0cnVjdHVyZXMgbXVzdCBiZSBzZXQgdXAgYXMgZGVzY3JpYmVkIGFib3ZlOyBjYl9jcHUKLXBvaW50cyB0byB0aGUgcHJlZmVycmVkIENQVSB0byBiZSB1c2VkIGZvciB0aGUgZmluYWwgY2FsbGJhY2sgd2hlbiB0aGUgam9iIGlzCi1kb25lOyBpdCBtdXN0IGJlIGluIHRoZSBjdXJyZW50IGluc3RhbmNlJiMzOTtzIENQVSBtYXNrIChpZiBub3QgdGhlIGNiX2NwdSBwb2ludGVyCi1pcyB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBDUFUgYWN0dWFsbHkgY2hvc2VuKS4gIFRoZSByZXR1cm4gdmFsdWUgZnJvbQotcGFkYXRhX2RvX3BhcmFsbGVsKCkgaXMgemVybyBvbiBzdWNjZXNzLCBpbmRpY2F0aW5nIHRoYXQgdGhlIGpvYiBpcyBpbgotcHJvZ3Jlc3MuIC1FQlVTWSBtZWFucyB0aGF0IHNvbWVib2R5LCBzb21ld2hlcmUgZWxzZSBpcyBtZXNzaW5nIHdpdGggdGhlCi1pbnN0YW5jZSYjMzk7cyBDUFUgbWFzaywgd2hpbGUgLUVJTlZBTCBpcyBhIGNvbXBsYWludCBhYm91dCBjYl9jcHUgbm90IGJlaW5nIGluIHRoZQotc2VyaWFsIGNwdW1hc2ssIG5vIG9ubGluZSBDUFVzIGluIHRoZSBwYXJhbGxlbCBvciBzZXJpYWwgY3B1bWFza3MsIG9yIGEgc3RvcHBlZAotaW5zdGFuY2UuCi0KLUVhY2ggam9iIHN1Ym1pdHRlZCB0byBwYWRhdGFfZG9fcGFyYWxsZWwoKSB3aWxsLCBpbiB0dXJuLCBiZSBwYXNzZWQgdG8KLWV4YWN0bHkgb25lIGNhbGwgdG8gdGhlIGFib3ZlLW1lbnRpb25lZCBwYXJhbGxlbCgpIGZ1bmN0aW9uLCBvbiBvbmUgQ1BVLCBzbwotdHJ1ZSBwYXJhbGxlbGlzbSBpcyBhY2hpZXZlZCBieSBzdWJtaXR0aW5nIG11bHRpcGxlIGpvYnMuICBwYXJhbGxlbCgpIHJ1bnMgd2l0aAotc29mdHdhcmUgaW50ZXJydXB0cyBkaXNhYmxlZCBhbmQgdGh1cyBjYW5ub3Qgc2xlZXAuICBUaGUgcGFyYWxsZWwoKQotZnVuY3Rpb24gZ2V0cyB0aGUgcGFkYXRhX3ByaXYgc3RydWN0dXJlIHBvaW50ZXIgYXMgaXRzIGxvbmUgcGFyYW1ldGVyOwotaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjdHVhbCB3b3JrIHRvIGJlIGRvbmUgaXMgcHJvYmFibHkgb2J0YWluZWQgYnkgdXNpbmcKLWNvbnRhaW5lcl9vZigpIHRvIGZpbmQgdGhlIGVuY2xvc2luZyBzdHJ1Y3R1cmUuCi0KLU5vdGUgdGhhdCBwYXJhbGxlbCgpIGhhcyBubyByZXR1cm4gdmFsdWU7IHRoZSBwYWRhdGEgc3Vic3lzdGVtIGFzc3VtZXMgdGhhdAotcGFyYWxsZWwoKSB3aWxsIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBqb2IgZnJvbSB0aGlzIHBvaW50LiAgVGhlIGpvYgotbmVlZCBub3QgYmUgY29tcGxldGVkIGR1cmluZyB0aGlzIGNhbGwsIGJ1dCwgaWYgcGFyYWxsZWwoKSBsZWF2ZXMgd29yawotb3V0c3RhbmRpbmcsIGl0IHNob3VsZCBiZSBwcmVwYXJlZCB0byBiZSBjYWxsZWQgYWdhaW4gd2l0aCBhIG5ldyBqb2IgYmVmb3JlCi10aGUgcHJldmlvdXMgb25lIGNvbXBsZXRlcy4KLQotU2VyaWFsaXppbmcgSm9icwotLS0tLS0tLS0tLS0tLS0tLQotCi1XaGVuIGEgam9iIGRvZXMgY29tcGxldGUsIHBhcmFsbGVsKCkgKG9yIHdoYXRldmVyIGZ1bmN0aW9uIGFjdHVhbGx5IGZpbmlzaGVzCi10aGUgd29yaykgc2hvdWxkIGluZm9ybSBwYWRhdGEgb2YgdGhlIGZhY3Qgd2l0aCBhIGNhbGwgdG86OgotCi0gICAgdm9pZCBwYWRhdGFfZG9fc2VyaWFsKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTsKLQotQXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLCBwYWRhdGFfZG9fc2VyaWFsKCkgd2lsbCB0cmlnZ2VyIGEgY2FsbCB0byB0aGUKLXNlcmlhbCgpIGZ1bmN0aW9uIGluIHRoZSBwYWRhdGFfcHJpdiBzdHJ1Y3R1cmUuICBUaGF0IGNhbGwgd2lsbCBoYXBwZW4gb24KLXRoZSBDUFUgcmVxdWVzdGVkIGluIHRoZSBpbml0aWFsIGNhbGwgdG8gcGFkYXRhX2RvX3BhcmFsbGVsKCk7IGl0LCB0b28sIGlzCi1ydW4gd2l0aCBsb2NhbCBzb2Z0d2FyZSBpbnRlcnJ1cHRzIGRpc2FibGVkLgotTm90ZSB0aGF0IHRoaXMgY2FsbCBtYXkgYmUgZGVmZXJyZWQgZm9yIGEgd2hpbGUgc2luY2UgdGhlIHBhZGF0YSBjb2RlIHRha2VzCi1wYWlucyB0byBlbnN1cmUgdGhhdCBqb2JzIGFyZSBjb21wbGV0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZQotc3VibWl0dGVkLgotCi1EZXN0cm95aW5nCi0tLS0tLS0tLS0tCi0KLUNsZWFuaW5nIHVwIGEgcGFkYXRhIGluc3RhbmNlIHByZWRpY3RhYmx5IGludm9sdmVzIGNhbGxpbmcgdGhlIHR3byBmcmVlCi1mdW5jdGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBhbGxvY2F0aW9uIGluIHJldmVyc2U6OgotCi0gICAgdm9pZCBwYWRhdGFfZnJlZV9zaGVsbChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcyk7Ci0gICAgdm9pZCBwYWRhdGFfZnJlZShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCk7Ci0KLUl0IGlzIHRoZSB1c2VyJiMzOTtzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSBhbGwgb3V0c3RhbmRpbmcgam9icyBhcmUgY29tcGxldGUKLWJlZm9yZSBhbnkgb2YgdGhlIGFib3ZlIGFyZSBjYWxsZWQuCi0KIFJ1bm5pbmcgTXVsdGl0aHJlYWRlZCBKb2JzCiA9PT09PT09PT09PT09PT09PT09PT09PT09PQogCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDgwNmJkMmQ4MGQxNTM1Li4yNjBiM2JkYzc2MTQ4YyAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKJiM0MzsmIzQzOyYjNDM7IGIvTUFJTlRBSU5FUlMKQEAgLTIxMDg1LDEzICYjNDM7MjEwODUsNiBAQCBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvcGNuZXQzMi5jCiAKLVBDUllQVCBQQVJBTExFTCBDUllQVE8gRU5HSU5FCi1NOglTdGVmZmVuIEtsYXNzZXJ0ICZsdDtzdGVmZmVuLmtsYXNzZXJ0QHNlY3VuZXQuY29tJmd0OwotTDoJbGludXgtY3J5cHRvQHZnZXIua2VybmVsLm9yZwotUzoJTWFpbnRhaW5lZAotRjoJY3J5cHRvL3BjcnlwdC5jCi1GOglpbmNsdWRlL2NyeXB0by9wY3J5cHQuaAotCiBQRFMgRFNDIFZJUlRJTyBEQVRBIFBBVEggQUNDRUxFUkFUT1IKIFI6CUJyZXR0IENyZWVsZXkgJmx0O2JyZXR0LmNyZWVsZXlAYW1kLmNvbSZndDsKIEY6CWRyaXZlcnMvdmRwYS9wZHMvCmRpZmYgLS1naXQgYS9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uMzJfZGVmY29uZmlnIGIvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjMyX2RlZmNvbmZpZwppbmRleCA3YzhmMDE1MTNlZDI3Yy4uY2Y5N2Y0NDkzNTczNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbG9vbmdhcmNoL2NvbmZpZ3MvbG9vbmdzb24zMl9kZWZjb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjMyX2RlZmNvbmZpZwpAQCAtMTA2Myw3ICYjNDM7MTA2Myw2IEBAIENPTkZJR19TRUNVUklUWV9ZQU1BPXkKIENPTkZJR19ERUZBVUxUX1NFQ1VSSVRZX0RBQz15CiBDT05GSUdfQ1JZUFRPX1VTRVI9bQogQ09ORklHX0NSWVBUT19TRUxGVEVTVFM9eQotQ09ORklHX0NSWVBUT19QQ1JZUFQ9bQogQ09ORklHX0NSWVBUT19DUllQVEQ9bQogQ09ORklHX0NSWVBUT19BTlVCSVM9bQogQ09ORklHX0NSWVBUT19CTE9XRklTSD1tCmRpZmYgLS1naXQgYS9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uNjRfZGVmY29uZmlnIGIvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjY0X2RlZmNvbmZpZwppbmRleCA4ZTM5MDZkM2JkNzBjYS4uZDBlY2U3OTIwZjIxNTggMTAwNjQ0Ci0tLSBhL2FyY2gvbG9vbmdhcmNoL2NvbmZpZ3MvbG9vbmdzb242NF9kZWZjb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjY0X2RlZmNvbmZpZwpAQCAtMTA5Niw3ICYjNDM7MTA5Niw2IEBAIENPTkZJR19TRUNVUklUWV9ZQU1BPXkKIENPTkZJR19ERUZBVUxUX1NFQ1VSSVRZX0RBQz15CiBDT05GSUdfQ1JZUFRPX1VTRVI9bQogQ09ORklHX0NSWVBUT19TRUxGVEVTVFM9eQotQ09ORklHX0NSWVBUT19QQ1JZUFQ9bQogQ09ORklHX0NSWVBUT19DUllQVEQ9bQogQ09ORklHX0NSWVBUT19BTlVCSVM9bQogQ09ORklHX0NSWVBUT19CTE9XRklTSD1tCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY29uZmlncy9kZWJ1Z19kZWZjb25maWcgYi9hcmNoL3MzOTAvY29uZmlncy9kZWJ1Z19kZWZjb25maWcKaW5kZXggNTQ2MzdiZTg3ZmI3MzUuLjE1ZjUxY2I5MjRkYmYwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY29uZmlncy9kZWJ1Z19kZWZjb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9zMzkwL2NvbmZpZ3MvZGVidWdfZGVmY29uZmlnCkBAIC03NjUsNyAmIzQzOzc2NSw2IEBAIENPTkZJR19DUllQVE9fVVNFUj1tCiBDT05GSUdfQ1JZUFRPX1NFTEZURVNUUz15CiBDT05GSUdfQ1JZUFRPX1NFTEZURVNUU19GVUxMPXkKIENPTkZJR19DUllQVE9fTlVMTD15Ci1DT05GSUdfQ1JZUFRPX1BDUllQVD1tCiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tCiBDT05GSUdfQ1JZUFRPX0JFTkNITUFSSz1tCiBDT05GSUdfQ1JZUFRPX0RIPW0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jb25maWdzL2RlZmNvbmZpZyBiL2FyY2gvczM5MC9jb25maWdzL2RlZmNvbmZpZwppbmRleCA1ZjUxMTRhMjUzY2Y3Yy4uODgyNTdmZjNjMmM2YWEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jb25maWdzL2RlZmNvbmZpZwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3MzOTAvY29uZmlncy9kZWZjb25maWcKQEAgLTc0OSw3ICYjNDM7NzQ5LDYgQEAgQ09ORklHX0NSWVBUT19GSVBTPXkKIENPTkZJR19DUllQVE9fVVNFUj1tCiBDT05GSUdfQ1JZUFRPX1NFTEZURVNUUz15CiBDT05GSUdfQ1JZUFRPX05VTEw9eQotQ09ORklHX0NSWVBUT19QQ1JZUFQ9bQogQ09ORklHX0NSWVBUT19DUllQVEQ9bQogQ09ORklHX0NSWVBUT19CRU5DSE1BUks9bQogQ09ORklHX0NSWVBUT19ESD1tCmRpZmYgLS1naXQgYS9jcnlwdG8vS2NvbmZpZyBiL2NyeXB0by9LY29uZmlnCmluZGV4IGYxZTM3MjE5NTI3MzE2Li4yMjhhN2FjOWYwNjNhMiAxMDA2NDQKLS0tIGEvY3J5cHRvL0tjb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvY3J5cHRvL0tjb25maWcKQEAgLTIwMSwxNiAmIzQzOzIwMSw2IEBAIGNvbmZpZyBDUllQVE9fTlVMTAogCWhlbHAKIAkgIFRoZXNlIGFyZSAmIzM5O051bGwmIzM5OyBhbGdvcml0aG1zLCB1c2VkIGJ5IElQc2VjLCB3aGljaCBkbyBub3RoaW5nLgogCi1jb25maWcgQ1JZUFRPX1BDUllQVAotCXRyaXN0YXRlICYjMzQ7UGFyYWxsZWwgY3J5cHRvIGVuZ2luZSYjMzQ7Ci0JZGVwZW5kcyBvbiBTTVAKLQlzZWxlY3QgUEFEQVRBCi0Jc2VsZWN0IENSWVBUT19NQU5BR0VSCi0Jc2VsZWN0IENSWVBUT19BRUFECi0JaGVscAotCSAgVGhpcyBjb252ZXJ0cyBhbiBhcmJpdHJhcnkgY3J5cHRvIGFsZ29yaXRobSBpbnRvIGEgcGFyYWxsZWwKLQkgIGFsZ29yaXRobSB0aGF0IGV4ZWN1dGVzIGluIGtlcm5lbCB0aHJlYWRzLgotCiBjb25maWcgQ1JZUFRPX0NSWVBURAogCXRyaXN0YXRlICYjMzQ7U29mdHdhcmUgYXN5bmMgY3J5cHRvIGRhZW1vbiYjMzQ7CiAJc2VsZWN0IENSWVBUT19BRUFECmRpZmYgLS1naXQgYS9jcnlwdG8vTWFrZWZpbGUgYi9jcnlwdG8vTWFrZWZpbGUKaW5kZXggODM4NmQ1NWE5NzU1ZTcuLjJlNDg3Yzk0NmU2M2Q3IDEwMDY0NAotLS0gYS9jcnlwdG8vTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvY3J5cHRvL01ha2VmaWxlCkBAIC0xMjAsNyAmIzQzOzEyMCw2IEBAIENGTEFHU19hZWdpczEyOC1uZW9uLWlubmVyLm8gJiM0Mzs9ICQoYWVnaXMxMjgtY2ZsYWdzLXkpCiBhZWdpczEyOC0kKENPTkZJR19DUllQVE9fQUVHSVMxMjhfU0lNRCkgJiM0Mzs9IGFlZ2lzMTI4LW5lb24ubyBhZWdpczEyOC1uZW9uLWlubmVyLm8KIGVuZGlmCiAKLW9iai0kKENPTkZJR19DUllQVE9fUENSWVBUKSAmIzQzOz0gcGNyeXB0Lm8KIG9iai0kKENPTkZJR19DUllQVE9fQ1JZUFREKSAmIzQzOz0gY3J5cHRkLm8KIG9iai0kKENPTkZJR19DUllQVE9fREVTKSAmIzQzOz0gZGVzX2dlbmVyaWMubwogb2JqLSQoQ09ORklHX0NSWVBUT19CTE9XRklTSCkgJiM0Mzs9IGJsb3dmaXNoX2dlbmVyaWMubwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3BjcnlwdC5jIGIvY3J5cHRvL3BjcnlwdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjM3MjQ0Mjk4MWU2NS4uMDAwMDAwMDAwMDAwMDAKLS0tIGEvY3J5cHRvL3BjcnlwdC5jCiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGwKQEAgLTEsMzk0ICYjNDM7MCwwIEBACi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Ci0vKgotICogcGNyeXB0IC0gUGFyYWxsZWwgY3J5cHRvIHdyYXBwZXIuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5IHNlY3VuZXQgU2VjdXJpdHkgTmV0d29ya3MgQUcKLSAqIENvcHlyaWdodCAoQykgMjAwOSBTdGVmZmVuIEtsYXNzZXJ0ICZsdDtzdGVmZmVuLmtsYXNzZXJ0QHNlY3VuZXQuY29tJmd0OwotICovCi0KLSNpbmNsdWRlICZsdDtjcnlwdG8vYWxnYXBpLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7Y3J5cHRvL2ludGVybmFsL2FlYWQuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9hdG9taWMuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9lcnIuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9pbml0LmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvbW9kdWxlLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvc2xhYi5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2tvYmplY3QuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9jcHUuaCZndDsKLSNpbmNsdWRlICZsdDtjcnlwdG8vcGNyeXB0LmgmZ3Q7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwZW5jcnlwdDsKLXN0YXRpYyBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwZGVjcnlwdDsKLXN0YXRpYyBzdHJ1Y3Qga3NldCAgICAgICAgICAgKnBjcnlwdF9rc2V0OwotCi1zdHJ1Y3QgcGNyeXB0X2luc3RhbmNlX2N0eCB7Ci0Jc3RydWN0IGNyeXB0b19hZWFkX3NwYXduIHNwYXduOwotCXN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzZW5jOwotCXN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzZGVjOwotCWF0b21pY190IHRmbV9jb3VudDsKLX07Ci0KLXN0cnVjdCBwY3J5cHRfYWVhZF9jdHggewotCXN0cnVjdCBjcnlwdG9fYWVhZCAqY2hpbGQ7Ci0JdW5zaWduZWQgaW50IGNiX2NwdTsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHBjcnlwdF9pbnN0YW5jZV9jdHggKnBjcnlwdF90Zm1faWN0eCgKLQlzdHJ1Y3QgY3J5cHRvX2FlYWQgKnRmbSkKLXsKLQlyZXR1cm4gYWVhZF9pbnN0YW5jZV9jdHgoYWVhZF9hbGdfaW5zdGFuY2UodGZtKSk7Ci19Ci0KLXN0YXRpYyBpbnQgcGNyeXB0X2FlYWRfc2V0a2V5KHN0cnVjdCBjcnlwdG9fYWVhZCAqcGFyZW50LAotCQkJICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKLXsKLQlzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgocGFyZW50KTsKLQotCXJldHVybiBjcnlwdG9fYWVhZF9zZXRrZXkoY3R4LSZndDtjaGlsZCwga2V5LCBrZXlsZW4pOwotfQotCi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX3NldGF1dGhzaXplKHN0cnVjdCBjcnlwdG9fYWVhZCAqcGFyZW50LAotCQkJCSAgIHVuc2lnbmVkIGludCBhdXRoc2l6ZSkKLXsKLQlzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgocGFyZW50KTsKLQotCXJldHVybiBjcnlwdG9fYWVhZF9zZXRhdXRoc2l6ZShjdHgtJmd0O2NoaWxkLCBhdXRoc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjcnlwdF9hZWFkX3NlcmlhbChzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSkKLXsKLQlzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnByZXEgPSBwY3J5cHRfcGFkYXRhX3JlcXVlc3QocGFkYXRhKTsKLQlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBwY3J5cHRfcmVxdWVzdF9jdHgocHJlcSk7Ci0KLQlhZWFkX3JlcXVlc3RfY29tcGxldGUocmVxLSZndDtiYXNlLmRhdGEsIHBhZGF0YS0mZ3Q7aW5mbyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjcnlwdF9hZWFkX2RvbmUodm9pZCAqZGF0YSwgaW50IGVycikKLXsKLQlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBkYXRhOwotCXN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IGFlYWRfcmVxdWVzdF9jdHgocmVxKTsKLQlzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSA9IHBjcnlwdF9yZXF1ZXN0X3BhZGF0YShwcmVxKTsKLQotCWlmIChlcnIgPT0gLUVJTlBST0dSRVNTKQotCQlyZXR1cm47Ci0KLQlwYWRhdGEtJmd0O2luZm8gPSBlcnI7Ci0KLQlwYWRhdGFfZG9fc2VyaWFsKHBhZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjcnlwdF9hZWFkX2VuYyhzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSkKLXsKLQlzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnByZXEgPSBwY3J5cHRfcGFkYXRhX3JlcXVlc3QocGFkYXRhKTsKLQlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBwY3J5cHRfcmVxdWVzdF9jdHgocHJlcSk7Ci0JaW50IHJldDsKLQotCXJldCA9IGNyeXB0b19hZWFkX2VuY3J5cHQocmVxKTsKLQotCWlmIChyZXQgPT0gLUVJTlBST0dSRVNTIHx8IHJldCA9PSAtRUJVU1kpCi0JCXJldHVybjsKLQotCXBhZGF0YS0mZ3Q7aW5mbyA9IHJldDsKLQlwYWRhdGFfZG9fc2VyaWFsKHBhZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgcGNyeXB0X2FlYWRfZW5jcnlwdChzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnByZXEgPSBhZWFkX3JlcXVlc3RfY3R4KHJlcSk7Ci0Jc3RydWN0IGFlYWRfcmVxdWVzdCAqY3JlcSA9IHBjcnlwdF9yZXF1ZXN0X2N0eChwcmVxKTsKLQlzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSA9IHBjcnlwdF9yZXF1ZXN0X3BhZGF0YShwcmVxKTsKLQlzdHJ1Y3QgY3J5cHRvX2FlYWQgKmFlYWQgPSBjcnlwdG9fYWVhZF9yZXF0Zm0ocmVxKTsKLQlzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgoYWVhZCk7Ci0JdTMyIGZsYWdzID0gYWVhZF9yZXF1ZXN0X2ZsYWdzKHJlcSk7Ci0Jc3RydWN0IHBjcnlwdF9pbnN0YW5jZV9jdHggKmljdHg7Ci0KLQlpY3R4ID0gcGNyeXB0X3RmbV9pY3R4KGFlYWQpOwotCi0JbWVtc2V0KHBhZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBwYWRhdGFfcHJpdikpOwotCi0JcGFkYXRhLSZndDtwYXJhbGxlbCA9IHBjcnlwdF9hZWFkX2VuYzsKLQlwYWRhdGEtJmd0O3NlcmlhbCA9IHBjcnlwdF9hZWFkX3NlcmlhbDsKLQotCWFlYWRfcmVxdWVzdF9zZXRfdGZtKGNyZXEsIGN0eC0mZ3Q7Y2hpbGQpOwotCWFlYWRfcmVxdWVzdF9zZXRfY2FsbGJhY2soY3JlcSwgZmxhZ3MgJmFtcDsgfkNSWVBUT19URk1fUkVRX01BWV9TTEVFUCwKLQkJCQkgIHBjcnlwdF9hZWFkX2RvbmUsIHJlcSk7Ci0JYWVhZF9yZXF1ZXN0X3NldF9jcnlwdChjcmVxLCByZXEtJmd0O3NyYywgcmVxLSZndDtkc3QsCi0JCQkgICAgICAgcmVxLSZndDtjcnlwdGxlbiwgcmVxLSZndDtpdik7Ci0JYWVhZF9yZXF1ZXN0X3NldF9hZChjcmVxLCByZXEtJmd0O2Fzc29jbGVuKTsKLQotCWVyciA9IHBhZGF0YV9kb19wYXJhbGxlbChpY3R4LSZndDtwc2VuYywgcGFkYXRhLCAmYW1wO2N0eC0mZ3Q7Y2JfY3B1KTsKLQlpZiAoIWVycikKLQkJcmV0dXJuIC1FSU5QUk9HUkVTUzsKLQlpZiAoZXJyID09IC1FQlVTWSkgewotCQkvKiB0cnkgbm9uLXBhcmFsbGVsIG1vZGUgKi8KLQkJYWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhjcmVxLCBmbGFncywgcmVxLSZndDtiYXNlLmNvbXBsZXRlLAotCQkJCQkgIHJlcS0mZ3Q7YmFzZS5kYXRhKTsKLQkJcmV0dXJuIGNyeXB0b19hZWFkX2VuY3J5cHQoY3JlcSk7Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgcGNyeXB0X2FlYWRfZGVjKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKQotewotCXN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IHBjcnlwdF9wYWRhdGFfcmVxdWVzdChwYWRhdGEpOwotCXN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSA9IHBjcnlwdF9yZXF1ZXN0X2N0eChwcmVxKTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gY3J5cHRvX2FlYWRfZGVjcnlwdChyZXEpOwotCi0JaWYgKHJldCA9PSAtRUlOUFJPR1JFU1MgfHwgcmV0ID09IC1FQlVTWSkKLQkJcmV0dXJuOwotCi0JcGFkYXRhLSZndDtpbmZvID0gcmV0OwotCXBhZGF0YV9kb19zZXJpYWwocGFkYXRhKTsKLX0KLQotc3RhdGljIGludCBwY3J5cHRfYWVhZF9kZWNyeXB0KHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IGFlYWRfcmVxdWVzdF9jdHgocmVxKTsKLQlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpjcmVxID0gcGNyeXB0X3JlcXVlc3RfY3R4KHByZXEpOwotCXN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhID0gcGNyeXB0X3JlcXVlc3RfcGFkYXRhKHByZXEpOwotCXN0cnVjdCBjcnlwdG9fYWVhZCAqYWVhZCA9IGNyeXB0b19hZWFkX3JlcXRmbShyZXEpOwotCXN0cnVjdCBwY3J5cHRfYWVhZF9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eChhZWFkKTsKLQl1MzIgZmxhZ3MgPSBhZWFkX3JlcXVlc3RfZmxhZ3MocmVxKTsKLQlzdHJ1Y3QgcGNyeXB0X2luc3RhbmNlX2N0eCAqaWN0eDsKLQotCWljdHggPSBwY3J5cHRfdGZtX2ljdHgoYWVhZCk7Ci0KLQltZW1zZXQocGFkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHBhZGF0YV9wcml2KSk7Ci0KLQlwYWRhdGEtJmd0O3BhcmFsbGVsID0gcGNyeXB0X2FlYWRfZGVjOwotCXBhZGF0YS0mZ3Q7c2VyaWFsID0gcGNyeXB0X2FlYWRfc2VyaWFsOwotCi0JYWVhZF9yZXF1ZXN0X3NldF90Zm0oY3JlcSwgY3R4LSZndDtjaGlsZCk7Ci0JYWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhjcmVxLCBmbGFncyAmYW1wOyB+Q1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQLAotCQkJCSAgcGNyeXB0X2FlYWRfZG9uZSwgcmVxKTsKLQlhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KGNyZXEsIHJlcS0mZ3Q7c3JjLCByZXEtJmd0O2RzdCwKLQkJCSAgICAgICByZXEtJmd0O2NyeXB0bGVuLCByZXEtJmd0O2l2KTsKLQlhZWFkX3JlcXVlc3Rfc2V0X2FkKGNyZXEsIHJlcS0mZ3Q7YXNzb2NsZW4pOwotCi0JZXJyID0gcGFkYXRhX2RvX3BhcmFsbGVsKGljdHgtJmd0O3BzZGVjLCBwYWRhdGEsICZhbXA7Y3R4LSZndDtjYl9jcHUpOwotCWlmICghZXJyKQotCQlyZXR1cm4gLUVJTlBST0dSRVNTOwotCWlmIChlcnIgPT0gLUVCVVNZKSB7Ci0JCS8qIHRyeSBub24tcGFyYWxsZWwgbW9kZSAqLwotCQlhZWFkX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKGNyZXEsIGZsYWdzLCByZXEtJmd0O2Jhc2UuY29tcGxldGUsCi0JCQkJCSAgcmVxLSZndDtiYXNlLmRhdGEpOwotCQlyZXR1cm4gY3J5cHRvX2FlYWRfZGVjcnlwdChjcmVxKTsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX2luaXRfdGZtKHN0cnVjdCBjcnlwdG9fYWVhZCAqdGZtKQotewotCWludCBjcHVfaW5kZXg7Ci0Jc3RydWN0IGFlYWRfaW5zdGFuY2UgKmluc3QgPSBhZWFkX2FsZ19pbnN0YW5jZSh0Zm0pOwotCXN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4ICppY3R4ID0gYWVhZF9pbnN0YW5jZV9jdHgoaW5zdCk7Ci0Jc3RydWN0IHBjcnlwdF9hZWFkX2N0eCAqY3R4ID0gY3J5cHRvX2FlYWRfY3R4KHRmbSk7Ci0Jc3RydWN0IGNyeXB0b19hZWFkICpjaXBoZXI7Ci0KLQljcHVfaW5kZXggPSAodW5zaWduZWQgaW50KWF0b21pY19pbmNfcmV0dXJuKCZhbXA7aWN0eC0mZ3Q7dGZtX2NvdW50KSAlCi0JCSAgICBjcHVtYXNrX3dlaWdodChjcHVfb25saW5lX21hc2spOwotCi0JY3R4LSZndDtjYl9jcHUgPSBjcHVtYXNrX250aChjcHVfaW5kZXgsIGNwdV9vbmxpbmVfbWFzayk7Ci0JY2lwaGVyID0gY3J5cHRvX3NwYXduX2FlYWQoJmFtcDtpY3R4LSZndDtzcGF3bik7Ci0KLQlpZiAoSVNfRVJSKGNpcGhlcikpCi0JCXJldHVybiBQVFJfRVJSKGNpcGhlcik7Ci0KLQljdHgtJmd0O2NoaWxkID0gY2lwaGVyOwotCWNyeXB0b19hZWFkX3NldF9yZXFzaXplKHRmbSwgc2l6ZW9mKHN0cnVjdCBwY3J5cHRfcmVxdWVzdCkgJiM0MzsKLQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgYWVhZF9yZXF1ZXN0KSAmIzQzOwotCQkJCSAgICAgY3J5cHRvX2FlYWRfcmVxc2l6ZShjaXBoZXIpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwY3J5cHRfYWVhZF9leGl0X3RmbShzdHJ1Y3QgY3J5cHRvX2FlYWQgKnRmbSkKLXsKLQlzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgodGZtKTsKLQotCWNyeXB0b19mcmVlX2FlYWQoY3R4LSZndDtjaGlsZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjcnlwdF9mcmVlKHN0cnVjdCBhZWFkX2luc3RhbmNlICppbnN0KQotewotCXN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4ICpjdHggPSBhZWFkX2luc3RhbmNlX2N0eChpbnN0KTsKLQotCWNyeXB0b19kcm9wX2FlYWQoJmFtcDtjdHgtJmd0O3NwYXduKTsKLQlwYWRhdGFfZnJlZV9zaGVsbChjdHgtJmd0O3BzZGVjKTsKLQlwYWRhdGFfZnJlZV9zaGVsbChjdHgtJmd0O3BzZW5jKTsKLQlrZnJlZShpbnN0KTsKLX0KLQotc3RhdGljIGludCBwY3J5cHRfaW5pdF9pbnN0YW5jZShzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICppbnN0LAotCQkJCXN0cnVjdCBjcnlwdG9fYWxnICphbGcpCi17Ci0JaWYgKHNucHJpbnRmKGluc3QtJmd0O2FsZy5jcmFfZHJpdmVyX25hbWUsIENSWVBUT19NQVhfQUxHX05BTUUsCi0JCSAgICAgJiMzNDtwY3J5cHQoJXMpJiMzNDssIGFsZy0mZ3Q7Y3JhX2RyaXZlcl9uYW1lKSAmZ3Q7PSBDUllQVE9fTUFYX0FMR19OQU1FKQotCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKLQotCW1lbWNweShpbnN0LSZndDthbGcuY3JhX25hbWUsIGFsZy0mZ3Q7Y3JhX25hbWUsIENSWVBUT19NQVhfQUxHX05BTUUpOwotCi0JaW5zdC0mZ3Q7YWxnLmNyYV9wcmlvcml0eSA9IGFsZy0mZ3Q7Y3JhX3ByaW9yaXR5ICYjNDM7IDEwMDsKLQlpbnN0LSZndDthbGcuY3JhX2Jsb2Nrc2l6ZSA9IGFsZy0mZ3Q7Y3JhX2Jsb2Nrc2l6ZTsKLQlpbnN0LSZndDthbGcuY3JhX2FsaWdubWFzayA9IGFsZy0mZ3Q7Y3JhX2FsaWdubWFzazsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBjcnlwdF9jcmVhdGVfYWVhZChzdHJ1Y3QgY3J5cHRvX3RlbXBsYXRlICp0bXBsLCBzdHJ1Y3QgcnRhdHRyICoqdGIsCi0JCQkgICAgICBzdHJ1Y3QgY3J5cHRvX2F0dHJfdHlwZSAqYWxndCkKLXsKLQlzdHJ1Y3QgcGNyeXB0X2luc3RhbmNlX2N0eCAqY3R4OwotCXN0cnVjdCBhZWFkX2luc3RhbmNlICppbnN0OwotCXN0cnVjdCBhZWFkX2FsZyAqYWxnOwotCXUzMiBtYXNrID0gY3J5cHRvX2FsZ3RfaW5oZXJpdGVkX21hc2soYWxndCk7Ci0JaW50IGVycjsKLQotCWluc3QgPSBremFsbG9jKHNpemVvZigqaW5zdCkgJiM0Mzsgc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWluc3QpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZXJyID0gLUVOT01FTTsKLQotCWN0eCA9IGFlYWRfaW5zdGFuY2VfY3R4KGluc3QpOwotCWN0eC0mZ3Q7cHNlbmMgPSBwYWRhdGFfYWxsb2Nfc2hlbGwocGVuY3J5cHQpOwotCWlmICghY3R4LSZndDtwc2VuYykKLQkJZ290byBlcnJfZnJlZV9pbnN0OwotCi0JY3R4LSZndDtwc2RlYyA9IHBhZGF0YV9hbGxvY19zaGVsbChwZGVjcnlwdCk7Ci0JaWYgKCFjdHgtJmd0O3BzZGVjKQotCQlnb3RvIGVycl9mcmVlX2luc3Q7Ci0KLQllcnIgPSBjcnlwdG9fZ3JhYl9hZWFkKCZhbXA7Y3R4LSZndDtzcGF3biwgYWVhZF9jcnlwdG9faW5zdGFuY2UoaW5zdCksCi0JCQkgICAgICAgY3J5cHRvX2F0dHJfYWxnX25hbWUodGJbMV0pLCAwLCBtYXNrKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9mcmVlX2luc3Q7Ci0KLQlhbGcgPSBjcnlwdG9fc3Bhd25fYWVhZF9hbGcoJmFtcDtjdHgtJmd0O3NwYXduKTsKLQllcnIgPSBwY3J5cHRfaW5pdF9pbnN0YW5jZShhZWFkX2NyeXB0b19pbnN0YW5jZShpbnN0KSwgJmFtcDthbGctJmd0O2Jhc2UpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX2ZyZWVfaW5zdDsKLQotCWluc3QtJmd0O2FsZy5iYXNlLmNyYV9mbGFncyB8PSBDUllQVE9fQUxHX0FTWU5DOwotCi0JaW5zdC0mZ3Q7YWxnLml2c2l6ZSA9IGNyeXB0b19hZWFkX2FsZ19pdnNpemUoYWxnKTsKLQlpbnN0LSZndDthbGcubWF4YXV0aHNpemUgPSBjcnlwdG9fYWVhZF9hbGdfbWF4YXV0aHNpemUoYWxnKTsKLQotCWluc3QtJmd0O2FsZy5iYXNlLmNyYV9jdHhzaXplID0gc2l6ZW9mKHN0cnVjdCBwY3J5cHRfYWVhZF9jdHgpOwotCi0JaW5zdC0mZ3Q7YWxnLmluaXQgPSBwY3J5cHRfYWVhZF9pbml0X3RmbTsKLQlpbnN0LSZndDthbGcuZXhpdCA9IHBjcnlwdF9hZWFkX2V4aXRfdGZtOwotCi0JaW5zdC0mZ3Q7YWxnLnNldGtleSA9IHBjcnlwdF9hZWFkX3NldGtleTsKLQlpbnN0LSZndDthbGcuc2V0YXV0aHNpemUgPSBwY3J5cHRfYWVhZF9zZXRhdXRoc2l6ZTsKLQlpbnN0LSZndDthbGcuZW5jcnlwdCA9IHBjcnlwdF9hZWFkX2VuY3J5cHQ7Ci0JaW5zdC0mZ3Q7YWxnLmRlY3J5cHQgPSBwY3J5cHRfYWVhZF9kZWNyeXB0OwotCi0JaW5zdC0mZ3Q7ZnJlZSA9IHBjcnlwdF9mcmVlOwotCi0JZXJyID0gYWVhZF9yZWdpc3Rlcl9pbnN0YW5jZSh0bXBsLCBpbnN0KTsKLQlpZiAoZXJyKSB7Ci1lcnJfZnJlZV9pbnN0OgotCQlwY3J5cHRfZnJlZShpbnN0KTsKLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBwY3J5cHRfY3JlYXRlKHN0cnVjdCBjcnlwdG9fdGVtcGxhdGUgKnRtcGwsIHN0cnVjdCBydGF0dHIgKip0YikKLXsKLQlzdHJ1Y3QgY3J5cHRvX2F0dHJfdHlwZSAqYWxndDsKLQotCWFsZ3QgPSBjcnlwdG9fZ2V0X2F0dHJfdHlwZSh0Yik7Ci0JaWYgKElTX0VSUihhbGd0KSkKLQkJcmV0dXJuIFBUUl9FUlIoYWxndCk7Ci0KLQlzd2l0Y2ggKGFsZ3QtJmd0O3R5cGUgJmFtcDsgYWxndC0mZ3Q7bWFzayAmYW1wOyBDUllQVE9fQUxHX1RZUEVfTUFTSykgewotCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0FFQUQ6Ci0JCXJldHVybiBwY3J5cHRfY3JlYXRlX2FlYWQodG1wbCwgdGIsIGFsZ3QpOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHBjcnlwdF9zeXNmc19hZGQoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JaW50IHJldDsKLQotCXBpbnN0LSZndDtrb2JqLmtzZXQgPSBwY3J5cHRfa3NldDsKLQlyZXQgPSBrb2JqZWN0X2FkZCgmYW1wO3BpbnN0LSZndDtrb2JqLCBOVUxMLCAmIzM0OyVzJiMzNDssIG5hbWUpOwotCWlmICghcmV0KQotCQlrb2JqZWN0X3VldmVudCgmYW1wO3BpbnN0LSZndDtrb2JqLCBLT0JKX0FERCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHBjcnlwdF9pbml0X3BhZGF0YShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICoqcGluc3QsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JaW50IHJldCA9IC1FTk9NRU07Ci0KLQkqcGluc3QgPSBwYWRhdGFfYWxsb2MobmFtZSk7Ci0JaWYgKCEqcGluc3QpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBwY3J5cHRfc3lzZnNfYWRkKCpwaW5zdCwgbmFtZSk7Ci0JaWYgKHJldCkKLQkJcGFkYXRhX2ZyZWUoKnBpbnN0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY3J5cHRvX3RlbXBsYXRlIHBjcnlwdF90bXBsID0gewotCS5uYW1lID0gJiMzNDtwY3J5cHQmIzM0OywKLQkuY3JlYXRlID0gcGNyeXB0X2NyZWF0ZSwKLQkubW9kdWxlID0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBwY3J5cHRfaW5pdCh2b2lkKQotewotCWludCBlcnIgPSAtRU5PTUVNOwotCi0JcGNyeXB0X2tzZXQgPSBrc2V0X2NyZWF0ZV9hbmRfYWRkKCYjMzQ7cGNyeXB0JiMzNDssIE5VTEwsIGtlcm5lbF9rb2JqKTsKLQlpZiAoIXBjcnlwdF9rc2V0KQotCQlnb3RvIGVycjsKLQotCWVyciA9IHBjcnlwdF9pbml0X3BhZGF0YSgmYW1wO3BlbmNyeXB0LCAmIzM0O3BlbmNyeXB0JiMzNDspOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3VucmVnX2tzZXQ7Ci0KLQllcnIgPSBwY3J5cHRfaW5pdF9wYWRhdGEoJmFtcDtwZGVjcnlwdCwgJiMzNDtwZGVjcnlwdCYjMzQ7KTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9kZWluaXRfcGVuY3J5cHQ7Ci0KLQlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX3RlbXBsYXRlKCZhbXA7cGNyeXB0X3RtcGwpOwotCi1lcnJfZGVpbml0X3BlbmNyeXB0OgotCXBhZGF0YV9mcmVlKHBlbmNyeXB0KTsKLWVycl91bnJlZ19rc2V0OgotCWtzZXRfdW5yZWdpc3RlcihwY3J5cHRfa3NldCk7Ci1lcnI6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHBjcnlwdF9leGl0KHZvaWQpCi17Ci0JY3J5cHRvX3VucmVnaXN0ZXJfdGVtcGxhdGUoJmFtcDtwY3J5cHRfdG1wbCk7Ci0KLQlwYWRhdGFfZnJlZShwZW5jcnlwdCk7Ci0JcGFkYXRhX2ZyZWUocGRlY3J5cHQpOwotCi0Ja3NldF91bnJlZ2lzdGVyKHBjcnlwdF9rc2V0KTsKLX0KLQotbW9kdWxlX2luaXQocGNyeXB0X2luaXQpOwotbW9kdWxlX2V4aXQocGNyeXB0X2V4aXQpOwotCi1NT0RVTEVfTElDRU5TRSgmIzM0O0dQTCYjMzQ7KTsKLU1PRFVMRV9BVVRIT1IoJiMzNDtTdGVmZmVuIEtsYXNzZXJ0ICZsdDtzdGVmZmVuLmtsYXNzZXJ0QHNlY3VuZXQuY29tJmd0OyYjMzQ7KTsKLU1PRFVMRV9ERVNDUklQVElPTigmIzM0O1BhcmFsbGVsIGNyeXB0byB3cmFwcGVyJiMzNDspOwotTU9EVUxFX0FMSUFTX0NSWVBUTygmIzM0O3BjcnlwdCYjMzQ7KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3J5cHRvL3BjcnlwdC5oIGIvaW5jbHVkZS9jcnlwdG8vcGNyeXB0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNGQ3Y2YzY2Y1ZWFkLi4wMDAwMDAwMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NyeXB0by9wY3J5cHQuaAomIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsCkBAIC0xLDM5ICYjNDM7MCwwIEBACi0vKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovCi0vKgotICogcGNyeXB0IC0gUGFyYWxsZWwgY3J5cHRvIGVuZ2luZS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgc2VjdW5ldCBTZWN1cml0eSBOZXR3b3JrcyBBRwotICogQ29weXJpZ2h0IChDKSAyMDA5IFN0ZWZmZW4gS2xhc3NlcnQgJmx0O3N0ZWZmZW4ua2xhc3NlcnRAc2VjdW5ldC5jb20mZ3Q7Ci0gKi8KLQotI2lmbmRlZiBfQ1JZUFRPX1BDUllQVF9ICi0jZGVmaW5lIF9DUllQVE9fUENSWVBUX0gKLQotI2luY2x1ZGUgJmx0O2xpbnV4L2NvbnRhaW5lcl9vZi5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2NyeXB0by5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3BhZGF0YS5oJmd0OwotCi1zdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgewotCXN0cnVjdCBwYWRhdGFfcHJpdglwYWRhdGE7Ci0Jdm9pZAkJCSpkYXRhOwotCXZvaWQJCQkqX19jdHhbXSBDUllQVE9fTUlOQUxJR05fQVRUUjsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqcGNyeXB0X3JlcXVlc3RfY3R4KHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcmVxKQotewotCXJldHVybiByZXEtJmd0O19fY3R4OwotfQotCi1zdGF0aWMgaW5saW5lCi1zdHJ1Y3QgcGFkYXRhX3ByaXYgKnBjcnlwdF9yZXF1ZXN0X3BhZGF0YShzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnJlcSkKLXsKLQlyZXR1cm4gJmFtcDtyZXEtJmd0O3BhZGF0YTsKLX0KLQotc3RhdGljIGlubGluZQotc3RydWN0IHBjcnlwdF9yZXF1ZXN0ICpwY3J5cHRfcGFkYXRhX3JlcXVlc3Qoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihwYWRhdGEsIHN0cnVjdCBwY3J5cHRfcmVxdWVzdCwgcGFkYXRhKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oIGIvaW5jbHVkZS9saW51eC9wYWRhdGEuaAppbmRleCBiNjIzMmJlYTZlZGY1OS4uZWE0NWVhNjgwY2I3OTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGFkYXRhLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9wYWRhdGEuaApAQCAtMTIsMTEyICYjNDM7MTIsOCBAQAogI2lmbmRlZiBQQURBVEFfSAogI2RlZmluZSBQQURBVEFfSAogCi0jaW5jbHVkZSAmbHQ7bGludXgvcmVmY291bnQuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9jb21waWxlcl90eXBlcy5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3dvcmtxdWV1ZS5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3NwaW5sb2NrLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvbGlzdC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2tvYmplY3QuaCZndDsKLQotI2RlZmluZSBQQURBVEFfQ1BVX1NFUklBTCAgIDB4MDEKLSNkZWZpbmUgUEFEQVRBX0NQVV9QQVJBTExFTCAweDAyCi0KLS8qKgotICogc3RydWN0IHBhZGF0YV9wcml2IC0gUmVwcmVzZW50cyBvbmUgam9iCi0gKgotICogQGxpc3Q6IExpc3QgZW50cnksIHRvIGF0dGFjaCB0byB0aGUgcGFkYXRhIGxpc3RzLgotICogQHBkOiBQb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBjb250cm9sIHN0cnVjdHVyZS4KLSAqIEBjYl9jcHU6IENhbGxiYWNrIGNwdSBmb3Igc2VyaWFsaXphdGlvb24uCi0gKiBAc2VxX25yOiBTZXF1ZW5jZSBudW1iZXIgb2YgdGhlIHBhcmFsbGVsaXplZCBkYXRhIG9iamVjdC4KLSAqIEBpbmZvOiBVc2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGFyYWxsZWwgdG8gdGhlIHNlcmlhbCBmdW5jdGlvbi4KLSAqIEBwYXJhbGxlbDogUGFyYWxsZWwgZXhlY3V0aW9uIGZ1bmN0aW9uLgotICogQHNlcmlhbDogU2VyaWFsIGNvbXBsZXRlIGZ1bmN0aW9uLgotICovCi1zdHJ1Y3QgcGFkYXRhX3ByaXYgewotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKLQlzdHJ1Y3QgcGFyYWxsZWxfZGF0YQkqcGQ7Ci0JaW50CQkJY2JfY3B1OwotCXVuc2lnbmVkIGludAkJc2VxX25yOwotCWludAkJCWluZm87Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgKCpwYXJhbGxlbCkoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICgqc2VyaWFsKShzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSk7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBwYWRhdGFfbGlzdCAtIG9uZSBwZXIgd29yayB0eXBlIHBlciBDUFUKLSAqCi0gKiBAbGlzdDogTGlzdCBoZWFkLgotICogQGxvY2s6IExpc3QgbG9jay4KLSAqLwotc3RydWN0IHBhZGF0YV9saXN0IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBsaXN0OwotCXNwaW5sb2NrX3QgICAgICAgICAgICAgIGxvY2s7Ci19OwotCi0vKioKLSogc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUgLSBUaGUgcGVyY3B1IHBhZGF0YSBzZXJpYWwgcXVldWUKLSoKLSogQHNlcmlhbDogTGlzdCB0byB3YWl0IGZvciBzZXJpYWxpemF0aW9uIGFmdGVyIHJlb3JkZXJpbmcuCi0qIEB3b3JrOiB3b3JrIHN0cnVjdCBmb3Igc2VyaWFsaXphdGlvbi4KLSogQHBkOiBCYWNrcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgY29udHJvbCBzdHJ1Y3R1cmUuCi0qLwotc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUgewotICAgICAgIHN0cnVjdCBwYWRhdGFfbGlzdCAgICBzZXJpYWw7Ci0gICAgICAgc3RydWN0IHdvcmtfc3RydWN0ICAgIHdvcms7Ci0gICAgICAgc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgcGFkYXRhX2NwdW1hc2sgLSBUaGUgY3B1bWFza3MgZm9yIHRoZSBwYXJhbGxlbC9zZXJpYWwgd29ya2VycwotICoKLSAqIEBwY3B1OiBjcHVtYXNrIGZvciB0aGUgcGFyYWxsZWwgd29ya2Vycy4KLSAqIEBjYmNwdTogY3B1bWFzayBmb3IgdGhlIHNlcmlhbCAoY2FsbGJhY2spIHdvcmtlcnMuCi0gKi8KLXN0cnVjdCBwYWRhdGFfY3B1bWFzayB7Ci0JY3B1bWFza192YXJfdAlwY3B1OwotCWNwdW1hc2tfdmFyX3QJY2JjcHU7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBwYXJhbGxlbF9kYXRhIC0gSW50ZXJuYWwgY29udHJvbCBzdHJ1Y3R1cmUsIGNvdmVycyBldmVyeXRoaW5nCi0gKiB0aGF0IGRlcGVuZHMgb24gdGhlIGNwdW1hc2sgaW4gdXNlLgotICoKLSAqIEBwczogcGFkYXRhX3NoZWxsIG9iamVjdC4KLSAqIEByZW9yZGVyX2xpc3Q6IHBlcmNwdSByZW9yZGVyIGxpc3RzCi0gKiBAc3F1ZXVlOiBwZXJjcHUgcGFkYXRhIHF1ZXVlcyB1c2VkIGZvciBzZXJpYWx1emF0aW9uLgotICogQHJlZmNudDogTnVtYmVyIG9mIG9iamVjdHMgaG9sZGluZyBhIHJlZmVyZW5jZSBvbiB0aGlzIHBhcmFsbGVsX2RhdGEuCi0gKiBAc2VxX25yOiBTZXF1ZW5jZSBudW1iZXIgb2YgdGhlIHBhcmFsbGVsaXplZCBkYXRhIG9iamVjdC4KLSAqIEBwcm9jZXNzZWQ6IE51bWJlciBvZiBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RzLgotICogQGNwdTogTmV4dCBDUFUgdG8gYmUgcHJvY2Vzc2VkLgotICogQGNwdW1hc2s6IFRoZSBjcHVtYXNrcyBpbiB1c2UgZm9yIHBhcmFsbGVsIGFuZCBzZXJpYWwgd29ya2Vycy4KLSAqLwotc3RydWN0IHBhcmFsbGVsX2RhdGEgewotCXN0cnVjdCBwYWRhdGFfc2hlbGwJCSpwczsKLQlzdHJ1Y3QgcGFkYXRhX2xpc3QJCV9fcGVyY3B1ICpyZW9yZGVyX2xpc3Q7Ci0Jc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUJX19wZXJjcHUgKnNxdWV1ZTsKLQlyZWZjb3VudF90CQkJcmVmY250OwotCXVuc2lnbmVkIGludAkJCXNlcV9ucjsKLQl1bnNpZ25lZCBpbnQJCQlwcm9jZXNzZWQ7Ci0JaW50CQkJCWNwdTsKLQlzdHJ1Y3QgcGFkYXRhX2NwdW1hc2sJCWNwdW1hc2s7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBwYWRhdGFfc2hlbGwgLSBXcmFwcGVyIGFyb3VuZCBzdHJ1Y3QgcGFyYWxsZWxfZGF0YSwgaXRzCi0gKiBwdXJwb3NlIGlzIHRvIGFsbG93IHRoZSB1bmRlcmx5aW5nIGNvbnRyb2wgc3RydWN0dXJlIHRvIGJlIHJlcGxhY2VkCi0gKiBvbiB0aGUgZmx5IHVzaW5nIFJDVS4KLSAqCi0gKiBAcGluc3Q6IHBhZGF0IGluc3RhbmNlLgotICogQHBkOiBBY3R1YWwgcGFyYWxsZWxfZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggbWF5IGJlIHN1YnN0aXR1dGVkIG9uIHRoZSBmbHkuCi0gKiBAb3BkOiBQb2ludGVyIHRvIG9sZCBwZCB0byBiZSBmcmVlZCBieSBwYWRhdGFfcmVwbGFjZS4KLSAqIEBsaXN0OiBMaXN0IGVudHJ5IGluIHBhZGF0YV9pbnN0YW5jZSBsaXN0LgotICovCi1zdHJ1Y3QgcGFkYXRhX3NoZWxsIHsKLQlzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlCQkqcGluc3Q7Ci0Jc3RydWN0IHBhcmFsbGVsX2RhdGEgX19yY3UJKnBkOwotCXN0cnVjdCBwYXJhbGxlbF9kYXRhCQkqb3BkOwotCXN0cnVjdCBsaXN0X2hlYWQJCWxpc3Q7Ci19OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9pbml0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7CiAKIC8qKgogICogc3RydWN0IHBhZGF0YV9tdF9qb2IgLSByZXByZXNlbnRzIG9uZSBtdWx0aXRocmVhZGVkIGpvYgpAQCAtMTQ2LDQ2ICYjNDM7NDIsOSBAQCBzdHJ1Y3QgcGFkYXRhX210X2pvYiB7CiAJYm9vbAkJCW51bWFfYXdhcmU7CiB9OwogCi0vKioKLSAqIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgLSBUaGUgb3ZlcmFsbCBjb250cm9sIHN0cnVjdHVyZS4KLSAqCi0gKiBAY3B1aHBfbm9kZTogTGlua2FnZSBmb3IgQ1BVIGhvdHBsdWcgY2FsbGJhY2tzLgotICogQHBhcmFsbGVsX3dxOiBUaGUgd29ya3F1ZXVlIHVzZWQgZm9yIHBhcmFsbGVsIHdvcmsuCi0gKiBAc2VyaWFsX3dxOiBUaGUgd29ya3F1ZXVlIHVzZWQgZm9yIHNlcmlhbCB3b3JrLgotICogQHBzbGlzdDogTGlzdCBvZiBwYWRhdGFfc2hlbGwgb2JqZWN0cyBhdHRhY2hlZCB0byB0aGlzIGluc3RhbmNlLgotICogQGNwdW1hc2s6IFVzZXIgc3VwcGxpZWQgY3B1bWFza3MgZm9yIHBhcmFsbGVsIGFuZCBzZXJpYWwgd29ya3MuCi0gKiBAdmFsaWRhdGVfY3B1bWFzazogSW50ZXJuYWwgY3B1bWFzayB1c2VkIHRvIHZhbGlkYXRlIEBjcHVtYXNrIGR1cmluZyBob3RwbHVnLgotICogQGtvYmo6IHBhZGF0YSBpbnN0YW5jZSBrZXJuZWwgb2JqZWN0LgotICogQGxvY2s6IHBhZGF0YSBpbnN0YW5jZSBsb2NrLgotICogQGZsYWdzOiBwYWRhdGEgZmxhZ3MuCi0gKi8KLXN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgewotCXN0cnVjdCBobGlzdF9ub2RlCQljcHVocF9ub2RlOwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0CQkqcGFyYWxsZWxfd3E7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJCSpzZXJpYWxfd3E7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJcHNsaXN0OwotCXN0cnVjdCBwYWRhdGFfY3B1bWFzawkJY3B1bWFzazsKLQljcHVtYXNrX3Zhcl90CQkJdmFsaWRhdGVfY3B1bWFzazsKLQlzdHJ1Y3Qga29iamVjdCAgICAgICAgICAgICAgICAgICBrb2JqOwotCXN0cnVjdCBtdXRleAkJCSBsb2NrOwotCXU4CQkJCSBmbGFnczsKLSNkZWZpbmUJUEFEQVRBX0lOSVQJMQotI2RlZmluZQlQQURBVEFfUkVTRVQJMgotI2RlZmluZQlQQURBVEFfSU5WQUxJRAk0Ci19OwotCiAjaWZkZWYgQ09ORklHX1BBREFUQQogZXh0ZXJuIHZvaWQgX19pbml0IHBhZGF0YV9pbml0KHZvaWQpOwotZXh0ZXJuIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBhZGF0YV9hbGxvYyhjb25zdCBjaGFyICpuYW1lKTsKLWV4dGVybiB2b2lkIHBhZGF0YV9mcmVlKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KTsKLWV4dGVybiBzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwYWRhdGFfYWxsb2Nfc2hlbGwoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpOwotZXh0ZXJuIHZvaWQgcGFkYXRhX2ZyZWVfc2hlbGwoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMpOwotZXh0ZXJuIGludCBwYWRhdGFfZG9fcGFyYWxsZWwoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsCi0JCQkgICAgICBzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSwgaW50ICpjYl9jcHUpOwotZXh0ZXJuIHZvaWQgcGFkYXRhX2RvX3NlcmlhbChzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSk7CiBleHRlcm4gdm9pZCBfX2luaXQgcGFkYXRhX2RvX211bHRpdGhyZWFkZWQoc3RydWN0IHBhZGF0YV9tdF9qb2IgKmpvYik7Ci1leHRlcm4gaW50IHBhZGF0YV9zZXRfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdW1hc2tfdHlwZSwKLQkJCSAgICAgIGNwdW1hc2tfdmFyX3QgY3B1bWFzayk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBwYWRhdGFfaW5pdCh2b2lkKSB7fQogc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBwYWRhdGFfZG9fbXVsdGl0aHJlYWRlZChzdHJ1Y3QgcGFkYXRhX210X2pvYiAqam9iKQpkaWZmIC0tZ2l0IGEva2VybmVsL3BhZGF0YS5jIGIva2VybmVsL3BhZGF0YS5jCmluZGV4IDBkM2VhMWI2OGIxZjcwLi42ZWIxMzBkMzEwMjRjNSAxMDA2NDQKLS0tIGEva2VybmVsL3BhZGF0YS5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9wYWRhdGEuYwpAQCAtMSw2ICYjNDM7MSw2IEBACiAvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAogLyoKLSAqIHBhZGF0YS5jIC0gZ2VuZXJpYyBpbnRlcmZhY2UgdG8gcHJvY2VzcyBkYXRhIHN0cmVhbXMgaW4gcGFyYWxsZWwKJiM0MzsgKiBwYWRhdGEuYyAtIGdlbmVyaWMgaW50ZXJmYWNlIHRvIHJ1biBtdWx0aXRocmVhZGVkIGpvYnMKICAqCiAgKiBTZWUgRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9wYWRhdGEucnN0IGZvciBtb3JlIGluZm9ybWF0aW9uLgogICoKQEAgLTExLDE3ICYjNDM7MTEsMTcgQEAKICAqIEF1dGhvcjogRGFuaWVsIEpvcmRhbiAmbHQ7ZGFuaWVsLm0uam9yZGFuQG9yYWNsZS5jb20mZ3Q7CiAgKi8KIAomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9hdG9taWMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9jb21wbGV0aW9uLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvZXhwb3J0LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvY3B1bWFzay5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2Vyci5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2NwdS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9pbml0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2tlcm5lbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9saXN0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L25vZGVtYXNrLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvcGFkYXRhLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvbXV0ZXguaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9zY2hlZC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9zeXNmcy5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3JjdXBkYXRlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NwaW5sb2NrLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3dvcmtxdWV1ZS5oJmd0OwogCiAjZGVmaW5lCVBBREFUQV9XT1JLX09OU1RBQ0sJMQkvKiBXb3JrJiMzOTtzIG1lbW9yeSBpcyBvbiBzdGFjayAqLwogCkBAIC00NCwzNiAmIzQzOzQ0LDggQEAgc3RydWN0IHBhZGF0YV9tdF9qb2Jfc3RhdGUgewogCXVuc2lnbmVkIGxvbmcJCWNodW5rX3NpemU7CiB9OwogCi1zdGF0aWMgdm9pZCBwYWRhdGFfZnJlZV9wZChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQpOwogc3RhdGljIHZvaWQgX19pbml0IHBhZGF0YV9tdF9oZWxwZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAotc3RhdGljIGlubGluZSB2b2lkIHBhZGF0YV9nZXRfcGQoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKQotewotCXJlZmNvdW50X2luYygmYW1wO3BkLSZndDtyZWZjbnQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcGFkYXRhX3B1dF9wZF9jbnQoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkLCBpbnQgY250KQotewotCWlmIChyZWZjb3VudF9zdWJfYW5kX3Rlc3QoY250LCAmYW1wO3BkLSZndDtyZWZjbnQpKQotCQlwYWRhdGFfZnJlZV9wZChwZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwYWRhdGFfcHV0X3BkKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCkKLXsKLQlwYWRhdGFfcHV0X3BkX2NudChwZCwgMSk7Ci19Ci0KLXN0YXRpYyBpbnQgcGFkYXRhX2NwdV9oYXNoKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCwgdW5zaWduZWQgaW50IHNlcV9ucikKLXsKLQkvKgotCSAqIEhhc2ggdGhlIHNlcXVlbmNlIG51bWJlcnMgdG8gdGhlIGNwdXMgYnkgdGFraW5nCi0JICogc2VxX25yIG1vZC4gbnVtYmVyIG9mIGNwdXMgaW4gdXNlLgotCSAqLwotCWludCBjcHVfaW5kZXggPSBzZXFfbnIgJSBjcHVtYXNrX3dlaWdodChwZC0mZ3Q7Y3B1bWFzay5wY3B1KTsKLQotCXJldHVybiBjcHVtYXNrX250aChjcHVfaW5kZXgsIHBkLSZndDtjcHVtYXNrLnBjcHUpOwotfQotCiBzdGF0aWMgc3RydWN0IHBhZGF0YV93b3JrICpwYWRhdGFfd29ya19hbGxvYyh2b2lkKQogewogCXN0cnVjdCBwYWRhdGFfd29yayAqcHc7CkBAIC0xNDcsMjYwICYjNDM7MTE5LDYgQEAgc3RhdGljIHZvaWQgX19pbml0IHBhZGF0YV93b3Jrc19mcmVlKHN0cnVjdCBsaXN0X2hlYWQgKndvcmtzKQogCXNwaW5fdW5sb2NrX2JoKCZhbXA7cGFkYXRhX3dvcmtzX2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCBwYWRhdGFfcGFyYWxsZWxfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqcGFyYWxsZWxfd29yaykKLXsKLQlzdHJ1Y3QgcGFkYXRhX3dvcmsgKnB3ID0gY29udGFpbmVyX29mKHBhcmFsbGVsX3dvcmssIHN0cnVjdCBwYWRhdGFfd29yaywKLQkJCQkJICAgICAgcHdfd29yayk7Ci0Jc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEgPSBwdy0mZ3Q7cHdfZGF0YTsKLQotCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQlwYWRhdGEtJmd0O3BhcmFsbGVsKHBhZGF0YSk7Ci0Jc3Bpbl9sb2NrKCZhbXA7cGFkYXRhX3dvcmtzX2xvY2spOwotCXBhZGF0YV93b3JrX2ZyZWUocHcpOwotCXNwaW5fdW5sb2NrKCZhbXA7cGFkYXRhX3dvcmtzX2xvY2spOwotCWxvY2FsX2JoX2VuYWJsZSgpOwotfQotCi0vKioKLSAqIHBhZGF0YV9kb19wYXJhbGxlbCAtIHBhZGF0YSBwYXJhbGxlbGl6YXRpb24gZnVuY3Rpb24KLSAqCi0gKiBAcHM6IHBhZGF0YXNoZWxsCi0gKiBAcGFkYXRhOiBvYmplY3QgdG8gYmUgcGFyYWxsZWxpemVkCi0gKiBAY2JfY3B1OiBwb2ludGVyIHRvIHRoZSBDUFUgdGhhdCB0aGUgc2VyaWFsaXphdGlvbiBjYWxsYmFjayBmdW5jdGlvbiBzaG91bGQKLSAqICAgICAgICAgIHJ1biBvbi4gIElmIGl0JiMzOTtzIG5vdCBpbiB0aGUgc2VyaWFsIGNwdW1hc2sgb2YgQHBpbnN0Ci0gKiAgICAgICAgICAoaS5lLiBjcHVtYXNrLmNiY3B1KSwgdGhpcyBmdW5jdGlvbiBzZWxlY3RzIGEgZmFsbGJhY2sgQ1BVIGFuZCBpZgotICogICAgICAgICAgbm9uZSBmb3VuZCwgcmV0dXJucyAtRUlOVkFMLgotICoKLSAqIFRoZSBwYXJhbGxlbGl6YXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBydW4gd2l0aCBCSHMgb2ZmLgotICogTm90ZTogRXZlcnkgb2JqZWN0IHdoaWNoIGlzIHBhcmFsbGVsaXplZCBieSBwYWRhdGFfZG9fcGFyYWxsZWwKLSAqIG11c3QgYmUgc2VlbiBieSBwYWRhdGFfZG9fc2VyaWFsLgotICoKLSAqIFJldHVybjogMCBvbiBzdWNjZXNzIG9yIGVsc2UgbmVnYXRpdmUgZXJyb3IgY29kZS4KLSAqLwotaW50IHBhZGF0YV9kb19wYXJhbGxlbChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcywKLQkJICAgICAgIHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhLCBpbnQgKmNiX2NwdSkKLXsKLQlzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCA9IHBzLSZndDtwaW5zdDsKLQlzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQ7Ci0Jc3RydWN0IHBhZGF0YV93b3JrICpwdzsKLQlpbnQgY3B1X2luZGV4LCBlcnI7Ci0KLQlyY3VfcmVhZF9sb2NrX2JoKCk7Ci0KLQlwZCA9IHJjdV9kZXJlZmVyZW5jZV9iaChwcy0mZ3Q7cGQpOwotCi0JZXJyID0gLUVJTlZBTDsKLQlpZiAoIShwaW5zdC0mZ3Q7ZmxhZ3MgJmFtcDsgUEFEQVRBX0lOSVQpIHx8IHBpbnN0LSZndDtmbGFncyAmYW1wOyBQQURBVEFfSU5WQUxJRCkKLQkJZ290byBvdXQ7Ci0KLQlpZiAoIWNwdW1hc2tfdGVzdF9jcHUoKmNiX2NwdSwgcGQtJmd0O2NwdW1hc2suY2JjcHUpKSB7Ci0JCWlmIChjcHVtYXNrX2VtcHR5KHBkLSZndDtjcHVtYXNrLmNiY3B1KSkKLQkJCWdvdG8gb3V0OwotCi0JCS8qIFNlbGVjdCBhbiBhbHRlcm5hdGUgZmFsbGJhY2sgQ1BVIGFuZCBub3RpZnkgdGhlIGNhbGxlci4gKi8KLQkJY3B1X2luZGV4ID0gKmNiX2NwdSAlIGNwdW1hc2tfd2VpZ2h0KHBkLSZndDtjcHVtYXNrLmNiY3B1KTsKLQkJKmNiX2NwdSA9IGNwdW1hc2tfbnRoKGNwdV9pbmRleCwgcGQtJmd0O2NwdW1hc2suY2JjcHUpOwotCX0KLQotCWVyciA9IC1FQlVTWTsKLQlpZiAoKHBpbnN0LSZndDtmbGFncyAmYW1wOyBQQURBVEFfUkVTRVQpKQotCQlnb3RvIG91dDsKLQotCXBhZGF0YV9nZXRfcGQocGQpOwotCXBhZGF0YS0mZ3Q7cGQgPSBwZDsKLQlwYWRhdGEtJmd0O2NiX2NwdSA9ICpjYl9jcHU7Ci0KLQlzcGluX2xvY2soJmFtcDtwYWRhdGFfd29ya3NfbG9jayk7Ci0JcGFkYXRhLSZndDtzZXFfbnIgPSAmIzQzOyYjNDM7cGQtJmd0O3NlcV9ucjsKLQlwdyA9IHBhZGF0YV93b3JrX2FsbG9jKCk7Ci0Jc3Bpbl91bmxvY2soJmFtcDtwYWRhdGFfd29ya3NfbG9jayk7Ci0KLQlpZiAoIXB3KSB7Ci0JCS8qIE1heGltdW0gd29ya3MgbGltaXQgZXhjZWVkZWQsIHJ1biBpbiB0aGUgY3VycmVudCB0YXNrLiAqLwotCQlwYWRhdGEtJmd0O3BhcmFsbGVsKHBhZGF0YSk7Ci0JfQotCi0JcmN1X3JlYWRfdW5sb2NrX2JoKCk7Ci0KLQlpZiAocHcpIHsKLQkJcGFkYXRhX3dvcmtfaW5pdChwdywgcGFkYXRhX3BhcmFsbGVsX3dvcmtlciwgcGFkYXRhLCAwKTsKLQkJcXVldWVfd29yayhwaW5zdC0mZ3Q7cGFyYWxsZWxfd3EsICZhbXA7cHctJmd0O3B3X3dvcmspOwotCX0KLQotCXJldHVybiAwOwotb3V0OgotCXJjdV9yZWFkX3VubG9ja19iaCgpOwotCi0JcmV0dXJuIGVycjsKLX0KLUVYUE9SVF9TWU1CT0wocGFkYXRhX2RvX3BhcmFsbGVsKTsKLQotLyoKLSAqIHBhZGF0YV9maW5kX25leHQgLSBGaW5kIHRoZSBuZXh0IG9iamVjdCB0aGF0IG5lZWRzIHNlcmlhbGl6YXRpb24uCi0gKgotICogUmV0dXJuOgotICogKiBBIHBvaW50ZXIgdG8gdGhlIGNvbnRyb2wgc3RydWN0IG9mIHRoZSBuZXh0IG9iamVjdCB0aGF0IG5lZWRzCi0gKiAgIHNlcmlhbGl6YXRpb24sIGlmIHByZXNlbnQgaW4gb25lIG9mIHRoZSBwZXJjcHUgcmVvcmRlciBxdWV1ZXMuCi0gKiAqIE5VTEwsIGlmIHRoZSBuZXh0IG9iamVjdCB0aGF0IG5lZWRzIHNlcmlhbGl6YXRpb24gd2lsbAotICogICBiZSBwYXJhbGxlbCBwcm9jZXNzZWQgYnkgYW5vdGhlciBjcHUgYW5kIGlzIG5vdCB5ZXQgcHJlc2VudCBpbgotICogICB0aGUgY3B1JiMzOTtzIHJlb3JkZXIgcXVldWUuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YV9maW5kX25leHQoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkLCBpbnQgY3B1LAotCQkJCQkgICAgdW5zaWduZWQgaW50IHByb2Nlc3NlZCkKLXsKLQlzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YTsKLQlzdHJ1Y3QgcGFkYXRhX2xpc3QgKnJlb3JkZXI7Ci0KLQlyZW9yZGVyID0gcGVyX2NwdV9wdHIocGQtJmd0O3Jlb3JkZXJfbGlzdCwgY3B1KTsKLQotCXNwaW5fbG9jaygmYW1wO3Jlb3JkZXItJmd0O2xvY2spOwotCWlmIChsaXN0X2VtcHR5KCZhbXA7cmVvcmRlci0mZ3Q7bGlzdCkpCi0JCWdvdG8gbm90Zm91bmQ7Ci0KLQlwYWRhdGEgPSBsaXN0X2VudHJ5KHJlb3JkZXItJmd0O2xpc3QubmV4dCwgc3RydWN0IHBhZGF0YV9wcml2LCBsaXN0KTsKLQotCS8qCi0JICogQ2hlY2tzIHRoZSByYXJlIGNhc2Ugd2hlcmUgdHdvIG9yIG1vcmUgcGFyYWxsZWwgam9icyBoYXZlIGhhc2hlZCB0bwotCSAqIHRoZSBzYW1lIENQVSBhbmQgb25lIG9mIHRoZSBsYXRlciBvbmVzIGZpbmlzaGVzIGZpcnN0LgotCSAqLwotCWlmIChwYWRhdGEtJmd0O3NlcV9uciAhPSBwcm9jZXNzZWQpCi0JCWdvdG8gbm90Zm91bmQ7Ci0KLQlsaXN0X2RlbF9pbml0KCZhbXA7cGFkYXRhLSZndDtsaXN0KTsKLQlzcGluX3VubG9jaygmYW1wO3Jlb3JkZXItJmd0O2xvY2spOwotCXJldHVybiBwYWRhdGE7Ci0KLW5vdGZvdW5kOgotCXBkLSZndDtwcm9jZXNzZWQgPSBwcm9jZXNzZWQ7Ci0JcGQtJmd0O2NwdSA9IGNwdTsKLQlzcGluX3VubG9jaygmYW1wO3Jlb3JkZXItJmd0O2xvY2spOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBwYWRhdGFfcmVvcmRlcihzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSkKLXsKLQlzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQgPSBwYWRhdGEtJmd0O3BkOwotCXN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0ID0gcGQtJmd0O3BzLSZndDtwaW5zdDsKLQl1bnNpZ25lZCBpbnQgcHJvY2Vzc2VkOwotCWludCBjcHU7Ci0KLQlwcm9jZXNzZWQgPSBwZC0mZ3Q7cHJvY2Vzc2VkOwotCWNwdSA9IHBkLSZndDtjcHU7Ci0KLQlkbyB7Ci0JCXN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlICpzcXVldWU7Ci0JCWludCBjYl9jcHU7Ci0KLQkJcHJvY2Vzc2VkJiM0MzsmIzQzOzsKLQkJLyogV2hlbiBzZXF1ZW5jZSB3cmFwcyBhcm91bmQsIHJlc2V0IHRvIHRoZSBmaXJzdCBDUFUuICovCi0JCWlmICh1bmxpa2VseShwcm9jZXNzZWQgPT0gMCkpCi0JCQljcHUgPSBjcHVtYXNrX2ZpcnN0KHBkLSZndDtjcHVtYXNrLnBjcHUpOwotCQllbHNlCi0JCQljcHUgPSBjcHVtYXNrX25leHRfd3JhcChjcHUsIHBkLSZndDtjcHVtYXNrLnBjcHUpOwotCi0JCWNiX2NwdSA9IHBhZGF0YS0mZ3Q7Y2JfY3B1OwotCQlzcXVldWUgPSBwZXJfY3B1X3B0cihwZC0mZ3Q7c3F1ZXVlLCBjYl9jcHUpOwotCi0JCXNwaW5fbG9jaygmYW1wO3NxdWV1ZS0mZ3Q7c2VyaWFsLmxvY2spOwotCQlsaXN0X2FkZF90YWlsKCZhbXA7cGFkYXRhLSZndDtsaXN0LCAmYW1wO3NxdWV1ZS0mZ3Q7c2VyaWFsLmxpc3QpOwotCQlxdWV1ZV93b3JrX29uKGNiX2NwdSwgcGluc3QtJmd0O3NlcmlhbF93cSwgJmFtcDtzcXVldWUtJmd0O3dvcmspOwotCi0JCS8qCi0JCSAqIElmIHRoZSBuZXh0IG9iamVjdCB0aGF0IG5lZWRzIHNlcmlhbGl6YXRpb24gaXMgcGFyYWxsZWwKLQkJICogcHJvY2Vzc2VkIGJ5IGFub3RoZXIgY3B1IGFuZCBpcyBzdGlsbCBvbiBpdCYjMzk7cyB3YXkgdG8gdGhlCi0JCSAqIGNwdSYjMzk7cyByZW9yZGVyIHF1ZXVlLCBlbmQgdGhlIGxvb3AuCi0JCSAqLwotCQlwYWRhdGEgPSBwYWRhdGFfZmluZF9uZXh0KHBkLCBjcHUsIHByb2Nlc3NlZCk7Ci0JCXNwaW5fdW5sb2NrKCZhbXA7c3F1ZXVlLSZndDtzZXJpYWwubG9jayk7Ci0JfSB3aGlsZSAocGFkYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgcGFkYXRhX3NlcmlhbF93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICpzZXJpYWxfd29yaykKLXsKLQlzdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZSAqc3F1ZXVlOwotCXN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDsKLQlMSVNUX0hFQUQobG9jYWxfbGlzdCk7Ci0JaW50IGNudDsKLQotCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQlzcXVldWUgPSBjb250YWluZXJfb2Yoc2VyaWFsX3dvcmssIHN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlLCB3b3JrKTsKLQlwZCA9IHNxdWV1ZS0mZ3Q7cGQ7Ci0KLQlzcGluX2xvY2soJmFtcDtzcXVldWUtJmd0O3NlcmlhbC5sb2NrKTsKLQlsaXN0X3JlcGxhY2VfaW5pdCgmYW1wO3NxdWV1ZS0mZ3Q7c2VyaWFsLmxpc3QsICZhbXA7bG9jYWxfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmFtcDtzcXVldWUtJmd0O3NlcmlhbC5sb2NrKTsKLQotCWNudCA9IDA7Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmFtcDtsb2NhbF9saXN0KSkgewotCQlzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YTsKLQotCQlwYWRhdGEgPSBsaXN0X2VudHJ5KGxvY2FsX2xpc3QubmV4dCwKLQkJCQkgICAgc3RydWN0IHBhZGF0YV9wcml2LCBsaXN0KTsKLQotCQlsaXN0X2RlbF9pbml0KCZhbXA7cGFkYXRhLSZndDtsaXN0KTsKLQotCQlwYWRhdGEtJmd0O3NlcmlhbChwYWRhdGEpOwotCQljbnQmIzQzOyYjNDM7OwotCX0KLQlsb2NhbF9iaF9lbmFibGUoKTsKLQotCXBhZGF0YV9wdXRfcGRfY250KHBkLCBjbnQpOwotfQotCi0vKioKLSAqIHBhZGF0YV9kb19zZXJpYWwgLSBwYWRhdGEgc2VyaWFsaXphdGlvbiBmdW5jdGlvbgotICoKLSAqIEBwYWRhdGE6IG9iamVjdCB0byBiZSBzZXJpYWxpemVkLgotICoKLSAqIHBhZGF0YV9kb19zZXJpYWwgbXVzdCBiZSBjYWxsZWQgZm9yIGV2ZXJ5IHBhcmFsbGVsaXplZCBvYmplY3QuCi0gKiBUaGUgc2VyaWFsaXphdGlvbiBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIHJ1biB3aXRoIEJIcyBvZmYuCi0gKi8KLXZvaWQgcGFkYXRhX2RvX3NlcmlhbChzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSkKLXsKLQlzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQgPSBwYWRhdGEtJmd0O3BkOwotCWludCBoYXNoZWRfY3B1ID0gcGFkYXRhX2NwdV9oYXNoKHBkLCBwYWRhdGEtJmd0O3NlcV9ucik7Ci0Jc3RydWN0IHBhZGF0YV9saXN0ICpyZW9yZGVyID0gcGVyX2NwdV9wdHIocGQtJmd0O3Jlb3JkZXJfbGlzdCwgaGFzaGVkX2NwdSk7Ci0Jc3RydWN0IHBhZGF0YV9wcml2ICpjdXI7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zOwotCWJvb2wgZ290aXQgPSB0cnVlOwotCi0Jc3Bpbl9sb2NrKCZhbXA7cmVvcmRlci0mZ3Q7bG9jayk7Ci0JLyogU29ydCBpbiBhc2NlbmRpbmcgb3JkZXIgb2Ygc2VxdWVuY2UgbnVtYmVyLiAqLwotCWxpc3RfZm9yX2VhY2hfcHJldihwb3MsICZhbXA7cmVvcmRlci0mZ3Q7bGlzdCkgewotCQljdXIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHBhZGF0YV9wcml2LCBsaXN0KTsKLQkJLyogQ29tcGFyZSBieSBkaWZmZXJlbmNlIHRvIGNvbnNpZGVyIGludGVnZXIgd3JhcCBhcm91bmQgKi8KLQkJaWYgKChzaWduZWQgaW50KShjdXItJmd0O3NlcV9uciAtIHBhZGF0YS0mZ3Q7c2VxX25yKSAmbHQ7IDApCi0JCQlicmVhazsKLQl9Ci0JaWYgKHBhZGF0YS0mZ3Q7c2VxX25yICE9IHBkLSZndDtwcm9jZXNzZWQpIHsKLQkJZ290aXQgPSBmYWxzZTsKLQkJbGlzdF9hZGQoJmFtcDtwYWRhdGEtJmd0O2xpc3QsIHBvcyk7Ci0JfQotCXNwaW5fdW5sb2NrKCZhbXA7cmVvcmRlci0mZ3Q7bG9jayk7Ci0KLQlpZiAoZ290aXQpCi0JCXBhZGF0YV9yZW9yZGVyKHBhZGF0YSk7Ci19Ci1FWFBPUlRfU1lNQk9MKHBhZGF0YV9kb19zZXJpYWwpOwotCi1zdGF0aWMgaW50IHBhZGF0YV9zZXR1cF9jcHVtYXNrcyhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCkKLXsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX2F0dHJzICphdHRyczsKLQlpbnQgZXJyOwotCi0JYXR0cnMgPSBhbGxvY193b3JrcXVldWVfYXR0cnMoKTsKLQlpZiAoIWF0dHJzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIFJlc3RyaWN0IHBhcmFsbGVsX3dxIHdvcmtlcnMgdG8gcGQtJmd0O2NwdW1hc2sucGNwdS4gKi8KLQljcHVtYXNrX2NvcHkoYXR0cnMtJmd0O2NwdW1hc2ssIHBpbnN0LSZndDtjcHVtYXNrLnBjcHUpOwotCWVyciA9IGFwcGx5X3dvcmtxdWV1ZV9hdHRycyhwaW5zdC0mZ3Q7cGFyYWxsZWxfd3EsIGF0dHJzKTsKLQlmcmVlX3dvcmtxdWV1ZV9hdHRycyhhdHRycyk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQgcGFkYXRhX210X2hlbHBlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpCiB7CiAJc3RydWN0IHBhZGF0YV93b3JrICpwdyA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgcGFkYXRhX3dvcmssIHB3X3dvcmspOwpAQCAtNTA2LDYxMyAmIzQzOzIyNCwxNyBAQCB2b2lkIF9faW5pdCBwYWRhdGFfZG9fbXVsdGl0aHJlYWRlZChzdHJ1Y3QgcGFkYXRhX210X2pvYiAqam9iKQogCXBhZGF0YV93b3Jrc19mcmVlKCZhbXA7d29ya3MpOwogfQogCi0vKiBJbml0aWFsaXplIGFsbCBwZXJjcHUgcXVldWVzIHVzZWQgYnkgc2VyaWFsIHdvcmtlcnMgKi8KLXN0YXRpYyB2b2lkIHBhZGF0YV9pbml0X3NxdWV1ZXMoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKQotewotCWludCBjcHU7Ci0Jc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUgKnNxdWV1ZTsKLQotCWZvcl9lYWNoX2NwdShjcHUsIHBkLSZndDtjcHVtYXNrLmNiY3B1KSB7Ci0JCXNxdWV1ZSA9IHBlcl9jcHVfcHRyKHBkLSZndDtzcXVldWUsIGNwdSk7Ci0JCXNxdWV1ZS0mZ3Q7cGQgPSBwZDsKLQkJSU5JVF9MSVNUX0hFQUQoJmFtcDtzcXVldWUtJmd0O3NlcmlhbC5saXN0KTsKLQkJc3Bpbl9sb2NrX2luaXQoJmFtcDtzcXVldWUtJmd0O3NlcmlhbC5sb2NrKTsKLQkJSU5JVF9XT1JLKCZhbXA7c3F1ZXVlLSZndDt3b3JrLCBwYWRhdGFfc2VyaWFsX3dvcmtlcik7Ci0JfQotfQotCi0vKiBJbml0aWFsaXplIHBlci1DUFUgcmVvcmRlciBsaXN0cyAqLwotc3RhdGljIHZvaWQgcGFkYXRhX2luaXRfcmVvcmRlcl9saXN0KHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCkKLXsKLQlpbnQgY3B1OwotCXN0cnVjdCBwYWRhdGFfbGlzdCAqbGlzdDsKLQotCWZvcl9lYWNoX2NwdShjcHUsIHBkLSZndDtjcHVtYXNrLnBjcHUpIHsKLQkJbGlzdCA9IHBlcl9jcHVfcHRyKHBkLSZndDtyZW9yZGVyX2xpc3QsIGNwdSk7Ci0JCUlOSVRfTElTVF9IRUFEKCZhbXA7bGlzdC0mZ3Q7bGlzdCk7Ci0JCXNwaW5fbG9ja19pbml0KCZhbXA7bGlzdC0mZ3Q7bG9jayk7Ci0JfQotfQotCi0vKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgY3B1bWFzayBkZXBlbmRlbmQgcmVzb3VyY2VzLiAqLwotc3RhdGljIHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwYWRhdGFfYWxsb2NfcGQoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsCi0JCQkJCSAgICAgaW50IG9mZmxpbmluZ19jcHUpCi17Ci0Jc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QgPSBwcy0mZ3Q7cGluc3Q7Ci0Jc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkOwotCi0JcGQgPSBremFsbG9jX29iaihzdHJ1Y3QgcGFyYWxsZWxfZGF0YSk7Ci0JaWYgKCFwZCkKLQkJZ290byBlcnI7Ci0KLQlwZC0mZ3Q7cmVvcmRlcl9saXN0ID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBwYWRhdGFfbGlzdCk7Ci0JaWYgKCFwZC0mZ3Q7cmVvcmRlcl9saXN0KQotCQlnb3RvIGVycl9mcmVlX3BkOwotCi0JcGQtJmd0O3NxdWV1ZSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZSk7Ci0JaWYgKCFwZC0mZ3Q7c3F1ZXVlKQotCQlnb3RvIGVycl9mcmVlX3Jlb3JkZXJfbGlzdDsKLQotCXBkLSZndDtwcyA9IHBzOwotCi0JaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmYW1wO3BkLSZndDtjcHVtYXNrLnBjcHUsIEdGUF9LRVJORUwpKQotCQlnb3RvIGVycl9mcmVlX3NxdWV1ZTsKLQlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZhbXA7cGQtJmd0O2NwdW1hc2suY2JjcHUsIEdGUF9LRVJORUwpKQotCQlnb3RvIGVycl9mcmVlX3BjcHU7Ci0KLQljcHVtYXNrX2FuZChwZC0mZ3Q7Y3B1bWFzay5wY3B1LCBwaW5zdC0mZ3Q7Y3B1bWFzay5wY3B1LCBjcHVfb25saW5lX21hc2spOwotCWNwdW1hc2tfYW5kKHBkLSZndDtjcHVtYXNrLmNiY3B1LCBwaW5zdC0mZ3Q7Y3B1bWFzay5jYmNwdSwgY3B1X29ubGluZV9tYXNrKTsKLQlpZiAob2ZmbGluaW5nX2NwdSAmZ3Q7PSAwKSB7Ci0JCV9fY3B1bWFza19jbGVhcl9jcHUob2ZmbGluaW5nX2NwdSwgcGQtJmd0O2NwdW1hc2sucGNwdSk7Ci0JCV9fY3B1bWFza19jbGVhcl9jcHUob2ZmbGluaW5nX2NwdSwgcGQtJmd0O2NwdW1hc2suY2JjcHUpOwotCX0KLQotCXBhZGF0YV9pbml0X3Jlb3JkZXJfbGlzdChwZCk7Ci0JcGFkYXRhX2luaXRfc3F1ZXVlcyhwZCk7Ci0JcGQtJmd0O3NlcV9uciA9IC0xOwotCXJlZmNvdW50X3NldCgmYW1wO3BkLSZndDtyZWZjbnQsIDEpOwotCXBkLSZndDtjcHUgPSBjcHVtYXNrX2ZpcnN0KHBkLSZndDtjcHVtYXNrLnBjcHUpOwotCi0JcmV0dXJuIHBkOwotCi1lcnJfZnJlZV9wY3B1OgotCWZyZWVfY3B1bWFza192YXIocGQtJmd0O2NwdW1hc2sucGNwdSk7Ci1lcnJfZnJlZV9zcXVldWU6Ci0JZnJlZV9wZXJjcHUocGQtJmd0O3NxdWV1ZSk7Ci1lcnJfZnJlZV9yZW9yZGVyX2xpc3Q6Ci0JZnJlZV9wZXJjcHUocGQtJmd0O3Jlb3JkZXJfbGlzdCk7Ci1lcnJfZnJlZV9wZDoKLQlrZnJlZShwZCk7Ci1lcnI6Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhZGF0YV9mcmVlX3BkKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCkKLXsKLQlmcmVlX2NwdW1hc2tfdmFyKHBkLSZndDtjcHVtYXNrLnBjcHUpOwotCWZyZWVfY3B1bWFza192YXIocGQtJmd0O2NwdW1hc2suY2JjcHUpOwotCWZyZWVfcGVyY3B1KHBkLSZndDtyZW9yZGVyX2xpc3QpOwotCWZyZWVfcGVyY3B1KHBkLSZndDtzcXVldWUpOwotCWtmcmVlKHBkKTsKLX0KLQotc3RhdGljIHZvaWQgX19wYWRhdGFfc3RhcnQoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpCi17Ci0JcGluc3QtJmd0O2ZsYWdzIHw9IFBBREFUQV9JTklUOwotfQotCi1zdGF0aWMgdm9pZCBfX3BhZGF0YV9zdG9wKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KQotewotCWlmICghKHBpbnN0LSZndDtmbGFncyAmYW1wOyBQQURBVEFfSU5JVCkpCi0JCXJldHVybjsKLQotCXBpbnN0LSZndDtmbGFncyAmYW1wOz0gflBBREFUQV9JTklUOwotCi0Jc3luY2hyb25pemVfcmN1KCk7Ci19Ci0KLS8qIFJlcGxhY2UgdGhlIGludGVybmFsIGNvbnRyb2wgc3RydWN0dXJlIHdpdGggYSBuZXcgb25lLiAqLwotc3RhdGljIGludCBwYWRhdGFfcmVwbGFjZV9vbmUoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsIGludCBvZmZsaW5pbmdfY3B1KQotewotCXN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZF9uZXc7Ci0KLQlwZF9uZXcgPSBwYWRhdGFfYWxsb2NfcGQocHMsIG9mZmxpbmluZ19jcHUpOwotCWlmICghcGRfbmV3KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBzLSZndDtvcGQgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHBzLSZndDtwZCwgMSk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKHBzLSZndDtwZCwgcGRfbmV3KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBhZGF0YV9yZXBsYWNlKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgb2ZmbGluaW5nX2NwdSkKLXsKLQlzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwczsKLQlpbnQgZXJyID0gMDsKLQotCXBpbnN0LSZndDtmbGFncyB8PSBQQURBVEFfUkVTRVQ7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBzLCAmYW1wO3BpbnN0LSZndDtwc2xpc3QsIGxpc3QpIHsKLQkJZXJyID0gcGFkYXRhX3JlcGxhY2Vfb25lKHBzLCBvZmZsaW5pbmdfY3B1KTsKLQkJaWYgKGVycikKLQkJCWJyZWFrOwotCX0KLQotCXN5bmNocm9uaXplX3JjdSgpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZV9yZXZlcnNlKHBzLCAmYW1wO3BpbnN0LSZndDtwc2xpc3QsIGxpc3QpCi0JCXBhZGF0YV9wdXRfcGQocHMtJmd0O29wZCk7Ci0KLQlwaW5zdC0mZ3Q7ZmxhZ3MgJmFtcDs9IH5QQURBVEFfUkVTRVQ7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0vKiBJZiBjcHVtYXNrIGNvbnRhaW5zIG5vIGFjdGl2ZSBjcHUsIHdlIG1hcmsgdGhlIGluc3RhbmNlIGFzIGludmFsaWQuICovCi1zdGF0aWMgYm9vbCBwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwKLQkJCQkgICAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2ssCi0JCQkJICAgIGludCBvZmZsaW5pbmdfY3B1KQotewotCWNwdW1hc2tfY29weShwaW5zdC0mZ3Q7dmFsaWRhdGVfY3B1bWFzaywgY3B1X29ubGluZV9tYXNrKTsKLQotCS8qCi0JICogQG9mZmxpbmluZ19jcHUgaXMgc3RpbGwgaW4gY3B1X29ubGluZV9tYXNrLCBzbyByZW1vdmUgaXQgaGVyZSBmb3IKLQkgKiB2YWxpZGF0aW9uLiAgVXNpbmcgYSBzdWItQ1BVSFBfVEVBUkRPV05fQ1BVIGhvdHBsdWcgc3RhdGUgd2hlcmUKLQkgKiBAb2ZmbGluaW5nX2NwdSB3b3VsZG4mIzM5O3QgYmUgaW4gdGhlIG9ubGluZSBtYXNrIGRvZXNuJiMzOTt0IHdvcmsgYmVjYXVzZQotCSAqIHBhZGF0YV9jcHVfb2ZmbGluZSgpIGNhbiBmYWlsIGJ1dCBzdWNoIGEgc3RhdGUgZG9lc24mIzM5O3QgYWxsb3cgZmFpbHVyZS4KLQkgKi8KLQlpZiAob2ZmbGluaW5nX2NwdSAmZ3Q7PSAwKQotCQlfX2NwdW1hc2tfY2xlYXJfY3B1KG9mZmxpbmluZ19jcHUsIHBpbnN0LSZndDt2YWxpZGF0ZV9jcHVtYXNrKTsKLQotCWlmICghY3B1bWFza19pbnRlcnNlY3RzKGNwdW1hc2ssIHBpbnN0LSZndDt2YWxpZGF0ZV9jcHVtYXNrKSkgewotCQlwaW5zdC0mZ3Q7ZmxhZ3MgfD0gUEFEQVRBX0lOVkFMSUQ7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwaW5zdC0mZ3Q7ZmxhZ3MgJmFtcDs9IH5QQURBVEFfSU5WQUxJRDsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludCBfX3BhZGF0YV9zZXRfY3B1bWFza3Moc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsCi0JCQkJIGNwdW1hc2tfdmFyX3QgcGNwdW1hc2ssCi0JCQkJIGNwdW1hc2tfdmFyX3QgY2JjcHVtYXNrKQotewotCWludCB2YWxpZDsKLQlpbnQgZXJyOwotCi0JdmFsaWQgPSBwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGNwdW1hc2ssIC0xKTsKLQlpZiAoIXZhbGlkKSB7Ci0JCV9fcGFkYXRhX3N0b3AocGluc3QpOwotCQlnb3RvIG91dF9yZXBsYWNlOwotCX0KLQotCXZhbGlkID0gcGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2socGluc3QsIGNiY3B1bWFzaywgLTEpOwotCWlmICghdmFsaWQpCi0JCV9fcGFkYXRhX3N0b3AocGluc3QpOwotCi1vdXRfcmVwbGFjZToKLQljcHVtYXNrX2NvcHkocGluc3QtJmd0O2NwdW1hc2sucGNwdSwgcGNwdW1hc2spOwotCWNwdW1hc2tfY29weShwaW5zdC0mZ3Q7Y3B1bWFzay5jYmNwdSwgY2JjcHVtYXNrKTsKLQotCWVyciA9IHBhZGF0YV9zZXR1cF9jcHVtYXNrcyhwaW5zdCkgPzogcGFkYXRhX3JlcGxhY2UocGluc3QsIC0xKTsKLQotCWlmICh2YWxpZCkKLQkJX19wYWRhdGFfc3RhcnQocGluc3QpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKiBwYWRhdGFfc2V0X2NwdW1hc2sgLSBTZXRzIHNwZWNpZmllZCBieSBAY3B1bWFza190eXBlIGNwdW1hc2sgdG8gdGhlIHZhbHVlCi0gKiAgICAgICAgICAgICAgICAgICAgICBlcXVpdmFsZW50IHRvIEBjcHVtYXNrLgotICogQHBpbnN0OiBwYWRhdGEgaW5zdGFuY2UKLSAqIEBjcHVtYXNrX3R5cGU6IFBBREFUQV9DUFVfU0VSSUFMIG9yIFBBREFUQV9DUFVfUEFSQUxMRUwgY29ycmVzcG9uZGluZwotICogICAgICAgICAgICAgICAgdG8gcGFyYWxsZWwgYW5kIHNlcmlhbCBjcHVtYXNrcyByZXNwZWN0aXZlbHkuCi0gKiBAY3B1bWFzazogdGhlIGNwdW1hc2sgdG8gdXNlCi0gKgotICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZQotICovCi1pbnQgcGFkYXRhX3NldF9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgY3B1bWFza190eXBlLAotCQkgICAgICAgY3B1bWFza192YXJfdCBjcHVtYXNrKQotewotCXN0cnVjdCBjcHVtYXNrICpzZXJpYWxfbWFzaywgKnBhcmFsbGVsX21hc2s7Ci0JaW50IGVyciA9IC1FSU5WQUw7Ci0KLQljcHVzX3JlYWRfbG9jaygpOwotCW11dGV4X2xvY2soJmFtcDtwaW5zdC0mZ3Q7bG9jayk7Ci0KLQlzd2l0Y2ggKGNwdW1hc2tfdHlwZSkgewotCWNhc2UgUEFEQVRBX0NQVV9QQVJBTExFTDoKLQkJc2VyaWFsX21hc2sgPSBwaW5zdC0mZ3Q7Y3B1bWFzay5jYmNwdTsKLQkJcGFyYWxsZWxfbWFzayA9IGNwdW1hc2s7Ci0JCWJyZWFrOwotCWNhc2UgUEFEQVRBX0NQVV9TRVJJQUw6Ci0JCXBhcmFsbGVsX21hc2sgPSBwaW5zdC0mZ3Q7Y3B1bWFzay5wY3B1OwotCQlzZXJpYWxfbWFzayA9IGNwdW1hc2s7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCSBnb3RvIG91dDsKLQl9Ci0KLQllcnIgPSAgX19wYWRhdGFfc2V0X2NwdW1hc2tzKHBpbnN0LCBwYXJhbGxlbF9tYXNrLCBzZXJpYWxfbWFzayk7Ci0KLW91dDoKLQltdXRleF91bmxvY2soJmFtcDtwaW5zdC0mZ3Q7bG9jayk7Ci0JY3B1c19yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIGVycjsKLX0KLUVYUE9SVF9TWU1CT0wocGFkYXRhX3NldF9jcHVtYXNrKTsKLQotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCi1zdGF0aWMgaW5saW5lIGludCBwaW5zdF9oYXNfY3B1KHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgY3B1KQotewotCXJldHVybiBjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgcGluc3QtJmd0O2NwdW1hc2sucGNwdSkgfHwKLQkJY3B1bWFza190ZXN0X2NwdShjcHUsIHBpbnN0LSZndDtjcHVtYXNrLmNiY3B1KTsKLX0KLQotc3RhdGljIGludCBwYWRhdGFfY3B1X29ubGluZSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKLXsKLQlzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdDsKLQlpbnQgcmV0OwotCi0JcGluc3QgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UsIGNwdWhwX25vZGUpOwotCWlmICghcGluc3RfaGFzX2NwdShwaW5zdCwgY3B1KSkKLQkJcmV0dXJuIDA7Ci0KLQltdXRleF9sb2NrKCZhbXA7cGluc3QtJmd0O2xvY2spOwotCi0JcmV0ID0gcGFkYXRhX3JlcGxhY2UocGluc3QsIC0xKTsKLQotCWlmIChwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGluc3QtJmd0O2NwdW1hc2sucGNwdSwgLTEpICZhbXA7JmFtcDsKLQkgICAgcGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2socGluc3QsIHBpbnN0LSZndDtjcHVtYXNrLmNiY3B1LCAtMSkpCi0JCV9fcGFkYXRhX3N0YXJ0KHBpbnN0KTsKLQotCW11dGV4X3VubG9jaygmYW1wO3BpbnN0LSZndDtsb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHBhZGF0YV9jcHVfb2ZmbGluZSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKLXsKLQlzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdDsKLQlpbnQgcmV0OwotCi0JcGluc3QgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UsIGNwdWhwX25vZGUpOwotCWlmICghcGluc3RfaGFzX2NwdShwaW5zdCwgY3B1KSkKLQkJcmV0dXJuIDA7Ci0KLQltdXRleF9sb2NrKCZhbXA7cGluc3QtJmd0O2xvY2spOwotCi0JaWYgKCFwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGluc3QtJmd0O2NwdW1hc2sucGNwdSwgY3B1KSB8fAotCSAgICAhcGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2socGluc3QsIHBpbnN0LSZndDtjcHVtYXNrLmNiY3B1LCBjcHUpKQotCQlfX3BhZGF0YV9zdG9wKHBpbnN0KTsKLQotCXJldCA9IHBhZGF0YV9yZXBsYWNlKHBpbnN0LCBjcHUpOwotCi0JbXV0ZXhfdW5sb2NrKCZhbXA7cGluc3QtJmd0O2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBlbnVtIGNwdWhwX3N0YXRlIGhwX29ubGluZTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBfX3BhZGF0YV9mcmVlKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KQotewotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCWNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzKGhwX29ubGluZSwgJmFtcDtwaW5zdC0mZ3Q7Y3B1aHBfbm9kZSk7Ci0jZW5kaWYKLQotCVdBUk5fT04oIWxpc3RfZW1wdHkoJmFtcDtwaW5zdC0mZ3Q7cHNsaXN0KSk7Ci0KLQlmcmVlX2NwdW1hc2tfdmFyKHBpbnN0LSZndDtjcHVtYXNrLnBjcHUpOwotCWZyZWVfY3B1bWFza192YXIocGluc3QtJmd0O2NwdW1hc2suY2JjcHUpOwotCWZyZWVfY3B1bWFza192YXIocGluc3QtJmd0O3ZhbGlkYXRlX2NwdW1hc2spOwotCWRlc3Ryb3lfd29ya3F1ZXVlKHBpbnN0LSZndDtzZXJpYWxfd3EpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKHBpbnN0LSZndDtwYXJhbGxlbF93cSk7Ci0Ja2ZyZWUocGluc3QpOwotfQotCi0jZGVmaW5lIGtvYmoycGluc3QoX2tvYmopCQkJCQlcCi0JY29udGFpbmVyX29mKF9rb2JqLCBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlLCBrb2JqKQotI2RlZmluZSBhdHRyMnBlbnRyeShfYXR0cikJCQkJCVwKLQljb250YWluZXJfb2ZfY29uc3QoX2F0dHIsIHN0cnVjdCBwYWRhdGFfc3lzZnNfZW50cnksIGF0dHIpCi0KLXN0YXRpYyB2b2lkIHBhZGF0YV9zeXNmc19yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQotewotCXN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0ID0ga29iajJwaW5zdChrb2JqKTsKLQlfX3BhZGF0YV9mcmVlKHBpbnN0KTsKLX0KLQotc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSB7Ci0Jc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKiwgY2hhciAqKTsKLQlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKiwgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqLAotCQkJIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKLX07Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCAgY2hhciAqYnVmKQotewotCXN0cnVjdCBjcHVtYXNrICpjcHVtYXNrOwotCXNzaXplX3QgbGVuOwotCi0JbXV0ZXhfbG9jaygmYW1wO3BpbnN0LSZndDtsb2NrKTsKLQlpZiAoIXN0cmNtcChhdHRyLSZndDtuYW1lLCAmIzM0O3NlcmlhbF9jcHVtYXNrJiMzNDspKQotCQljcHVtYXNrID0gcGluc3QtJmd0O2NwdW1hc2suY2JjcHU7Ci0JZWxzZQotCQljcHVtYXNrID0gcGluc3QtJmd0O2NwdW1hc2sucGNwdTsKLQotCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAmIzM0OyUqcGJcbiYjMzQ7LAotCQkgICAgICAgbnJfY3B1X2lkcywgY3B1bWFza19iaXRzKGNwdW1hc2spKTsKLQltdXRleF91bmxvY2soJmFtcDtwaW5zdC0mZ3Q7bG9jayk7Ci0JcmV0dXJuIGxlbiAmbHQ7IFBBR0VfU0laRSA/IGxlbiA6IC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2NwdW1hc2soc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCWNwdW1hc2tfdmFyX3QgbmV3X2NwdW1hc2s7Ci0Jc3NpemVfdCByZXQ7Ci0JaW50IG1hc2tfdHlwZTsKLQotCWlmICghYWxsb2NfY3B1bWFza192YXIoJmFtcDtuZXdfY3B1bWFzaywgR0ZQX0tFUk5FTCkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmV0ID0gYml0bWFwX3BhcnNlKGJ1ZiwgY291bnQsIGNwdW1hc2tfYml0cyhuZXdfY3B1bWFzayksCi0JCQkgICBucl9jcHVtYXNrX2JpdHMpOwotCWlmIChyZXQgJmx0OyAwKQotCQlnb3RvIG91dDsKLQotCW1hc2tfdHlwZSA9ICFzdHJjbXAoYXR0ci0mZ3Q7bmFtZSwgJiMzNDtzZXJpYWxfY3B1bWFzayYjMzQ7KSA/Ci0JCVBBREFUQV9DUFVfU0VSSUFMIDogUEFEQVRBX0NQVV9QQVJBTExFTDsKLQlyZXQgPSBwYWRhdGFfc2V0X2NwdW1hc2socGluc3QsIG1hc2tfdHlwZSwgbmV3X2NwdW1hc2spOwotCWlmICghcmV0KQotCQlyZXQgPSBjb3VudDsKLQotb3V0OgotCWZyZWVfY3B1bWFza192YXIobmV3X2NwdW1hc2spOwotCXJldHVybiByZXQ7Ci19Ci0KLSNkZWZpbmUgUEFEQVRBX0FUVFJfUlcoX25hbWUsIF9zaG93X25hbWUsIF9zdG9yZV9uYW1lKQkJXAotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGFkYXRhX3N5c2ZzX2VudHJ5IF9uYW1lIyNfYXR0ciA9CVwKLQkJX19BVFRSKF9uYW1lLCAwNjQ0LCBfc2hvd19uYW1lLCBfc3RvcmVfbmFtZSkKLSNkZWZpbmUgUEFEQVRBX0FUVFJfUk8oX25hbWUsIF9zaG93X25hbWUpCQkJXAotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGFkYXRhX3N5c2ZzX2VudHJ5IF9uYW1lIyNfYXR0ciA9CVwKLQkJX19BVFRSKF9uYW1lLCAwNDAwLCBfc2hvd19uYW1lLCBOVUxMKQotCi1QQURBVEFfQVRUUl9SVyhzZXJpYWxfY3B1bWFzaywgc2hvd19jcHVtYXNrLCBzdG9yZV9jcHVtYXNrKTsKLVBBREFUQV9BVFRSX1JXKHBhcmFsbGVsX2NwdW1hc2ssIHNob3dfY3B1bWFzaywgc3RvcmVfY3B1bWFzayk7Ci0KLS8qCi0gKiBQYWRhdGEgc3lzZnMgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBvYmplY3RzOgotICogc2VyaWFsX2NwdW1hc2sgICBbUlddIC0gY3B1bWFzayBmb3Igc2VyaWFsIHdvcmtlcnMKLSAqIHBhcmFsbGVsX2NwdW1hc2sgW1JXXSAtIGNwdW1hc2sgZm9yIHBhcmFsbGVsIHdvcmtlcnMKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmNvbnN0IHBhZGF0YV9kZWZhdWx0X2F0dHJzW10gPSB7Ci0JJmFtcDtzZXJpYWxfY3B1bWFza19hdHRyLmF0dHIsCi0JJmFtcDtwYXJhbGxlbF9jcHVtYXNrX2F0dHIuYXR0ciwKLQlOVUxMLAotfTsKLUFUVFJJQlVURV9HUk9VUFMocGFkYXRhX2RlZmF1bHQpOwotCi1zdGF0aWMgc3NpemVfdCBwYWRhdGFfc3lzZnNfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCWNvbnN0IHN0cnVjdCBwYWRhdGFfc3lzZnNfZW50cnkgKnBlbnRyeTsKLQlzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdDsKLQlzc2l6ZV90IHJldCA9IC1FSU87Ci0KLQlwaW5zdCA9IGtvYmoycGluc3Qoa29iaik7Ci0JcGVudHJ5ID0gYXR0cjJwZW50cnkoYXR0cik7Ci0JaWYgKHBlbnRyeS0mZ3Q7c2hvdykKLQkJcmV0ID0gcGVudHJ5LSZndDtzaG93KHBpbnN0LCBhdHRyLCBidWYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgcGFkYXRhX3N5c2ZzX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JY29uc3Qgc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSAqcGVudHJ5OwotCXN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0OwotCXNzaXplX3QgcmV0ID0gLUVJTzsKLQotCXBpbnN0ID0ga29iajJwaW5zdChrb2JqKTsKLQlwZW50cnkgPSBhdHRyMnBlbnRyeShhdHRyKTsKLQlpZiAocGVudHJ5LSZndDtzdG9yZSkKLQkJcmV0ID0gcGVudHJ5LSZndDtzdG9yZShwaW5zdCwgYXR0ciwgYnVmLCBjb3VudCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN5c2ZzX29wcyBwYWRhdGFfc3lzZnNfb3BzID0gewotCS5zaG93ID0gcGFkYXRhX3N5c2ZzX3Nob3csCi0JLnN0b3JlID0gcGFkYXRhX3N5c2ZzX3N0b3JlLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBrb2JqX3R5cGUgcGFkYXRhX2F0dHJfdHlwZSA9IHsKLQkuc3lzZnNfb3BzID0gJmFtcDtwYWRhdGFfc3lzZnNfb3BzLAotCS5kZWZhdWx0X2dyb3VwcyA9IHBhZGF0YV9kZWZhdWx0X2dyb3VwcywKLQkucmVsZWFzZSA9IHBhZGF0YV9zeXNmc19yZWxlYXNlLAotfTsKLQotLyoqCi0gKiBwYWRhdGFfYWxsb2MgLSBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIHBhZGF0YSBpbnN0YW5jZQotICogQG5hbWU6IHVzZWQgdG8gaWRlbnRpZnkgdGhlIGluc3RhbmNlCi0gKgotICogUmV0dXJuOiBuZXcgaW5zdGFuY2Ugb24gc3VjY2VzcywgTlVMTCBvbiBlcnJvcgotICovCi1zdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwYWRhdGFfYWxsb2MoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdDsKLQotCXBpbnN0ID0ga3phbGxvY19vYmooc3RydWN0IHBhZGF0YV9pbnN0YW5jZSk7Ci0JaWYgKCFwaW5zdCkKLQkJZ290byBlcnI7Ci0KLQlwaW5zdC0mZ3Q7cGFyYWxsZWxfd3EgPSBhbGxvY193b3JrcXVldWUoJiMzNDslc19wYXJhbGxlbCYjMzQ7LCBXUV9VTkJPVU5ELCAwLAotCQkJCQkgICAgIG5hbWUpOwotCWlmICghcGluc3QtJmd0O3BhcmFsbGVsX3dxKQotCQlnb3RvIGVycl9mcmVlX2luc3Q7Ci0KLQljcHVzX3JlYWRfbG9jaygpOwotCi0JcGluc3QtJmd0O3NlcmlhbF93cSA9IGFsbG9jX3dvcmtxdWV1ZSgmIzM0OyVzX3NlcmlhbCYjMzQ7LAotCQkJCQkgICBXUV9NRU1fUkVDTEFJTSB8IFdRX0NQVV9JTlRFTlNJVkUgfCBXUV9QRVJDUFUsCi0JCQkJCSAgIDEsIG5hbWUpOwotCWlmICghcGluc3QtJmd0O3NlcmlhbF93cSkKLQkJZ290byBlcnJfcHV0X2NwdXM7Ci0KLQlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZhbXA7cGluc3QtJmd0O2NwdW1hc2sucGNwdSwgR0ZQX0tFUk5FTCkpCi0JCWdvdG8gZXJyX2ZyZWVfc2VyaWFsX3dxOwotCWlmICghYWxsb2NfY3B1bWFza192YXIoJmFtcDtwaW5zdC0mZ3Q7Y3B1bWFzay5jYmNwdSwgR0ZQX0tFUk5FTCkpCi0JCWdvdG8gZXJyX2ZyZWVfcF9tYXNrOwotCWlmICghYWxsb2NfY3B1bWFza192YXIoJmFtcDtwaW5zdC0mZ3Q7dmFsaWRhdGVfY3B1bWFzaywgR0ZQX0tFUk5FTCkpCi0JCWdvdG8gZXJyX2ZyZWVfY2JfbWFzazsKLQotCUlOSVRfTElTVF9IRUFEKCZhbXA7cGluc3QtJmd0O3BzbGlzdCk7Ci0KLQljcHVtYXNrX2NvcHkocGluc3QtJmd0O2NwdW1hc2sucGNwdSwgY3B1X3Bvc3NpYmxlX21hc2spOwotCWNwdW1hc2tfY29weShwaW5zdC0mZ3Q7Y3B1bWFzay5jYmNwdSwgY3B1X3Bvc3NpYmxlX21hc2spOwotCi0JaWYgKHBhZGF0YV9zZXR1cF9jcHVtYXNrcyhwaW5zdCkpCi0JCWdvdG8gZXJyX2ZyZWVfdl9tYXNrOwotCi0JX19wYWRhdGFfc3RhcnQocGluc3QpOwotCi0Ja29iamVjdF9pbml0KCZhbXA7cGluc3QtJmd0O2tvYmosICZhbXA7cGFkYXRhX2F0dHJfdHlwZSk7Ci0JbXV0ZXhfaW5pdCgmYW1wO3BpbnN0LSZndDtsb2NrKTsKLQotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCWNwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZV9ub2NhbGxzX2NwdXNsb2NrZWQoaHBfb25saW5lLAotCQkJCQkJICAgICZhbXA7cGluc3QtJmd0O2NwdWhwX25vZGUpOwotI2VuZGlmCi0KLQljcHVzX3JlYWRfdW5sb2NrKCk7Ci0KLQlyZXR1cm4gcGluc3Q7Ci0KLWVycl9mcmVlX3ZfbWFzazoKLQlmcmVlX2NwdW1hc2tfdmFyKHBpbnN0LSZndDt2YWxpZGF0ZV9jcHVtYXNrKTsKLWVycl9mcmVlX2NiX21hc2s6Ci0JZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC0mZ3Q7Y3B1bWFzay5jYmNwdSk7Ci1lcnJfZnJlZV9wX21hc2s6Ci0JZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC0mZ3Q7Y3B1bWFzay5wY3B1KTsKLWVycl9mcmVlX3NlcmlhbF93cToKLQlkZXN0cm95X3dvcmtxdWV1ZShwaW5zdC0mZ3Q7c2VyaWFsX3dxKTsKLWVycl9wdXRfY3B1czoKLQljcHVzX3JlYWRfdW5sb2NrKCk7Ci0JZGVzdHJveV93b3JrcXVldWUocGluc3QtJmd0O3BhcmFsbGVsX3dxKTsKLWVycl9mcmVlX2luc3Q6Ci0Ja2ZyZWUocGluc3QpOwotZXJyOgotCXJldHVybiBOVUxMOwotfQotRVhQT1JUX1NZTUJPTChwYWRhdGFfYWxsb2MpOwotCi0vKioKLSAqIHBhZGF0YV9mcmVlIC0gZnJlZSBhIHBhZGF0YSBpbnN0YW5jZQotICoKLSAqIEBwaW5zdDogcGFkYXRhIGluc3RhbmNlIHRvIGZyZWUKLSAqLwotdm9pZCBwYWRhdGFfZnJlZShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCkKLXsKLQlrb2JqZWN0X3B1dCgmYW1wO3BpbnN0LSZndDtrb2JqKTsKLX0KLUVYUE9SVF9TWU1CT0wocGFkYXRhX2ZyZWUpOwotCi0vKioKLSAqIHBhZGF0YV9hbGxvY19zaGVsbCAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHBhZGF0YSBzaGVsbC4KLSAqCi0gKiBAcGluc3Q6IFBhcmVudCBwYWRhdGFfaW5zdGFuY2Ugb2JqZWN0LgotICoKLSAqIFJldHVybjogbmV3IHNoZWxsIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZXJyb3IKLSAqLwotc3RydWN0IHBhZGF0YV9zaGVsbCAqcGFkYXRhX2FsbG9jX3NoZWxsKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KQotewotCXN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDsKLQlzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwczsKLQotCXBzID0ga3phbGxvY19vYmooKnBzKTsKLQlpZiAoIXBzKQotCQlnb3RvIG91dDsKLQotCXBzLSZndDtwaW5zdCA9IHBpbnN0OwotCi0JY3B1c19yZWFkX2xvY2soKTsKLQlwZCA9IHBhZGF0YV9hbGxvY19wZChwcywgLTEpOwotCWNwdXNfcmVhZF91bmxvY2soKTsKLQotCWlmICghcGQpCi0JCWdvdG8gb3V0X2ZyZWVfcHM7Ci0KLQltdXRleF9sb2NrKCZhbXA7cGluc3QtJmd0O2xvY2spOwotCVJDVV9JTklUX1BPSU5URVIocHMtJmd0O3BkLCBwZCk7Ci0JbGlzdF9hZGQoJmFtcDtwcy0mZ3Q7bGlzdCwgJmFtcDtwaW5zdC0mZ3Q7cHNsaXN0KTsKLQltdXRleF91bmxvY2soJmFtcDtwaW5zdC0mZ3Q7bG9jayk7Ci0KLQlyZXR1cm4gcHM7Ci0KLW91dF9mcmVlX3BzOgotCWtmcmVlKHBzKTsKLW91dDoKLQlyZXR1cm4gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0wocGFkYXRhX2FsbG9jX3NoZWxsKTsKLQotLyoqCi0gKiBwYWRhdGFfZnJlZV9zaGVsbCAtIGZyZWUgYSBwYWRhdGEgc2hlbGwKLSAqCi0gKiBAcHM6IHBhZGF0YSBzaGVsbCB0byBmcmVlCi0gKi8KLXZvaWQgcGFkYXRhX2ZyZWVfc2hlbGwoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMpCi17Ci0Jc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkOwotCi0JaWYgKCFwcykKLQkJcmV0dXJuOwotCi0JbXV0ZXhfbG9jaygmYW1wO3BzLSZndDtwaW5zdC0mZ3Q7bG9jayk7Ci0JbGlzdF9kZWwoJmFtcDtwcy0mZ3Q7bGlzdCk7Ci0JcGQgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHBzLSZndDtwZCwgMSk7Ci0JcGFkYXRhX3B1dF9wZChwZCk7Ci0JbXV0ZXhfdW5sb2NrKCZhbXA7cHMtJmd0O3BpbnN0LSZndDtsb2NrKTsKLQotCWtmcmVlKHBzKTsKLX0KLUVYUE9SVF9TWU1CT0wocGFkYXRhX2ZyZWVfc2hlbGwpOwotCiB2b2lkIF9faW5pdCBwYWRhdGFfaW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGludCBpLCBwb3NzaWJsZV9jcHVzOwotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCWludCByZXQ7Ci0KLQlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9tdWx0aShDUFVIUF9BUF9PTkxJTkVfRFlOLCAmIzM0O3BhZGF0YTpvbmxpbmUmIzM0OywKLQkJCQkgICAgICBwYWRhdGFfY3B1X29ubGluZSwgcGFkYXRhX2NwdV9vZmZsaW5lKTsKLQlpZiAocmV0ICZsdDsgMCkKLQkJZ290byBlcnI7Ci0JaHBfb25saW5lID0gcmV0OwotI2VuZGlmCiAKIAlwb3NzaWJsZV9jcHVzID0gbnVtX3Bvc3NpYmxlX2NwdXMoKTsKIAlwYWRhdGFfd29ya3MgPSBrbWFsbG9jX29ianMoc3RydWN0IHBhZGF0YV93b3JrLCBwb3NzaWJsZV9jcHVzKTsKLQlpZiAoIXBhZGF0YV93b3JrcykKLQkJZ290byByZW1vdmVfb25saW5lX3N0YXRlOwomIzQzOwlpZiAoIXBhZGF0YV93b3JrcykgewomIzQzOwkJcHJfd2FybigmIzM0O3BhZGF0YTogaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4mIzM0Oyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KIAogCWZvciAoaSA9IDA7IGkgJmx0OyBwb3NzaWJsZV9jcHVzOyAmIzQzOyYjNDM7aSkKIAkJbGlzdF9hZGQoJmFtcDtwYWRhdGFfd29ya3NbaV0ucHdfbGlzdCwgJmFtcDtwYWRhdGFfZnJlZV93b3Jrcyk7Ci0KLQlyZXR1cm47Ci0KLXJlbW92ZV9vbmxpbmVfc3RhdGU6Ci0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0JY3B1aHBfcmVtb3ZlX211bHRpX3N0YXRlKGhwX29ubGluZSk7Ci1lcnI6Ci0jZW5kaWYKLQlwcl93YXJuKCYjMzQ7cGFkYXRhOiBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiYjMzQ7KTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2NyeXB0by90Y3J5cHQvdGNyeXB0X3NwZWVkX2NvbXBhcmUucHkgYi90b29scy9jcnlwdG8vdGNyeXB0L3RjcnlwdF9zcGVlZF9jb21wYXJlLnB5CmluZGV4IGYzZjU3ODNjZGMwNjZiLi4wYmYzOGMwNzNkYmMwMyAxMDA3NTUKLS0tIGEvdG9vbHMvY3J5cHRvL3RjcnlwdC90Y3J5cHRfc3BlZWRfY29tcGFyZS5weQomIzQzOyYjNDM7JiM0MzsgYi90b29scy9jcnlwdG8vdGNyeXB0L3RjcnlwdF9zcGVlZF9jb21wYXJlLnB5CkBAIC0yOCwxOSAmIzQzOzI4LDE2IEBAIG51bV9tYj04CiBtb2RlPTIxMQogCiAjIGJhc2Ugc3BlZWQgdGVzdAotbHNtb2QgfCBncmVwIHBjcnlwdCAmYW1wOyZhbXA7IG1vZHByb2JlIC1yIHBjcnlwdAogZG1lc2cgLUMKLW1vZHByb2JlIHRjcnlwdCBhbGc9JiMzNDtwY3J5cHQocmZjNDEwNihnY20oYWVzKSkpJiMzNDsgdHlwZT0zCiYjNDM7bW9kcHJvYmUgdGNyeXB0IGFsZz0mIzM0O3JmYzQxMDYoZ2NtKGFlcykpJiMzNDsgdHlwZT0zCiBtb2Rwcm9iZSB0Y3J5cHQgbW9kZT0ke21vZGV9IHNlYz0ke3NlY30gbnVtX21iPSR7bnVtX21ifQogZG1lc2cgJmd0OyAke3NlcV9udW19X2Jhc2VfZG1lc2cubG9nCiAKICMgbmV3IHNwZWVkIHRlc3QKLWxzbW9kIHwgZ3JlcCBwY3J5cHQgJmFtcDsmYW1wOyBtb2Rwcm9iZSAtciBwY3J5cHQKIGRtZXNnIC1DCi1tb2Rwcm9iZSB0Y3J5cHQgYWxnPSYjMzQ7cGNyeXB0KHJmYzQxMDYoZ2NtKGFlcykpKSYjMzQ7IHR5cGU9MwomIzQzO21vZHByb2JlIHRjcnlwdCBhbGc9JiMzNDtyZmM0MTA2KGdjbShhZXMpKSYjMzQ7IHR5cGU9MwogbW9kcHJvYmUgdGNyeXB0IG1vZGU9JHttb2RlfSBzZWM9JHtzZWN9IG51bV9tYj0ke251bV9tYn0KIGRtZXNnICZndDsgJHtzZXFfbnVtfV9uZXdfZG1lc2cubG9nCi1sc21vZCB8IGdyZXAgcGNyeXB0ICZhbXA7JmFtcDsgbW9kcHJvYmUgLXIgcGNyeXB0CiAKIHRvb2xzL2NyeXB0by90Y3J5cHQvdGNyeXB0X3NwZWVkX2NvbXBhcmUucHkgXAogICAgICR7c2VxX251bX1fYmFzZV9kbWVzZy5sb2cgXAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNCAwMzozNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTkwOAoJCQkJCQkJb3V0cHV0OiA3MwoJCQkJCQkJdGhvdWdodHM6IDEwMjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyBBc3Nlc3NtZW50OiBgcGNyeXB0YCBSZW1vdmFsKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBhIHBhdGNoIHRoYXQgZXNzZW50aWFsbHkgZ3V0cyB0aGUgYHBjcnlwdGAgZW5naW5lIGFuZCBpdHMgc2VyaWFsaXplZCBqb2IgY2FwYWJpbGl0aWVzIHdpdGhpbiBgcGFkYXRhYC4gIE15IGluaXRpYWwgdGhvdWdodCBpcywgJiMzNDtUaGlzIGlzIGEgKnJlbW92YWwqIHBhdGNoIOKAkyBnb29kLiYjMzQ7ICBObyBuZXcgY29kZSBtZWFucyBwb3RlbnRpYWxseSBsZXNzIHdvcmsgZm9yIG1lLgoKTXkgZm9jdXMgaXMgd2hldGhlciB0aGVyZSYjMzk7cyBhbnl0aGluZyAqbmV3KiB0byBmdXp6LiBUaGUgcGF0Y2ggY2xlYW5zIHVwIHRoZSBgRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9wYWRhdGEucnN0YCwgYE1BSU5UQUlORVJTYCwgcmVtb3ZlcyB0aGUgYGNyeXB0by9wY3J5cHQuY2AsIGBpbmNsdWRlL2NyeXB0by9wY3J5cHQuaGAsIGFuZCBtb2RpZmllcyBgaW5jbHVkZS9saW51eC9wYWRhdGEuaGAgYW5kIGBrZXJuZWwvcGFkYXRhLmNgLiAgU3BlY2lmaWNhbGx5LCB0aGUgZGVsZXRlZCBjb2RlIGluY2x1ZGVzIGBwYWRhdGFfZG9fcGFyYWxsZWxgLCBgcGFkYXRhX2RvX3NlcmlhbGAsIGFuZCBhIGhvc3Qgb2YgYXNzb2NpYXRlZCBmdW5jdGlvbnMuICBJdCBhbHNvIHJlbW92ZXMgdGhlIGBDT05GSUdfQ1JZUFRPX1BDUllQVGAgY29uZmlnIG9wdGlvbi4KClNpbmNlIHRoZSBmdW5jdGlvbmFsaXR5IHJlbW92ZWQgaXMgdGhlIHBhcmFsbGVsIGNyeXB0byBlbmdpbmUgYW5kIHRoZSBzZXJpYWxpemVkIGpvYiBzdXBwb3J0IGZyb20gcGFkYXRhLCBteSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhpcyBkb2VzbiYjMzk7dCBuZWNlc3NpdGF0ZSBmdXp6aW5nLiBNeSBtYWluIGNvbmNlcm4gaXMgdGhhdCBwZXJoYXBzIHRoZSBtdWx0aXRocmVhZGVkIGpvYiBzdXBwb3J0IGhhZCBiZWVuIGFmZmVjdGVkIGluIGEgd2F5IHRoYXQgcmVxdWlyZXMgZnV6emluZy4KCkkmIzM5O20gY2hlY2tpbmcgYGtlcm5lbC9wYWRhdGEuY2AuIGBwYWRhdGFfZG9fbXVsdGl0aHJlYWRlZGAgcmVtYWlucy4gYHBhZGF0YV9pbml0YCBoYXMgYmVlbiBhZGp1c3RlZCwgYnV0IGl0JiMzOTtzICpyZW1vdmluZyogQ1BVIGhvdHBsdWcgc3RhdGUgcmVnaXN0cmF0aW9uIChgY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGlgKS4gVGhpcyB3YXMgZXhjbHVzaXZlbHkgdXNlZCBieSB0aGUgc2VyaWFsaXplZCBqb2Igc3VwcG9ydCwgd2hpY2ggY29uZmlybXMgbXkgYXNzdW1wdGlvbi4gIEZ1bmN0aW9ucyBsaWtlIGBwYWRhdGFfYWxsb2NfcGRgLCBgcGFkYXRhX2ZyZWVfcGRgLCBgcGFkYXRhX3JlcGxhY2VgLCBgcGFkYXRhX3NldF9jcHVtYXNrYCBhcmUgYmVpbmcgcmVtb3ZlZCBhcyB3ZWxsLgoKSSYjMzk7bSB2ZXJ5IGNvbmZpZGVudCBhdCB0aGlzIHBvaW50IHRoYXQgdGhpcyBpcyBhIHB1cmVseSBhZGRpdGl2ZSByZW1vdmFsIHBhdGNoLiAgVGhlcmUmIzM5O3Mgbm8gbmV3IGNvZGUgdG8gdGVzdCwgd2hpY2ggbWVhbnMgdGhlcmUmIzM5O3Mgbm8gbmV3IGF0dGFjayBzdXJmYWNlIHRvIGZ1enouCgpJJiMzOTttIGRvdWJsZS1jaGVja2luZyB0aGUgYGtlcm5lbC9wYWRhdGEuY2AgZGlmZiwgYW5kIGNvbmZpcm0gdGhhdCB0aGUgYWRkaXRpb25zIGluIGBrZXJuZWwvcGFkYXRhLmNgIGFyZSBzaW1wbHkgYCNpbmNsdWRlYHMsIHdoaWNoIHdlcmUgcHJldmlvdXNseSBpbXBsaWNpdGx5IGluY2x1ZGVkIG9yIHJlb3JkZXJlZCwgYXMgd2VsbCBhcyBtaW5vciBhZGp1c3RtZW50cyB0byBgcGFkYXRhX2luaXRgLgoKVGhlcmVmb3JlLCBJJiMzOTttIHNldHRpbmcgYFdvcnRoRnV6emluZz1mYWxzZWAuIFRoZSByZWFzb25pbmcgaXMgdGhhdCB0aGUgcGF0Y2ggKnJlbW92ZXMqIGBwY3J5cHRgIGFuZCBpdHMgcmVsYXRlZCBmdW5jdGlvbmFsaXR5LiBJdCBkb2VzICpub3QqIGludHJvZHVjZSBuZXcgZnVuY3Rpb25hbGl0eSB0byB0ZXN0LgoKSSB3aWxsIGNhbGwgYHNldC1yZXN1bHRzYCB3aXRoIGBXb3J0aEZ1enppbmc9ZmFsc2VgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDAzOjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVtb3ZlcyB0aGUgcGNyeXB0IHBhcmFsbGVsIGNyeXB0byBlbmdpbmUgYW5kIHRoZSBhc3NvY2lhdGVkIHNlcmlhbGl6ZWQgam9iIHN1cHBvcnQgZnJvbSBwYWRhdGEuIEl0IGlzIGEgcHVyZSBjbGVhbnVwL3JlbW92YWwgcGF0Y2ggYW5kIGRvZXMgbm90IGludHJvZHVjZSBhbnkgbmV3IGZ1bmN0aW9uYWwgY29kZSBvciBsb2dpYyB0aGF0IHJlcXVpcmVzIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZW1vdmVzIHRoZSBwY3J5cHQgcGFyYWxsZWwgY3J5cHRvIGVuZ2luZSBhbmQgdGhlIGFzc29jaWF0ZWQgc2VyaWFsaXplZCBqb2Igc3VwcG9ydCBmcm9tIHBhZGF0YS4gSXQgaXMgYSBwdXJlIGNsZWFudXAvcmVtb3ZhbCBwYXRjaCBhbmQgZG9lcyBub3QgaW50cm9kdWNlIGFueSBuZXcgZnVuY3Rpb25hbCBjb2RlIG9yIGxvZ2ljIHRoYXQgcmVxdWlyZXMgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wNy0xNFQwMzozNToxNC43MjkxNjkxMjNaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzQ2MDkzOTI1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVtb3ZlcyB0aGUgcGNyeXB0IHBhcmFsbGVsIGNyeXB0byBlbmdpbmUgYW5kIHRoZSBhc3NvY2lhdGVkIHNlcmlhbGl6ZWQgam9iIHN1cHBvcnQgZnJvbSBwYWRhdGEuIEl0IGlzIGEgcHVyZSBjbGVhbnVwL3JlbW92YWwgcGF0Y2ggYW5kIGRvZXMgbm90IGludHJvZHVjZSBhbnkgbmV3IGZ1bmN0aW9uYWwgY29kZSBvciBsb2dpYyB0aGF0IHJlcXVpcmVzIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNFQwMzozNToxNC43MjkxNzM1OTRaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc4Njc4MzQyMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGNjMzk0Y2M5Y2UxZGNjYzQxNWJjOGZjNjVmZTY1NjdhYThjNzUzNDRcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFR1ZSBKdWwgMTQgMDM6MzU6MTIgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9wYWRhdGEucnN0IGIvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9wYWRhdGEucnN0XFxuaW5kZXggMDViNzNjNmMxMDVmMDQuLmQ3ZGM3ZTMzMDU0ZGJkIDEwMDY0NFxcbi0tLSBhL0RvY3VtZW50YXRpb24vY29yZS1hcGkvcGFkYXRhLnJzdFxcbisrKyBiL0RvY3VtZW50YXRpb24vY29yZS1hcGkvcGFkYXRhLnJzdFxcbkBAIC03LDE1MiArNywxMSBAQCBUaGUgcGFkYXRhIHBhcmFsbGVsIGV4ZWN1dGlvbiBtZWNoYW5pc21cXG4gOkRhdGU6IE1heSAyMDIwXFxuIFxcbiBQYWRhdGEgaXMgYSBtZWNoYW5pc20gYnkgd2hpY2ggdGhlIGtlcm5lbCBjYW4gZmFybSBqb2JzIG91dCB0byBiZSBkb25lIGluXFxuLXBhcmFsbGVsIG9uIG11bHRpcGxlIENQVXMgd2hpbGUgb3B0aW9uYWxseSByZXRhaW5pbmcgdGhlaXIgb3JkZXJpbmcuXFxuK3BhcmFsbGVsIG9uIG11bHRpcGxlIENQVXMgd2hpbGUgY29vcmRpbmF0aW5nIGJldHdlZW4gdGhyZWFkcy5cXG4gXFxuLUl0IHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCBmb3IgSVBzZWMsIHdoaWNoIG5lZWRzIHRvIHBlcmZvcm0gZW5jcnlwdGlvbiBhbmRcXG4tZGVjcnlwdGlvbiBvbiBsYXJnZSBudW1iZXJzIG9mIHBhY2tldHMgd2l0aG91dCByZW9yZGVyaW5nIHRob3NlIHBhY2tldHMuICBUaGlzXFxuLWlzIGN1cnJlbnRseSB0aGUgc29sZSBjb25zdW1lciBvZiBwYWRhdGEncyBzZXJpYWxpemVkIGpvYiBzdXBwb3J0Llxcbi1cXG4tUGFkYXRhIGFsc28gc3VwcG9ydHMgbXVsdGl0aHJlYWRlZCBqb2JzLCBzcGxpdHRpbmcgdXAgdGhlIGpvYiBldmVubHkgd2hpbGUgbG9hZFxcbitQYWRhdGEgc3VwcG9ydHMgbXVsdGl0aHJlYWRlZCBqb2JzLCBzcGxpdHRpbmcgdXAgdGhlIGpvYiBldmVubHkgd2hpbGUgbG9hZFxcbiBiYWxhbmNpbmcgYW5kIGNvb3JkaW5hdGluZyBiZXR3ZWVuIHRocmVhZHMuXFxuIFxcbi1SdW5uaW5nIFNlcmlhbGl6ZWQgSm9ic1xcbi09PT09PT09PT09PT09PT09PT09PT09PVxcbi1cXG4tSW5pdGlhbGl6aW5nXFxuLS0tLS0tLS0tLS0tLVxcbi1cXG4tVGhlIGZpcnN0IHN0ZXAgaW4gdXNpbmcgcGFkYXRhIHRvIHJ1biBzZXJpYWxpemVkIGpvYnMgaXMgdG8gc2V0IHVwIGFcXG4tcGFkYXRhX2luc3RhbmNlIHN0cnVjdHVyZSBmb3Igb3ZlcmFsbCBjb250cm9sIG9mIGhvdyBqb2JzIGFyZSB0byBiZSBydW46Olxcbi1cXG4tICAgICNpbmNsdWRlIFxcdTAwM2NsaW51eC9wYWRhdGEuaFxcdTAwM2VcXG4tXFxuLSAgICBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwYWRhdGFfYWxsb2MoY29uc3QgY2hhciAqbmFtZSk7XFxuLVxcbi0nbmFtZScgc2ltcGx5IGlkZW50aWZpZXMgdGhlIGluc3RhbmNlLlxcbi1cXG4tVGhlbiwgY29tcGxldGUgcGFkYXRhIGluaXRpYWxpemF0aW9uIGJ5IGFsbG9jYXRpbmcgYSBwYWRhdGFfc2hlbGw6Olxcbi1cXG4tICAgc3RydWN0IHBhZGF0YV9zaGVsbCAqcGFkYXRhX2FsbG9jX3NoZWxsKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KTtcXG4tXFxuLUEgcGFkYXRhX3NoZWxsIGlzIHVzZWQgdG8gc3VibWl0IGEgam9iIHRvIHBhZGF0YSBhbmQgYWxsb3dzIGEgc2VyaWVzIG9mIHN1Y2hcXG4tam9icyB0byBiZSBzZXJpYWxpemVkIGluZGVwZW5kZW50bHkuICBBIHBhZGF0YV9pbnN0YW5jZSBtYXkgaGF2ZSBvbmUgb3IgbW9yZVxcbi1wYWRhdGFfc2hlbGxzIGFzc29jaWF0ZWQgd2l0aCBpdCwgZWFjaCBhbGxvd2luZyBhIHNlcGFyYXRlIHNlcmllcyBvZiBqb2JzLlxcbi1cXG4tTW9kaWZ5aW5nIGNwdW1hc2tzXFxuLS0tLS0tLS0tLS0tLS0tLS0tLVxcbi1cXG4tVGhlIENQVXMgdXNlZCB0byBydW4gam9icyBjYW4gYmUgY2hhbmdlZCBpbiB0d28gd2F5cywgcHJvZ3JhbW1hdGljYWxseSB3aXRoXFxuLXBhZGF0YV9zZXRfY3B1bWFzaygpIG9yIHZpYSBzeXNmcy4gIFRoZSBmb3JtZXIgaXMgZGVmaW5lZDo6XFxuLVxcbi0gICAgaW50IHBhZGF0YV9zZXRfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdW1hc2tfdHlwZSxcXG4tXFx0XFx0XFx0ICAgY3B1bWFza192YXJfdCBjcHVtYXNrKTtcXG4tXFxuLUhlcmUgY3B1bWFza190eXBlIGlzIG9uZSBvZiBQQURBVEFfQ1BVX1BBUkFMTEVMIG9yIFBBREFUQV9DUFVfU0VSSUFMLCB3aGVyZSBhXFxuLXBhcmFsbGVsIGNwdW1hc2sgZGVzY3JpYmVzIHdoaWNoIHByb2Nlc3NvcnMgd2lsbCBiZSB1c2VkIHRvIGV4ZWN1dGUgam9ic1xcbi1zdWJtaXR0ZWQgdG8gdGhpcyBpbnN0YW5jZSBpbiBwYXJhbGxlbCBhbmQgYSBzZXJpYWwgY3B1bWFzayBkZWZpbmVzIHdoaWNoXFxuLXByb2Nlc3NvcnMgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZCBhcyB0aGUgc2VyaWFsaXphdGlvbiBjYWxsYmFjayBwcm9jZXNzb3IuXFxuLWNwdW1hc2sgc3BlY2lmaWVzIHRoZSBuZXcgY3B1bWFzayB0byB1c2UuXFxuLVxcbi1UaGVyZSBtYXkgYmUgc3lzZnMgZmlsZXMgZm9yIGFuIGluc3RhbmNlJ3MgY3B1bWFza3MuICBGb3IgZXhhbXBsZSwgcGNyeXB0J3NcXG4tbGl2ZSBpbiAvc3lzL2tlcm5lbC9wY3J5cHQvXFx1MDAzY2luc3RhbmNlLW5hbWVcXHUwMDNlLiAgV2l0aGluIGFuIGluc3RhbmNlJ3MgZGlyZWN0b3J5XFxuLXRoZXJlIGFyZSB0d28gZmlsZXMsIHBhcmFsbGVsX2NwdW1hc2sgYW5kIHNlcmlhbF9jcHVtYXNrLCBhbmQgZWl0aGVyIGNwdW1hc2tcXG4tbWF5IGJlIGNoYW5nZWQgYnkgZWNob2luZyBhIGJpdG1hc2sgaW50byB0aGUgZmlsZSwgZm9yIGV4YW1wbGU6Olxcbi1cXG4tICAgIGVjaG8gZiBcXHUwMDNlIC9zeXMva2VybmVsL3BjcnlwdC9wZW5jcnlwdC9wYXJhbGxlbF9jcHVtYXNrXFxuLVxcbi1SZWFkaW5nIG9uZSBvZiB0aGVzZSBmaWxlcyBzaG93cyB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrLCB3aGljaCBtYXkgYmVcXG4tZGlmZmVyZW50IGZyb20gdGhlICd1c2FibGUnIGNwdW1hc2suXFxuLVxcbi1QYWRhdGEgbWFpbnRhaW5zIHR3byBwYWlycyBvZiBjcHVtYXNrcyBpbnRlcm5hbGx5LCB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrc1xcbi1hbmQgdGhlICd1c2FibGUnIGNwdW1hc2tzLiAgKEVhY2ggcGFpciBjb25zaXN0cyBvZiBhIHBhcmFsbGVsIGFuZCBhIHNlcmlhbFxcbi1jcHVtYXNrLikgIFRoZSB1c2VyLXN1cHBsaWVkIGNwdW1hc2tzIGRlZmF1bHQgdG8gYWxsIHBvc3NpYmxlIENQVXMgb24gaW5zdGFuY2VcXG4tYWxsb2NhdGlvbiBhbmQgbWF5IGJlIGNoYW5nZWQgYXMgYWJvdmUuICBUaGUgdXNhYmxlIGNwdW1hc2tzIGFyZSBhbHdheXMgYVxcbi1zdWJzZXQgb2YgdGhlIHVzZXItc3VwcGxpZWQgY3B1bWFza3MgYW5kIGNvbnRhaW4gb25seSB0aGUgb25saW5lIENQVXMgaW4gdGhlXFxuLXVzZXItc3VwcGxpZWQgbWFza3M7IHRoZXNlIGFyZSB0aGUgY3B1bWFza3MgcGFkYXRhIGFjdHVhbGx5IHVzZXMuICBTbyBpdCBpc1xcbi1sZWdhbCB0byBzdXBwbHkgYSBjcHVtYXNrIHRvIHBhZGF0YSB0aGF0IGNvbnRhaW5zIG9mZmxpbmUgQ1BVcy4gIE9uY2UgYW5cXG4tb2ZmbGluZSBDUFUgaW4gdGhlIHVzZXItc3VwcGxpZWQgY3B1bWFzayBjb21lcyBvbmxpbmUsIHBhZGF0YSBpcyBnb2luZyB0byB1c2VcXG4taXQuXFxuLVxcbi1DaGFuZ2luZyB0aGUgQ1BVIG1hc2tzIGFyZSBleHBlbnNpdmUgb3BlcmF0aW9ucywgc28gaXQgc2hvdWxkIG5vdCBiZSBkb25lIHdpdGhcXG4tZ3JlYXQgZnJlcXVlbmN5Llxcbi1cXG4tUnVubmluZyBBIEpvYlxcbi0tLS0tLS0tLS0tLS0tXFxuLVxcbi1BY3R1YWxseSBzdWJtaXR0aW5nIHdvcmsgdG8gdGhlIHBhZGF0YSBpbnN0YW5jZSByZXF1aXJlcyB0aGUgY3JlYXRpb24gb2YgYVxcbi1wYWRhdGFfcHJpdiBzdHJ1Y3R1cmUsIHdoaWNoIHJlcHJlc2VudHMgb25lIGpvYjo6XFxuLVxcbi0gICAgc3RydWN0IHBhZGF0YV9wcml2IHtcXG4tICAgICAgICAvKiBPdGhlciBzdHVmZiBoZXJlLi4uICovXFxuLVxcdHZvaWQgICAgICAgICAgICAgICAgICAgICgqcGFyYWxsZWwpKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTtcXG4tXFx0dm9pZCAgICAgICAgICAgICAgICAgICAgKCpzZXJpYWwpKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTtcXG4tICAgIH07XFxuLVxcbi1UaGlzIHN0cnVjdHVyZSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgZW1iZWRkZWQgd2l0aGluIHNvbWUgbGFyZ2VyXFxuLXN0cnVjdHVyZSBzcGVjaWZpYyB0byB0aGUgd29yayB0byBiZSBkb25lLiAgTW9zdCBvZiBpdHMgZmllbGRzIGFyZSBwcml2YXRlIHRvXFxuLXBhZGF0YSwgYnV0IHRoZSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIHplcm9lZCBhdCBpbml0aWFsaXNhdGlvbiB0aW1lLCBhbmQgdGhlXFxuLXBhcmFsbGVsKCkgYW5kIHNlcmlhbCgpIGZ1bmN0aW9ucyBzaG91bGQgYmUgcHJvdmlkZWQuICBUaG9zZSBmdW5jdGlvbnMgd2lsbFxcbi1iZSBjYWxsZWQgaW4gdGhlIHByb2Nlc3Mgb2YgZ2V0dGluZyB0aGUgd29yayBkb25lIGFzIHdlIHdpbGwgc2VlXFxuLW1vbWVudGFyaWx5Llxcbi1cXG4tVGhlIHN1Ym1pc3Npb24gb2YgdGhlIGpvYiBpcyBkb25lIHdpdGg6Olxcbi1cXG4tICAgIGludCBwYWRhdGFfZG9fcGFyYWxsZWwoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsXFxuLVxcdFxcdCAgICAgICAgICAgc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEsIGludCAqY2JfY3B1KTtcXG4tXFxuLVRoZSBwcyBhbmQgcGFkYXRhIHN0cnVjdHVyZXMgbXVzdCBiZSBzZXQgdXAgYXMgZGVzY3JpYmVkIGFib3ZlOyBjYl9jcHVcXG4tcG9pbnRzIHRvIHRoZSBwcmVmZXJyZWQgQ1BVIHRvIGJlIHVzZWQgZm9yIHRoZSBmaW5hbCBjYWxsYmFjayB3aGVuIHRoZSBqb2IgaXNcXG4tZG9uZTsgaXQgbXVzdCBiZSBpbiB0aGUgY3VycmVudCBpbnN0YW5jZSdzIENQVSBtYXNrIChpZiBub3QgdGhlIGNiX2NwdSBwb2ludGVyXFxuLWlzIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIENQVSBhY3R1YWxseSBjaG9zZW4pLiAgVGhlIHJldHVybiB2YWx1ZSBmcm9tXFxuLXBhZGF0YV9kb19wYXJhbGxlbCgpIGlzIHplcm8gb24gc3VjY2VzcywgaW5kaWNhdGluZyB0aGF0IHRoZSBqb2IgaXMgaW5cXG4tcHJvZ3Jlc3MuIC1FQlVTWSBtZWFucyB0aGF0IHNvbWVib2R5LCBzb21ld2hlcmUgZWxzZSBpcyBtZXNzaW5nIHdpdGggdGhlXFxuLWluc3RhbmNlJ3MgQ1BVIG1hc2ssIHdoaWxlIC1FSU5WQUwgaXMgYSBjb21wbGFpbnQgYWJvdXQgY2JfY3B1IG5vdCBiZWluZyBpbiB0aGVcXG4tc2VyaWFsIGNwdW1hc2ssIG5vIG9ubGluZSBDUFVzIGluIHRoZSBwYXJhbGxlbCBvciBzZXJpYWwgY3B1bWFza3MsIG9yIGEgc3RvcHBlZFxcbi1pbnN0YW5jZS5cXG4tXFxuLUVhY2ggam9iIHN1Ym1pdHRlZCB0byBwYWRhdGFfZG9fcGFyYWxsZWwoKSB3aWxsLCBpbiB0dXJuLCBiZSBwYXNzZWQgdG9cXG4tZXhhY3RseSBvbmUgY2FsbCB0byB0aGUgYWJvdmUtbWVudGlvbmVkIHBhcmFsbGVsKCkgZnVuY3Rpb24sIG9uIG9uZSBDUFUsIHNvXFxuLXRydWUgcGFyYWxsZWxpc20gaXMgYWNoaWV2ZWQgYnkgc3VibWl0dGluZyBtdWx0aXBsZSBqb2JzLiAgcGFyYWxsZWwoKSBydW5zIHdpdGhcXG4tc29mdHdhcmUgaW50ZXJydXB0cyBkaXNhYmxlZCBhbmQgdGh1cyBjYW5ub3Qgc2xlZXAuICBUaGUgcGFyYWxsZWwoKVxcbi1mdW5jdGlvbiBnZXRzIHRoZSBwYWRhdGFfcHJpdiBzdHJ1Y3R1cmUgcG9pbnRlciBhcyBpdHMgbG9uZSBwYXJhbWV0ZXI7XFxuLWluZm9ybWF0aW9uIGFib3V0IHRoZSBhY3R1YWwgd29yayB0byBiZSBkb25lIGlzIHByb2JhYmx5IG9idGFpbmVkIGJ5IHVzaW5nXFxuLWNvbnRhaW5lcl9vZigpIHRvIGZpbmQgdGhlIGVuY2xvc2luZyBzdHJ1Y3R1cmUuXFxuLVxcbi1Ob3RlIHRoYXQgcGFyYWxsZWwoKSBoYXMgbm8gcmV0dXJuIHZhbHVlOyB0aGUgcGFkYXRhIHN1YnN5c3RlbSBhc3N1bWVzIHRoYXRcXG4tcGFyYWxsZWwoKSB3aWxsIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBqb2IgZnJvbSB0aGlzIHBvaW50LiAgVGhlIGpvYlxcbi1uZWVkIG5vdCBiZSBjb21wbGV0ZWQgZHVyaW5nIHRoaXMgY2FsbCwgYnV0LCBpZiBwYXJhbGxlbCgpIGxlYXZlcyB3b3JrXFxuLW91dHN0YW5kaW5nLCBpdCBzaG91bGQgYmUgcHJlcGFyZWQgdG8gYmUgY2FsbGVkIGFnYWluIHdpdGggYSBuZXcgam9iIGJlZm9yZVxcbi10aGUgcHJldmlvdXMgb25lIGNvbXBsZXRlcy5cXG4tXFxuLVNlcmlhbGl6aW5nIEpvYnNcXG4tLS0tLS0tLS0tLS0tLS0tLVxcbi1cXG4tV2hlbiBhIGpvYiBkb2VzIGNvbXBsZXRlLCBwYXJhbGxlbCgpIChvciB3aGF0ZXZlciBmdW5jdGlvbiBhY3R1YWxseSBmaW5pc2hlc1xcbi10aGUgd29yaykgc2hvdWxkIGluZm9ybSBwYWRhdGEgb2YgdGhlIGZhY3Qgd2l0aCBhIGNhbGwgdG86Olxcbi1cXG4tICAgIHZvaWQgcGFkYXRhX2RvX3NlcmlhbChzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSk7XFxuLVxcbi1BdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUsIHBhZGF0YV9kb19zZXJpYWwoKSB3aWxsIHRyaWdnZXIgYSBjYWxsIHRvIHRoZVxcbi1zZXJpYWwoKSBmdW5jdGlvbiBpbiB0aGUgcGFkYXRhX3ByaXYgc3RydWN0dXJlLiAgVGhhdCBjYWxsIHdpbGwgaGFwcGVuIG9uXFxuLXRoZSBDUFUgcmVxdWVzdGVkIGluIHRoZSBpbml0aWFsIGNhbGwgdG8gcGFkYXRhX2RvX3BhcmFsbGVsKCk7IGl0LCB0b28sIGlzXFxuLXJ1biB3aXRoIGxvY2FsIHNvZnR3YXJlIGludGVycnVwdHMgZGlzYWJsZWQuXFxuLU5vdGUgdGhhdCB0aGlzIGNhbGwgbWF5IGJlIGRlZmVycmVkIGZvciBhIHdoaWxlIHNpbmNlIHRoZSBwYWRhdGEgY29kZSB0YWtlc1xcbi1wYWlucyB0byBlbnN1cmUgdGhhdCBqb2JzIGFyZSBjb21wbGV0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZVxcbi1zdWJtaXR0ZWQuXFxuLVxcbi1EZXN0cm95aW5nXFxuLS0tLS0tLS0tLS1cXG4tXFxuLUNsZWFuaW5nIHVwIGEgcGFkYXRhIGluc3RhbmNlIHByZWRpY3RhYmx5IGludm9sdmVzIGNhbGxpbmcgdGhlIHR3byBmcmVlXFxuLWZ1bmN0aW9ucyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIGFsbG9jYXRpb24gaW4gcmV2ZXJzZTo6XFxuLVxcbi0gICAgdm9pZCBwYWRhdGFfZnJlZV9zaGVsbChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcyk7XFxuLSAgICB2b2lkIHBhZGF0YV9mcmVlKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KTtcXG4tXFxuLUl0IGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIGFsbCBvdXRzdGFuZGluZyBqb2JzIGFyZSBjb21wbGV0ZVxcbi1iZWZvcmUgYW55IG9mIHRoZSBhYm92ZSBhcmUgY2FsbGVkLlxcbi1cXG4gUnVubmluZyBNdWx0aXRocmVhZGVkIEpvYnNcXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT1cXG4gXFxuZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlNcXG5pbmRleCA4MDZiZDJkODBkMTUzNS4uMjYwYjNiZGM3NjE0OGMgMTAwNjQ0XFxuLS0tIGEvTUFJTlRBSU5FUlNcXG4rKysgYi9NQUlOVEFJTkVSU1xcbkBAIC0yMTA4NSwxMyArMjEwODUsNiBAQCBMOlxcdG5ldGRldkB2Z2VyLmtlcm5lbC5vcmdcXG4gUzpcXHRNYWludGFpbmVkXFxuIEY6XFx0ZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3BjbmV0MzIuY1xcbiBcXG4tUENSWVBUIFBBUkFMTEVMIENSWVBUTyBFTkdJTkVcXG4tTTpcXHRTdGVmZmVuIEtsYXNzZXJ0IFxcdTAwM2NzdGVmZmVuLmtsYXNzZXJ0QHNlY3VuZXQuY29tXFx1MDAzZVxcbi1MOlxcdGxpbnV4LWNyeXB0b0B2Z2VyLmtlcm5lbC5vcmdcXG4tUzpcXHRNYWludGFpbmVkXFxuLUY6XFx0Y3J5cHRvL3BjcnlwdC5jXFxuLUY6XFx0aW5jbHVkZS9jcnlwdG8vcGNyeXB0LmhcXG4tXFxuIFBEUyBEU0MgVklSVElPIERBVEEgUEFUSCBBQ0NFTEVSQVRPUlxcbiBSOlxcdEJyZXR0IENyZWVsZXkgXFx1MDAzY2JyZXR0LmNyZWVsZXlAYW1kLmNvbVxcdTAwM2VcXG4gRjpcXHRkcml2ZXJzL3ZkcGEvcGRzL1xcbmRpZmYgLS1naXQgYS9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uMzJfZGVmY29uZmlnIGIvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjMyX2RlZmNvbmZpZ1xcbmluZGV4IDdjOGYwMTUxM2VkMjdjLi5jZjk3ZjQ0OTM1NzM2ZiAxMDA2NDRcXG4tLS0gYS9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uMzJfZGVmY29uZmlnXFxuKysrIGIvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjMyX2RlZmNvbmZpZ1xcbkBAIC0xMDYzLDcgKzEwNjMsNiBAQCBDT05GSUdfU0VDVVJJVFlfWUFNQT15XFxuIENPTkZJR19ERUZBVUxUX1NFQ1VSSVRZX0RBQz15XFxuIENPTkZJR19DUllQVE9fVVNFUj1tXFxuIENPTkZJR19DUllQVE9fU0VMRlRFU1RTPXlcXG4tQ09ORklHX0NSWVBUT19QQ1JZUFQ9bVxcbiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tXFxuIENPTkZJR19DUllQVE9fQU5VQklTPW1cXG4gQ09ORklHX0NSWVBUT19CTE9XRklTSD1tXFxuZGlmZiAtLWdpdCBhL2FyY2gvbG9vbmdhcmNoL2NvbmZpZ3MvbG9vbmdzb242NF9kZWZjb25maWcgYi9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uNjRfZGVmY29uZmlnXFxuaW5kZXggOGUzOTA2ZDNiZDcwY2EuLmQwZWNlNzkyMGYyMTU4IDEwMDY0NFxcbi0tLSBhL2FyY2gvbG9vbmdhcmNoL2NvbmZpZ3MvbG9vbmdzb242NF9kZWZjb25maWdcXG4rKysgYi9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uNjRfZGVmY29uZmlnXFxuQEAgLTEwOTYsNyArMTA5Niw2IEBAIENPTkZJR19TRUNVUklUWV9ZQU1BPXlcXG4gQ09ORklHX0RFRkFVTFRfU0VDVVJJVFlfREFDPXlcXG4gQ09ORklHX0NSWVBUT19VU0VSPW1cXG4gQ09ORklHX0NSWVBUT19TRUxGVEVTVFM9eVxcbi1DT05GSUdfQ1JZUFRPX1BDUllQVD1tXFxuIENPTkZJR19DUllQVE9fQ1JZUFREPW1cXG4gQ09ORklHX0NSWVBUT19BTlVCSVM9bVxcbiBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIPW1cXG5kaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NvbmZpZ3MvZGVidWdfZGVmY29uZmlnIGIvYXJjaC9zMzkwL2NvbmZpZ3MvZGVidWdfZGVmY29uZmlnXFxuaW5kZXggNTQ2MzdiZTg3ZmI3MzUuLjE1ZjUxY2I5MjRkYmYwIDEwMDY0NFxcbi0tLSBhL2FyY2gvczM5MC9jb25maWdzL2RlYnVnX2RlZmNvbmZpZ1xcbisrKyBiL2FyY2gvczM5MC9jb25maWdzL2RlYnVnX2RlZmNvbmZpZ1xcbkBAIC03NjUsNyArNzY1LDYgQEAgQ09ORklHX0NSWVBUT19VU0VSPW1cXG4gQ09ORklHX0NSWVBUT19TRUxGVEVTVFM9eVxcbiBDT05GSUdfQ1JZUFRPX1NFTEZURVNUU19GVUxMPXlcXG4gQ09ORklHX0NSWVBUT19OVUxMPXlcXG4tQ09ORklHX0NSWVBUT19QQ1JZUFQ9bVxcbiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tXFxuIENPTkZJR19DUllQVE9fQkVOQ0hNQVJLPW1cXG4gQ09ORklHX0NSWVBUT19ESD1tXFxuZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jb25maWdzL2RlZmNvbmZpZyBiL2FyY2gvczM5MC9jb25maWdzL2RlZmNvbmZpZ1xcbmluZGV4IDVmNTExNGEyNTNjZjdjLi44ODI1N2ZmM2MyYzZhYSAxMDA2NDRcXG4tLS0gYS9hcmNoL3MzOTAvY29uZmlncy9kZWZjb25maWdcXG4rKysgYi9hcmNoL3MzOTAvY29uZmlncy9kZWZjb25maWdcXG5AQCAtNzQ5LDcgKzc0OSw2IEBAIENPTkZJR19DUllQVE9fRklQUz15XFxuIENPTkZJR19DUllQVE9fVVNFUj1tXFxuIENPTkZJR19DUllQVE9fU0VMRlRFU1RTPXlcXG4gQ09ORklHX0NSWVBUT19OVUxMPXlcXG4tQ09ORklHX0NSWVBUT19QQ1JZUFQ9bVxcbiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tXFxuIENPTkZJR19DUllQVE9fQkVOQ0hNQVJLPW1cXG4gQ09ORklHX0NSWVBUT19ESD1tXFxuZGlmZiAtLWdpdCBhL2NyeXB0by9LY29uZmlnIGIvY3J5cHRvL0tjb25maWdcXG5pbmRleCBmMWUzNzIxOTUyNzMxNi4uMjI4YTdhYzlmMDYzYTIgMTAwNjQ0XFxuLS0tIGEvY3J5cHRvL0tjb25maWdcXG4rKysgYi9jcnlwdG8vS2NvbmZpZ1xcbkBAIC0yMDEsMTYgKzIwMSw2IEBAIGNvbmZpZyBDUllQVE9fTlVMTFxcbiBcXHRoZWxwXFxuIFxcdCAgVGhlc2UgYXJlICdOdWxsJyBhbGdvcml0aG1zLCB1c2VkIGJ5IElQc2VjLCB3aGljaCBkbyBub3RoaW5nLlxcbiBcXG4tY29uZmlnIENSWVBUT19QQ1JZUFRcXG4tXFx0dHJpc3RhdGUgXFxcIlBhcmFsbGVsIGNyeXB0byBlbmdpbmVcXFwiXFxuLVxcdGRlcGVuZHMgb24gU01QXFxuLVxcdHNlbGVjdCBQQURBVEFcXG4tXFx0c2VsZWN0IENSWVBUT19NQU5BR0VSXFxuLVxcdHNlbGVjdCBDUllQVE9fQUVBRFxcbi1cXHRoZWxwXFxuLVxcdCAgVGhpcyBjb252ZXJ0cyBhbiBhcmJpdHJhcnkgY3J5cHRvIGFsZ29yaXRobSBpbnRvIGEgcGFyYWxsZWxcXG4tXFx0ICBhbGdvcml0aG0gdGhhdCBleGVjdXRlcyBpbiBrZXJuZWwgdGhyZWFkcy5cXG4tXFxuIGNvbmZpZyBDUllQVE9fQ1JZUFREXFxuIFxcdHRyaXN0YXRlIFxcXCJTb2Z0d2FyZSBhc3luYyBjcnlwdG8gZGFlbW9uXFxcIlxcbiBcXHRzZWxlY3QgQ1JZUFRPX0FFQURcXG5kaWZmIC0tZ2l0IGEvY3J5cHRvL01ha2VmaWxlIGIvY3J5cHRvL01ha2VmaWxlXFxuaW5kZXggODM4NmQ1NWE5NzU1ZTcuLjJlNDg3Yzk0NmU2M2Q3IDEwMDY0NFxcbi0tLSBhL2NyeXB0by9NYWtlZmlsZVxcbisrKyBiL2NyeXB0by9NYWtlZmlsZVxcbkBAIC0xMjAsNyArMTIwLDYgQEAgQ0ZMQUdTX2FlZ2lzMTI4LW5lb24taW5uZXIubyArPSAkKGFlZ2lzMTI4LWNmbGFncy15KVxcbiBhZWdpczEyOC0kKENPTkZJR19DUllQVE9fQUVHSVMxMjhfU0lNRCkgKz0gYWVnaXMxMjgtbmVvbi5vIGFlZ2lzMTI4LW5lb24taW5uZXIub1xcbiBlbmRpZlxcbiBcXG4tb2JqLSQoQ09ORklHX0NSWVBUT19QQ1JZUFQpICs9IHBjcnlwdC5vXFxuIG9iai0kKENPTkZJR19DUllQVE9fQ1JZUFREKSArPSBjcnlwdGQub1xcbiBvYmotJChDT05GSUdfQ1JZUFRPX0RFUykgKz0gZGVzX2dlbmVyaWMub1xcbiBvYmotJChDT05GSUdfQ1JZUFRPX0JMT1dGSVNIKSArPSBibG93ZmlzaF9nZW5lcmljLm9cXG5kaWZmIC0tZ2l0IGEvY3J5cHRvL3BjcnlwdC5jIGIvY3J5cHRvL3BjcnlwdC5jXFxuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggOWYzNzI0NDI5ODFlNjUuLjAwMDAwMDAwMDAwMDAwXFxuLS0tIGEvY3J5cHRvL3BjcnlwdC5jXFxuKysrIC9kZXYvbnVsbFxcbkBAIC0xLDM5NCArMCwwIEBAXFxuLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4tLypcXG4tICogcGNyeXB0IC0gUGFyYWxsZWwgY3J5cHRvIHdyYXBwZXIuXFxuLSAqXFxuLSAqIENvcHlyaWdodCAoQykgMjAwOSBzZWN1bmV0IFNlY3VyaXR5IE5ldHdvcmtzIEFHXFxuLSAqIENvcHlyaWdodCAoQykgMjAwOSBTdGVmZmVuIEtsYXNzZXJ0IFxcdTAwM2NzdGVmZmVuLmtsYXNzZXJ0QHNlY3VuZXQuY29tXFx1MDAzZVxcbi0gKi9cXG4tXFxuLSNpbmNsdWRlIFxcdTAwM2NjcnlwdG8vYWxnYXBpLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NjcnlwdG8vaW50ZXJuYWwvYWVhZC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvYXRvbWljLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9lcnIuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2luaXQuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgva29iamVjdC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvY3B1LmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NjcnlwdG8vcGNyeXB0LmhcXHUwMDNlXFxuLVxcbi1zdGF0aWMgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGVuY3J5cHQ7XFxuLXN0YXRpYyBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwZGVjcnlwdDtcXG4tc3RhdGljIHN0cnVjdCBrc2V0ICAgICAgICAgICAqcGNyeXB0X2tzZXQ7XFxuLVxcbi1zdHJ1Y3QgcGNyeXB0X2luc3RhbmNlX2N0eCB7XFxuLVxcdHN0cnVjdCBjcnlwdG9fYWVhZF9zcGF3biBzcGF3bjtcXG4tXFx0c3RydWN0IHBhZGF0YV9zaGVsbCAqcHNlbmM7XFxuLVxcdHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzZGVjO1xcbi1cXHRhdG9taWNfdCB0Zm1fY291bnQ7XFxuLX07XFxuLVxcbi1zdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4IHtcXG4tXFx0c3RydWN0IGNyeXB0b19hZWFkICpjaGlsZDtcXG4tXFx0dW5zaWduZWQgaW50IGNiX2NwdTtcXG4tfTtcXG4tXFxuLXN0YXRpYyBpbmxpbmUgc3RydWN0IHBjcnlwdF9pbnN0YW5jZV9jdHggKnBjcnlwdF90Zm1faWN0eChcXG4tXFx0c3RydWN0IGNyeXB0b19hZWFkICp0Zm0pXFxuLXtcXG4tXFx0cmV0dXJuIGFlYWRfaW5zdGFuY2VfY3R4KGFlYWRfYWxnX2luc3RhbmNlKHRmbSkpO1xcbi19XFxuLVxcbi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX3NldGtleShzdHJ1Y3QgY3J5cHRvX2FlYWQgKnBhcmVudCxcXG4tXFx0XFx0XFx0ICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbilcXG4te1xcbi1cXHRzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgocGFyZW50KTtcXG4tXFxuLVxcdHJldHVybiBjcnlwdG9fYWVhZF9zZXRrZXkoY3R4LVxcdTAwM2VjaGlsZCwga2V5LCBrZXlsZW4pO1xcbi19XFxuLVxcbi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX3NldGF1dGhzaXplKHN0cnVjdCBjcnlwdG9fYWVhZCAqcGFyZW50LFxcbi1cXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBpbnQgYXV0aHNpemUpXFxuLXtcXG4tXFx0c3RydWN0IHBjcnlwdF9hZWFkX2N0eCAqY3R4ID0gY3J5cHRvX2FlYWRfY3R4KHBhcmVudCk7XFxuLVxcbi1cXHRyZXR1cm4gY3J5cHRvX2FlYWRfc2V0YXV0aHNpemUoY3R4LVxcdTAwM2VjaGlsZCwgYXV0aHNpemUpO1xcbi19XFxuLVxcbi1zdGF0aWMgdm9pZCBwY3J5cHRfYWVhZF9zZXJpYWwoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpXFxuLXtcXG4tXFx0c3RydWN0IHBjcnlwdF9yZXF1ZXN0ICpwcmVxID0gcGNyeXB0X3BhZGF0YV9yZXF1ZXN0KHBhZGF0YSk7XFxuLVxcdHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSA9IHBjcnlwdF9yZXF1ZXN0X2N0eChwcmVxKTtcXG4tXFxuLVxcdGFlYWRfcmVxdWVzdF9jb21wbGV0ZShyZXEtXFx1MDAzZWJhc2UuZGF0YSwgcGFkYXRhLVxcdTAwM2VpbmZvKTtcXG4tfVxcbi1cXG4tc3RhdGljIHZvaWQgcGNyeXB0X2FlYWRfZG9uZSh2b2lkICpkYXRhLCBpbnQgZXJyKVxcbi17XFxuLVxcdHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSA9IGRhdGE7XFxuLVxcdHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IGFlYWRfcmVxdWVzdF9jdHgocmVxKTtcXG4tXFx0c3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEgPSBwY3J5cHRfcmVxdWVzdF9wYWRhdGEocHJlcSk7XFxuLVxcbi1cXHRpZiAoZXJyID09IC1FSU5QUk9HUkVTUylcXG4tXFx0XFx0cmV0dXJuO1xcbi1cXG4tXFx0cGFkYXRhLVxcdTAwM2VpbmZvID0gZXJyO1xcbi1cXG4tXFx0cGFkYXRhX2RvX3NlcmlhbChwYWRhdGEpO1xcbi19XFxuLVxcbi1zdGF0aWMgdm9pZCBwY3J5cHRfYWVhZF9lbmMoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpXFxuLXtcXG4tXFx0c3RydWN0IHBjcnlwdF9yZXF1ZXN0ICpwcmVxID0gcGNyeXB0X3BhZGF0YV9yZXF1ZXN0KHBhZGF0YSk7XFxuLVxcdHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSA9IHBjcnlwdF9yZXF1ZXN0X2N0eChwcmVxKTtcXG4tXFx0aW50IHJldDtcXG4tXFxuLVxcdHJldCA9IGNyeXB0b19hZWFkX2VuY3J5cHQocmVxKTtcXG4tXFxuLVxcdGlmIChyZXQgPT0gLUVJTlBST0dSRVNTIHx8IHJldCA9PSAtRUJVU1kpXFxuLVxcdFxcdHJldHVybjtcXG4tXFxuLVxcdHBhZGF0YS1cXHUwMDNlaW5mbyA9IHJldDtcXG4tXFx0cGFkYXRhX2RvX3NlcmlhbChwYWRhdGEpO1xcbi19XFxuLVxcbi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX2VuY3J5cHQoc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxKVxcbi17XFxuLVxcdGludCBlcnI7XFxuLVxcdHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IGFlYWRfcmVxdWVzdF9jdHgocmVxKTtcXG4tXFx0c3RydWN0IGFlYWRfcmVxdWVzdCAqY3JlcSA9IHBjcnlwdF9yZXF1ZXN0X2N0eChwcmVxKTtcXG4tXFx0c3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEgPSBwY3J5cHRfcmVxdWVzdF9wYWRhdGEocHJlcSk7XFxuLVxcdHN0cnVjdCBjcnlwdG9fYWVhZCAqYWVhZCA9IGNyeXB0b19hZWFkX3JlcXRmbShyZXEpO1xcbi1cXHRzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgoYWVhZCk7XFxuLVxcdHUzMiBmbGFncyA9IGFlYWRfcmVxdWVzdF9mbGFncyhyZXEpO1xcbi1cXHRzdHJ1Y3QgcGNyeXB0X2luc3RhbmNlX2N0eCAqaWN0eDtcXG4tXFxuLVxcdGljdHggPSBwY3J5cHRfdGZtX2ljdHgoYWVhZCk7XFxuLVxcbi1cXHRtZW1zZXQocGFkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHBhZGF0YV9wcml2KSk7XFxuLVxcbi1cXHRwYWRhdGEtXFx1MDAzZXBhcmFsbGVsID0gcGNyeXB0X2FlYWRfZW5jO1xcbi1cXHRwYWRhdGEtXFx1MDAzZXNlcmlhbCA9IHBjcnlwdF9hZWFkX3NlcmlhbDtcXG4tXFxuLVxcdGFlYWRfcmVxdWVzdF9zZXRfdGZtKGNyZXEsIGN0eC1cXHUwMDNlY2hpbGQpO1xcbi1cXHRhZWFkX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKGNyZXEsIGZsYWdzIFxcdTAwMjYgfkNSWVBUT19URk1fUkVRX01BWV9TTEVFUCxcXG4tXFx0XFx0XFx0XFx0ICBwY3J5cHRfYWVhZF9kb25lLCByZXEpO1xcbi1cXHRhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KGNyZXEsIHJlcS1cXHUwMDNlc3JjLCByZXEtXFx1MDAzZWRzdCxcXG4tXFx0XFx0XFx0ICAgICAgIHJlcS1cXHUwMDNlY3J5cHRsZW4sIHJlcS1cXHUwMDNlaXYpO1xcbi1cXHRhZWFkX3JlcXVlc3Rfc2V0X2FkKGNyZXEsIHJlcS1cXHUwMDNlYXNzb2NsZW4pO1xcbi1cXG4tXFx0ZXJyID0gcGFkYXRhX2RvX3BhcmFsbGVsKGljdHgtXFx1MDAzZXBzZW5jLCBwYWRhdGEsIFxcdTAwMjZjdHgtXFx1MDAzZWNiX2NwdSk7XFxuLVxcdGlmICghZXJyKVxcbi1cXHRcXHRyZXR1cm4gLUVJTlBST0dSRVNTO1xcbi1cXHRpZiAoZXJyID09IC1FQlVTWSkge1xcbi1cXHRcXHQvKiB0cnkgbm9uLXBhcmFsbGVsIG1vZGUgKi9cXG4tXFx0XFx0YWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhjcmVxLCBmbGFncywgcmVxLVxcdTAwM2ViYXNlLmNvbXBsZXRlLFxcbi1cXHRcXHRcXHRcXHRcXHQgIHJlcS1cXHUwMDNlYmFzZS5kYXRhKTtcXG4tXFx0XFx0cmV0dXJuIGNyeXB0b19hZWFkX2VuY3J5cHQoY3JlcSk7XFxuLVxcdH1cXG4tXFxuLVxcdHJldHVybiBlcnI7XFxuLX1cXG4tXFxuLXN0YXRpYyB2b2lkIHBjcnlwdF9hZWFkX2RlYyhzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSlcXG4te1xcbi1cXHRzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnByZXEgPSBwY3J5cHRfcGFkYXRhX3JlcXVlc3QocGFkYXRhKTtcXG4tXFx0c3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxID0gcGNyeXB0X3JlcXVlc3RfY3R4KHByZXEpO1xcbi1cXHRpbnQgcmV0O1xcbi1cXG4tXFx0cmV0ID0gY3J5cHRvX2FlYWRfZGVjcnlwdChyZXEpO1xcbi1cXG4tXFx0aWYgKHJldCA9PSAtRUlOUFJPR1JFU1MgfHwgcmV0ID09IC1FQlVTWSlcXG4tXFx0XFx0cmV0dXJuO1xcbi1cXG4tXFx0cGFkYXRhLVxcdTAwM2VpbmZvID0gcmV0O1xcbi1cXHRwYWRhdGFfZG9fc2VyaWFsKHBhZGF0YSk7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbnQgcGNyeXB0X2FlYWRfZGVjcnlwdChzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEpXFxuLXtcXG4tXFx0aW50IGVycjtcXG4tXFx0c3RydWN0IHBjcnlwdF9yZXF1ZXN0ICpwcmVxID0gYWVhZF9yZXF1ZXN0X2N0eChyZXEpO1xcbi1cXHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpjcmVxID0gcGNyeXB0X3JlcXVlc3RfY3R4KHByZXEpO1xcbi1cXHRzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSA9IHBjcnlwdF9yZXF1ZXN0X3BhZGF0YShwcmVxKTtcXG4tXFx0c3RydWN0IGNyeXB0b19hZWFkICphZWFkID0gY3J5cHRvX2FlYWRfcmVxdGZtKHJlcSk7XFxuLVxcdHN0cnVjdCBwY3J5cHRfYWVhZF9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eChhZWFkKTtcXG4tXFx0dTMyIGZsYWdzID0gYWVhZF9yZXF1ZXN0X2ZsYWdzKHJlcSk7XFxuLVxcdHN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4ICppY3R4O1xcbi1cXG4tXFx0aWN0eCA9IHBjcnlwdF90Zm1faWN0eChhZWFkKTtcXG4tXFxuLVxcdG1lbXNldChwYWRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgcGFkYXRhX3ByaXYpKTtcXG4tXFxuLVxcdHBhZGF0YS1cXHUwMDNlcGFyYWxsZWwgPSBwY3J5cHRfYWVhZF9kZWM7XFxuLVxcdHBhZGF0YS1cXHUwMDNlc2VyaWFsID0gcGNyeXB0X2FlYWRfc2VyaWFsO1xcbi1cXG4tXFx0YWVhZF9yZXF1ZXN0X3NldF90Zm0oY3JlcSwgY3R4LVxcdTAwM2VjaGlsZCk7XFxuLVxcdGFlYWRfcmVxdWVzdF9zZXRfY2FsbGJhY2soY3JlcSwgZmxhZ3MgXFx1MDAyNiB+Q1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQLFxcbi1cXHRcXHRcXHRcXHQgIHBjcnlwdF9hZWFkX2RvbmUsIHJlcSk7XFxuLVxcdGFlYWRfcmVxdWVzdF9zZXRfY3J5cHQoY3JlcSwgcmVxLVxcdTAwM2VzcmMsIHJlcS1cXHUwMDNlZHN0LFxcbi1cXHRcXHRcXHQgICAgICAgcmVxLVxcdTAwM2VjcnlwdGxlbiwgcmVxLVxcdTAwM2Vpdik7XFxuLVxcdGFlYWRfcmVxdWVzdF9zZXRfYWQoY3JlcSwgcmVxLVxcdTAwM2Vhc3NvY2xlbik7XFxuLVxcbi1cXHRlcnIgPSBwYWRhdGFfZG9fcGFyYWxsZWwoaWN0eC1cXHUwMDNlcHNkZWMsIHBhZGF0YSwgXFx1MDAyNmN0eC1cXHUwMDNlY2JfY3B1KTtcXG4tXFx0aWYgKCFlcnIpXFxuLVxcdFxcdHJldHVybiAtRUlOUFJPR1JFU1M7XFxuLVxcdGlmIChlcnIgPT0gLUVCVVNZKSB7XFxuLVxcdFxcdC8qIHRyeSBub24tcGFyYWxsZWwgbW9kZSAqL1xcbi1cXHRcXHRhZWFkX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKGNyZXEsIGZsYWdzLCByZXEtXFx1MDAzZWJhc2UuY29tcGxldGUsXFxuLVxcdFxcdFxcdFxcdFxcdCAgcmVxLVxcdTAwM2ViYXNlLmRhdGEpO1xcbi1cXHRcXHRyZXR1cm4gY3J5cHRvX2FlYWRfZGVjcnlwdChjcmVxKTtcXG4tXFx0fVxcbi1cXG4tXFx0cmV0dXJuIGVycjtcXG4tfVxcbi1cXG4tc3RhdGljIGludCBwY3J5cHRfYWVhZF9pbml0X3RmbShzdHJ1Y3QgY3J5cHRvX2FlYWQgKnRmbSlcXG4te1xcbi1cXHRpbnQgY3B1X2luZGV4O1xcbi1cXHRzdHJ1Y3QgYWVhZF9pbnN0YW5jZSAqaW5zdCA9IGFlYWRfYWxnX2luc3RhbmNlKHRmbSk7XFxuLVxcdHN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4ICppY3R4ID0gYWVhZF9pbnN0YW5jZV9jdHgoaW5zdCk7XFxuLVxcdHN0cnVjdCBwY3J5cHRfYWVhZF9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eCh0Zm0pO1xcbi1cXHRzdHJ1Y3QgY3J5cHRvX2FlYWQgKmNpcGhlcjtcXG4tXFxuLVxcdGNwdV9pbmRleCA9ICh1bnNpZ25lZCBpbnQpYXRvbWljX2luY19yZXR1cm4oXFx1MDAyNmljdHgtXFx1MDAzZXRmbV9jb3VudCkgJVxcbi1cXHRcXHQgICAgY3B1bWFza193ZWlnaHQoY3B1X29ubGluZV9tYXNrKTtcXG4tXFxuLVxcdGN0eC1cXHUwMDNlY2JfY3B1ID0gY3B1bWFza19udGgoY3B1X2luZGV4LCBjcHVfb25saW5lX21hc2spO1xcbi1cXHRjaXBoZXIgPSBjcnlwdG9fc3Bhd25fYWVhZChcXHUwMDI2aWN0eC1cXHUwMDNlc3Bhd24pO1xcbi1cXG4tXFx0aWYgKElTX0VSUihjaXBoZXIpKVxcbi1cXHRcXHRyZXR1cm4gUFRSX0VSUihjaXBoZXIpO1xcbi1cXG4tXFx0Y3R4LVxcdTAwM2VjaGlsZCA9IGNpcGhlcjtcXG4tXFx0Y3J5cHRvX2FlYWRfc2V0X3JlcXNpemUodGZtLCBzaXplb2Yoc3RydWN0IHBjcnlwdF9yZXF1ZXN0KSArXFxuLVxcdFxcdFxcdFxcdCAgICAgc2l6ZW9mKHN0cnVjdCBhZWFkX3JlcXVlc3QpICtcXG4tXFx0XFx0XFx0XFx0ICAgICBjcnlwdG9fYWVhZF9yZXFzaXplKGNpcGhlcikpO1xcbi1cXG4tXFx0cmV0dXJuIDA7XFxuLX1cXG4tXFxuLXN0YXRpYyB2b2lkIHBjcnlwdF9hZWFkX2V4aXRfdGZtKHN0cnVjdCBjcnlwdG9fYWVhZCAqdGZtKVxcbi17XFxuLVxcdHN0cnVjdCBwY3J5cHRfYWVhZF9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eCh0Zm0pO1xcbi1cXG4tXFx0Y3J5cHRvX2ZyZWVfYWVhZChjdHgtXFx1MDAzZWNoaWxkKTtcXG4tfVxcbi1cXG4tc3RhdGljIHZvaWQgcGNyeXB0X2ZyZWUoc3RydWN0IGFlYWRfaW5zdGFuY2UgKmluc3QpXFxuLXtcXG4tXFx0c3RydWN0IHBjcnlwdF9pbnN0YW5jZV9jdHggKmN0eCA9IGFlYWRfaW5zdGFuY2VfY3R4KGluc3QpO1xcbi1cXG4tXFx0Y3J5cHRvX2Ryb3BfYWVhZChcXHUwMDI2Y3R4LVxcdTAwM2VzcGF3bik7XFxuLVxcdHBhZGF0YV9mcmVlX3NoZWxsKGN0eC1cXHUwMDNlcHNkZWMpO1xcbi1cXHRwYWRhdGFfZnJlZV9zaGVsbChjdHgtXFx1MDAzZXBzZW5jKTtcXG4tXFx0a2ZyZWUoaW5zdCk7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbnQgcGNyeXB0X2luaXRfaW5zdGFuY2Uoc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdCxcXG4tXFx0XFx0XFx0XFx0c3RydWN0IGNyeXB0b19hbGcgKmFsZylcXG4te1xcbi1cXHRpZiAoc25wcmludGYoaW5zdC1cXHUwMDNlYWxnLmNyYV9kcml2ZXJfbmFtZSwgQ1JZUFRPX01BWF9BTEdfTkFNRSxcXG4tXFx0XFx0ICAgICBcXFwicGNyeXB0KCVzKVxcXCIsIGFsZy1cXHUwMDNlY3JhX2RyaXZlcl9uYW1lKSBcXHUwMDNlPSBDUllQVE9fTUFYX0FMR19OQU1FKVxcbi1cXHRcXHRyZXR1cm4gLUVOQU1FVE9PTE9ORztcXG4tXFxuLVxcdG1lbWNweShpbnN0LVxcdTAwM2VhbGcuY3JhX25hbWUsIGFsZy1cXHUwMDNlY3JhX25hbWUsIENSWVBUT19NQVhfQUxHX05BTUUpO1xcbi1cXG4tXFx0aW5zdC1cXHUwMDNlYWxnLmNyYV9wcmlvcml0eSA9IGFsZy1cXHUwMDNlY3JhX3ByaW9yaXR5ICsgMTAwO1xcbi1cXHRpbnN0LVxcdTAwM2VhbGcuY3JhX2Jsb2Nrc2l6ZSA9IGFsZy1cXHUwMDNlY3JhX2Jsb2Nrc2l6ZTtcXG4tXFx0aW5zdC1cXHUwMDNlYWxnLmNyYV9hbGlnbm1hc2sgPSBhbGctXFx1MDAzZWNyYV9hbGlnbm1hc2s7XFxuLVxcbi1cXHRyZXR1cm4gMDtcXG4tfVxcbi1cXG4tc3RhdGljIGludCBwY3J5cHRfY3JlYXRlX2FlYWQoc3RydWN0IGNyeXB0b190ZW1wbGF0ZSAqdG1wbCwgc3RydWN0IHJ0YXR0ciAqKnRiLFxcbi1cXHRcXHRcXHQgICAgICBzdHJ1Y3QgY3J5cHRvX2F0dHJfdHlwZSAqYWxndClcXG4te1xcbi1cXHRzdHJ1Y3QgcGNyeXB0X2luc3RhbmNlX2N0eCAqY3R4O1xcbi1cXHRzdHJ1Y3QgYWVhZF9pbnN0YW5jZSAqaW5zdDtcXG4tXFx0c3RydWN0IGFlYWRfYWxnICphbGc7XFxuLVxcdHUzMiBtYXNrID0gY3J5cHRvX2FsZ3RfaW5oZXJpdGVkX21hc2soYWxndCk7XFxuLVxcdGludCBlcnI7XFxuLVxcbi1cXHRpbnN0ID0ga3phbGxvYyhzaXplb2YoKmluc3QpICsgc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTtcXG4tXFx0aWYgKCFpbnN0KVxcbi1cXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4tXFxuLVxcdGVyciA9IC1FTk9NRU07XFxuLVxcbi1cXHRjdHggPSBhZWFkX2luc3RhbmNlX2N0eChpbnN0KTtcXG4tXFx0Y3R4LVxcdTAwM2Vwc2VuYyA9IHBhZGF0YV9hbGxvY19zaGVsbChwZW5jcnlwdCk7XFxuLVxcdGlmICghY3R4LVxcdTAwM2Vwc2VuYylcXG4tXFx0XFx0Z290byBlcnJfZnJlZV9pbnN0O1xcbi1cXG4tXFx0Y3R4LVxcdTAwM2Vwc2RlYyA9IHBhZGF0YV9hbGxvY19zaGVsbChwZGVjcnlwdCk7XFxuLVxcdGlmICghY3R4LVxcdTAwM2Vwc2RlYylcXG4tXFx0XFx0Z290byBlcnJfZnJlZV9pbnN0O1xcbi1cXG4tXFx0ZXJyID0gY3J5cHRvX2dyYWJfYWVhZChcXHUwMDI2Y3R4LVxcdTAwM2VzcGF3biwgYWVhZF9jcnlwdG9faW5zdGFuY2UoaW5zdCksXFxuLVxcdFxcdFxcdCAgICAgICBjcnlwdG9fYXR0cl9hbGdfbmFtZSh0YlsxXSksIDAsIG1hc2spO1xcbi1cXHRpZiAoZXJyKVxcbi1cXHRcXHRnb3RvIGVycl9mcmVlX2luc3Q7XFxuLVxcbi1cXHRhbGcgPSBjcnlwdG9fc3Bhd25fYWVhZF9hbGcoXFx1MDAyNmN0eC1cXHUwMDNlc3Bhd24pO1xcbi1cXHRlcnIgPSBwY3J5cHRfaW5pdF9pbnN0YW5jZShhZWFkX2NyeXB0b19pbnN0YW5jZShpbnN0KSwgXFx1MDAyNmFsZy1cXHUwMDNlYmFzZSk7XFxuLVxcdGlmIChlcnIpXFxuLVxcdFxcdGdvdG8gZXJyX2ZyZWVfaW5zdDtcXG4tXFxuLVxcdGluc3QtXFx1MDAzZWFsZy5iYXNlLmNyYV9mbGFncyB8PSBDUllQVE9fQUxHX0FTWU5DO1xcbi1cXG4tXFx0aW5zdC1cXHUwMDNlYWxnLml2c2l6ZSA9IGNyeXB0b19hZWFkX2FsZ19pdnNpemUoYWxnKTtcXG4tXFx0aW5zdC1cXHUwMDNlYWxnLm1heGF1dGhzaXplID0gY3J5cHRvX2FlYWRfYWxnX21heGF1dGhzaXplKGFsZyk7XFxuLVxcbi1cXHRpbnN0LVxcdTAwM2VhbGcuYmFzZS5jcmFfY3R4c2l6ZSA9IHNpemVvZihzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4KTtcXG4tXFxuLVxcdGluc3QtXFx1MDAzZWFsZy5pbml0ID0gcGNyeXB0X2FlYWRfaW5pdF90Zm07XFxuLVxcdGluc3QtXFx1MDAzZWFsZy5leGl0ID0gcGNyeXB0X2FlYWRfZXhpdF90Zm07XFxuLVxcbi1cXHRpbnN0LVxcdTAwM2VhbGcuc2V0a2V5ID0gcGNyeXB0X2FlYWRfc2V0a2V5O1xcbi1cXHRpbnN0LVxcdTAwM2VhbGcuc2V0YXV0aHNpemUgPSBwY3J5cHRfYWVhZF9zZXRhdXRoc2l6ZTtcXG4tXFx0aW5zdC1cXHUwMDNlYWxnLmVuY3J5cHQgPSBwY3J5cHRfYWVhZF9lbmNyeXB0O1xcbi1cXHRpbnN0LVxcdTAwM2VhbGcuZGVjcnlwdCA9IHBjcnlwdF9hZWFkX2RlY3J5cHQ7XFxuLVxcbi1cXHRpbnN0LVxcdTAwM2VmcmVlID0gcGNyeXB0X2ZyZWU7XFxuLVxcbi1cXHRlcnIgPSBhZWFkX3JlZ2lzdGVyX2luc3RhbmNlKHRtcGwsIGluc3QpO1xcbi1cXHRpZiAoZXJyKSB7XFxuLWVycl9mcmVlX2luc3Q6XFxuLVxcdFxcdHBjcnlwdF9mcmVlKGluc3QpO1xcbi1cXHR9XFxuLVxcdHJldHVybiBlcnI7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbnQgcGNyeXB0X2NyZWF0ZShzdHJ1Y3QgY3J5cHRvX3RlbXBsYXRlICp0bXBsLCBzdHJ1Y3QgcnRhdHRyICoqdGIpXFxuLXtcXG4tXFx0c3RydWN0IGNyeXB0b19hdHRyX3R5cGUgKmFsZ3Q7XFxuLVxcbi1cXHRhbGd0ID0gY3J5cHRvX2dldF9hdHRyX3R5cGUodGIpO1xcbi1cXHRpZiAoSVNfRVJSKGFsZ3QpKVxcbi1cXHRcXHRyZXR1cm4gUFRSX0VSUihhbGd0KTtcXG4tXFxuLVxcdHN3aXRjaCAoYWxndC1cXHUwMDNldHlwZSBcXHUwMDI2IGFsZ3QtXFx1MDAzZW1hc2sgXFx1MDAyNiBDUllQVE9fQUxHX1RZUEVfTUFTSykge1xcbi1cXHRjYXNlIENSWVBUT19BTEdfVFlQRV9BRUFEOlxcbi1cXHRcXHRyZXR1cm4gcGNyeXB0X2NyZWF0ZV9hZWFkKHRtcGwsIHRiLCBhbGd0KTtcXG4tXFx0fVxcbi1cXG4tXFx0cmV0dXJuIC1FSU5WQUw7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbnQgcGNyeXB0X3N5c2ZzX2FkZChzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgY29uc3QgY2hhciAqbmFtZSlcXG4te1xcbi1cXHRpbnQgcmV0O1xcbi1cXG4tXFx0cGluc3QtXFx1MDAzZWtvYmoua3NldCA9IHBjcnlwdF9rc2V0O1xcbi1cXHRyZXQgPSBrb2JqZWN0X2FkZChcXHUwMDI2cGluc3QtXFx1MDAzZWtvYmosIE5VTEwsIFxcXCIlc1xcXCIsIG5hbWUpO1xcbi1cXHRpZiAoIXJldClcXG4tXFx0XFx0a29iamVjdF91ZXZlbnQoXFx1MDAyNnBpbnN0LVxcdTAwM2Vrb2JqLCBLT0JKX0FERCk7XFxuLVxcbi1cXHRyZXR1cm4gcmV0O1xcbi19XFxuLVxcbi1zdGF0aWMgaW50IHBjcnlwdF9pbml0X3BhZGF0YShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICoqcGluc3QsIGNvbnN0IGNoYXIgKm5hbWUpXFxuLXtcXG4tXFx0aW50IHJldCA9IC1FTk9NRU07XFxuLVxcbi1cXHQqcGluc3QgPSBwYWRhdGFfYWxsb2MobmFtZSk7XFxuLVxcdGlmICghKnBpbnN0KVxcbi1cXHRcXHRyZXR1cm4gcmV0O1xcbi1cXG4tXFx0cmV0ID0gcGNyeXB0X3N5c2ZzX2FkZCgqcGluc3QsIG5hbWUpO1xcbi1cXHRpZiAocmV0KVxcbi1cXHRcXHRwYWRhdGFfZnJlZSgqcGluc3QpO1xcbi1cXG4tXFx0cmV0dXJuIHJldDtcXG4tfVxcbi1cXG4tc3RhdGljIHN0cnVjdCBjcnlwdG9fdGVtcGxhdGUgcGNyeXB0X3RtcGwgPSB7XFxuLVxcdC5uYW1lID0gXFxcInBjcnlwdFxcXCIsXFxuLVxcdC5jcmVhdGUgPSBwY3J5cHRfY3JlYXRlLFxcbi1cXHQubW9kdWxlID0gVEhJU19NT0RVTEUsXFxuLX07XFxuLVxcbi1zdGF0aWMgaW50IF9faW5pdCBwY3J5cHRfaW5pdCh2b2lkKVxcbi17XFxuLVxcdGludCBlcnIgPSAtRU5PTUVNO1xcbi1cXG4tXFx0cGNyeXB0X2tzZXQgPSBrc2V0X2NyZWF0ZV9hbmRfYWRkKFxcXCJwY3J5cHRcXFwiLCBOVUxMLCBrZXJuZWxfa29iaik7XFxuLVxcdGlmICghcGNyeXB0X2tzZXQpXFxuLVxcdFxcdGdvdG8gZXJyO1xcbi1cXG4tXFx0ZXJyID0gcGNyeXB0X2luaXRfcGFkYXRhKFxcdTAwMjZwZW5jcnlwdCwgXFxcInBlbmNyeXB0XFxcIik7XFxuLVxcdGlmIChlcnIpXFxuLVxcdFxcdGdvdG8gZXJyX3VucmVnX2tzZXQ7XFxuLVxcbi1cXHRlcnIgPSBwY3J5cHRfaW5pdF9wYWRhdGEoXFx1MDAyNnBkZWNyeXB0LCBcXFwicGRlY3J5cHRcXFwiKTtcXG4tXFx0aWYgKGVycilcXG4tXFx0XFx0Z290byBlcnJfZGVpbml0X3BlbmNyeXB0O1xcbi1cXG4tXFx0cmV0dXJuIGNyeXB0b19yZWdpc3Rlcl90ZW1wbGF0ZShcXHUwMDI2cGNyeXB0X3RtcGwpO1xcbi1cXG4tZXJyX2RlaW5pdF9wZW5jcnlwdDpcXG4tXFx0cGFkYXRhX2ZyZWUocGVuY3J5cHQpO1xcbi1lcnJfdW5yZWdfa3NldDpcXG4tXFx0a3NldF91bnJlZ2lzdGVyKHBjcnlwdF9rc2V0KTtcXG4tZXJyOlxcbi1cXHRyZXR1cm4gZXJyO1xcbi19XFxuLVxcbi1zdGF0aWMgdm9pZCBfX2V4aXQgcGNyeXB0X2V4aXQodm9pZClcXG4te1xcbi1cXHRjcnlwdG9fdW5yZWdpc3Rlcl90ZW1wbGF0ZShcXHUwMDI2cGNyeXB0X3RtcGwpO1xcbi1cXG4tXFx0cGFkYXRhX2ZyZWUocGVuY3J5cHQpO1xcbi1cXHRwYWRhdGFfZnJlZShwZGVjcnlwdCk7XFxuLVxcbi1cXHRrc2V0X3VucmVnaXN0ZXIocGNyeXB0X2tzZXQpO1xcbi19XFxuLVxcbi1tb2R1bGVfaW5pdChwY3J5cHRfaW5pdCk7XFxuLW1vZHVsZV9leGl0KHBjcnlwdF9leGl0KTtcXG4tXFxuLU1PRFVMRV9MSUNFTlNFKFxcXCJHUExcXFwiKTtcXG4tTU9EVUxFX0FVVEhPUihcXFwiU3RlZmZlbiBLbGFzc2VydCBcXHUwMDNjc3RlZmZlbi5rbGFzc2VydEBzZWN1bmV0LmNvbVxcdTAwM2VcXFwiKTtcXG4tTU9EVUxFX0RFU0NSSVBUSU9OKFxcXCJQYXJhbGxlbCBjcnlwdG8gd3JhcHBlclxcXCIpO1xcbi1NT0RVTEVfQUxJQVNfQ1JZUFRPKFxcXCJwY3J5cHRcXFwiKTtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9jcnlwdG8vcGNyeXB0LmggYi9pbmNsdWRlL2NyeXB0by9wY3J5cHQuaFxcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDIzNGQ3Y2YzY2Y1ZWFkLi4wMDAwMDAwMDAwMDAwMFxcbi0tLSBhL2luY2x1ZGUvY3J5cHRvL3BjcnlwdC5oXFxuKysrIC9kZXYvbnVsbFxcbkBAIC0xLDM5ICswLDAgQEBcXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xcbi0vKlxcbi0gKiBwY3J5cHQgLSBQYXJhbGxlbCBjcnlwdG8gZW5naW5lLlxcbi0gKlxcbi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgc2VjdW5ldCBTZWN1cml0eSBOZXR3b3JrcyBBR1xcbi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgU3RlZmZlbiBLbGFzc2VydCBcXHUwMDNjc3RlZmZlbi5rbGFzc2VydEBzZWN1bmV0LmNvbVxcdTAwM2VcXG4tICovXFxuLVxcbi0jaWZuZGVmIF9DUllQVE9fUENSWVBUX0hcXG4tI2RlZmluZSBfQ1JZUFRPX1BDUllQVF9IXFxuLVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvY29udGFpbmVyX29mLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9jcnlwdG8uaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BhZGF0YS5oXFx1MDAzZVxcbi1cXG4tc3RydWN0IHBjcnlwdF9yZXF1ZXN0IHtcXG4tXFx0c3RydWN0IHBhZGF0YV9wcml2XFx0cGFkYXRhO1xcbi1cXHR2b2lkXFx0XFx0XFx0KmRhdGE7XFxuLVxcdHZvaWRcXHRcXHRcXHQqX19jdHhbXSBDUllQVE9fTUlOQUxJR05fQVRUUjtcXG4tfTtcXG4tXFxuLXN0YXRpYyBpbmxpbmUgdm9pZCAqcGNyeXB0X3JlcXVlc3RfY3R4KHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcmVxKVxcbi17XFxuLVxcdHJldHVybiByZXEtXFx1MDAzZV9fY3R4O1xcbi19XFxuLVxcbi1zdGF0aWMgaW5saW5lXFxuLXN0cnVjdCBwYWRhdGFfcHJpdiAqcGNyeXB0X3JlcXVlc3RfcGFkYXRhKHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcmVxKVxcbi17XFxuLVxcdHJldHVybiBcXHUwMDI2cmVxLVxcdTAwM2VwYWRhdGE7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbmxpbmVcXG4tc3RydWN0IHBjcnlwdF9yZXF1ZXN0ICpwY3J5cHRfcGFkYXRhX3JlcXVlc3Qoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpXFxuLXtcXG4tXFx0cmV0dXJuIGNvbnRhaW5lcl9vZihwYWRhdGEsIHN0cnVjdCBwY3J5cHRfcmVxdWVzdCwgcGFkYXRhKTtcXG4tfVxcbi1cXG4tI2VuZGlmXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGFkYXRhLmggYi9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oXFxuaW5kZXggYjYyMzJiZWE2ZWRmNTkuLmVhNDVlYTY4MGNiNzk3IDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvcGFkYXRhLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oXFxuQEAgLTEyLDExMiArMTIsOCBAQFxcbiAjaWZuZGVmIFBBREFUQV9IXFxuICNkZWZpbmUgUEFEQVRBX0hcXG4gXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9yZWZjb3VudC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvY29tcGlsZXJfdHlwZXMuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3dvcmtxdWV1ZS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvc3BpbmxvY2suaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2xpc3QuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2tvYmplY3QuaFxcdTAwM2VcXG4tXFxuLSNkZWZpbmUgUEFEQVRBX0NQVV9TRVJJQUwgICAweDAxXFxuLSNkZWZpbmUgUEFEQVRBX0NQVV9QQVJBTExFTCAweDAyXFxuLVxcbi0vKipcXG4tICogc3RydWN0IHBhZGF0YV9wcml2IC0gUmVwcmVzZW50cyBvbmUgam9iXFxuLSAqXFxuLSAqIEBsaXN0OiBMaXN0IGVudHJ5LCB0byBhdHRhY2ggdG8gdGhlIHBhZGF0YSBsaXN0cy5cXG4tICogQHBkOiBQb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBjb250cm9sIHN0cnVjdHVyZS5cXG4tICogQGNiX2NwdTogQ2FsbGJhY2sgY3B1IGZvciBzZXJpYWxpemF0aW9vbi5cXG4tICogQHNlcV9ucjogU2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBwYXJhbGxlbGl6ZWQgZGF0YSBvYmplY3QuXFxuLSAqIEBpbmZvOiBVc2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGFyYWxsZWwgdG8gdGhlIHNlcmlhbCBmdW5jdGlvbi5cXG4tICogQHBhcmFsbGVsOiBQYXJhbGxlbCBleGVjdXRpb24gZnVuY3Rpb24uXFxuLSAqIEBzZXJpYWw6IFNlcmlhbCBjb21wbGV0ZSBmdW5jdGlvbi5cXG4tICovXFxuLXN0cnVjdCBwYWRhdGFfcHJpdiB7XFxuLVxcdHN0cnVjdCBsaXN0X2hlYWRcXHRsaXN0O1xcbi1cXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YVxcdCpwZDtcXG4tXFx0aW50XFx0XFx0XFx0Y2JfY3B1O1xcbi1cXHR1bnNpZ25lZCBpbnRcXHRcXHRzZXFfbnI7XFxuLVxcdGludFxcdFxcdFxcdGluZm87XFxuLVxcdHZvaWQgICAgICAgICAgICAgICAgICAgICgqcGFyYWxsZWwpKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTtcXG4tXFx0dm9pZCAgICAgICAgICAgICAgICAgICAgKCpzZXJpYWwpKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTtcXG4tfTtcXG4tXFxuLS8qKlxcbi0gKiBzdHJ1Y3QgcGFkYXRhX2xpc3QgLSBvbmUgcGVyIHdvcmsgdHlwZSBwZXIgQ1BVXFxuLSAqXFxuLSAqIEBsaXN0OiBMaXN0IGhlYWQuXFxuLSAqIEBsb2NrOiBMaXN0IGxvY2suXFxuLSAqL1xcbi1zdHJ1Y3QgcGFkYXRhX2xpc3Qge1xcbi1cXHRzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBsaXN0O1xcbi1cXHRzcGlubG9ja190ICAgICAgICAgICAgICBsb2NrO1xcbi19O1xcbi1cXG4tLyoqXFxuLSogc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUgLSBUaGUgcGVyY3B1IHBhZGF0YSBzZXJpYWwgcXVldWVcXG4tKlxcbi0qIEBzZXJpYWw6IExpc3QgdG8gd2FpdCBmb3Igc2VyaWFsaXphdGlvbiBhZnRlciByZW9yZGVyaW5nLlxcbi0qIEB3b3JrOiB3b3JrIHN0cnVjdCBmb3Igc2VyaWFsaXphdGlvbi5cXG4tKiBAcGQ6IEJhY2twb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBjb250cm9sIHN0cnVjdHVyZS5cXG4tKi9cXG4tc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUge1xcbi0gICAgICAgc3RydWN0IHBhZGF0YV9saXN0ICAgIHNlcmlhbDtcXG4tICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCAgICB3b3JrO1xcbi0gICAgICAgc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkO1xcbi19O1xcbi1cXG4tLyoqXFxuLSAqIHN0cnVjdCBwYWRhdGFfY3B1bWFzayAtIFRoZSBjcHVtYXNrcyBmb3IgdGhlIHBhcmFsbGVsL3NlcmlhbCB3b3JrZXJzXFxuLSAqXFxuLSAqIEBwY3B1OiBjcHVtYXNrIGZvciB0aGUgcGFyYWxsZWwgd29ya2Vycy5cXG4tICogQGNiY3B1OiBjcHVtYXNrIGZvciB0aGUgc2VyaWFsIChjYWxsYmFjaykgd29ya2Vycy5cXG4tICovXFxuLXN0cnVjdCBwYWRhdGFfY3B1bWFzayB7XFxuLVxcdGNwdW1hc2tfdmFyX3RcXHRwY3B1O1xcbi1cXHRjcHVtYXNrX3Zhcl90XFx0Y2JjcHU7XFxuLX07XFxuLVxcbi0vKipcXG4tICogc3RydWN0IHBhcmFsbGVsX2RhdGEgLSBJbnRlcm5hbCBjb250cm9sIHN0cnVjdHVyZSwgY292ZXJzIGV2ZXJ5dGhpbmdcXG4tICogdGhhdCBkZXBlbmRzIG9uIHRoZSBjcHVtYXNrIGluIHVzZS5cXG4tICpcXG4tICogQHBzOiBwYWRhdGFfc2hlbGwgb2JqZWN0Llxcbi0gKiBAcmVvcmRlcl9saXN0OiBwZXJjcHUgcmVvcmRlciBsaXN0c1xcbi0gKiBAc3F1ZXVlOiBwZXJjcHUgcGFkYXRhIHF1ZXVlcyB1c2VkIGZvciBzZXJpYWx1emF0aW9uLlxcbi0gKiBAcmVmY250OiBOdW1iZXIgb2Ygb2JqZWN0cyBob2xkaW5nIGEgcmVmZXJlbmNlIG9uIHRoaXMgcGFyYWxsZWxfZGF0YS5cXG4tICogQHNlcV9ucjogU2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBwYXJhbGxlbGl6ZWQgZGF0YSBvYmplY3QuXFxuLSAqIEBwcm9jZXNzZWQ6IE51bWJlciBvZiBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RzLlxcbi0gKiBAY3B1OiBOZXh0IENQVSB0byBiZSBwcm9jZXNzZWQuXFxuLSAqIEBjcHVtYXNrOiBUaGUgY3B1bWFza3MgaW4gdXNlIGZvciBwYXJhbGxlbCBhbmQgc2VyaWFsIHdvcmtlcnMuXFxuLSAqL1xcbi1zdHJ1Y3QgcGFyYWxsZWxfZGF0YSB7XFxuLVxcdHN0cnVjdCBwYWRhdGFfc2hlbGxcXHRcXHQqcHM7XFxuLVxcdHN0cnVjdCBwYWRhdGFfbGlzdFxcdFxcdF9fcGVyY3B1ICpyZW9yZGVyX2xpc3Q7XFxuLVxcdHN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlXFx0X19wZXJjcHUgKnNxdWV1ZTtcXG4tXFx0cmVmY291bnRfdFxcdFxcdFxcdHJlZmNudDtcXG4tXFx0dW5zaWduZWQgaW50XFx0XFx0XFx0c2VxX25yO1xcbi1cXHR1bnNpZ25lZCBpbnRcXHRcXHRcXHRwcm9jZXNzZWQ7XFxuLVxcdGludFxcdFxcdFxcdFxcdGNwdTtcXG4tXFx0c3RydWN0IHBhZGF0YV9jcHVtYXNrXFx0XFx0Y3B1bWFzaztcXG4tfTtcXG4tXFxuLS8qKlxcbi0gKiBzdHJ1Y3QgcGFkYXRhX3NoZWxsIC0gV3JhcHBlciBhcm91bmQgc3RydWN0IHBhcmFsbGVsX2RhdGEsIGl0c1xcbi0gKiBwdXJwb3NlIGlzIHRvIGFsbG93IHRoZSB1bmRlcmx5aW5nIGNvbnRyb2wgc3RydWN0dXJlIHRvIGJlIHJlcGxhY2VkXFxuLSAqIG9uIHRoZSBmbHkgdXNpbmcgUkNVLlxcbi0gKlxcbi0gKiBAcGluc3Q6IHBhZGF0IGluc3RhbmNlLlxcbi0gKiBAcGQ6IEFjdHVhbCBwYXJhbGxlbF9kYXRhIHN0cnVjdHVyZSB3aGljaCBtYXkgYmUgc3Vic3RpdHV0ZWQgb24gdGhlIGZseS5cXG4tICogQG9wZDogUG9pbnRlciB0byBvbGQgcGQgdG8gYmUgZnJlZWQgYnkgcGFkYXRhX3JlcGxhY2UuXFxuLSAqIEBsaXN0OiBMaXN0IGVudHJ5IGluIHBhZGF0YV9pbnN0YW5jZSBsaXN0Llxcbi0gKi9cXG4tc3RydWN0IHBhZGF0YV9zaGVsbCB7XFxuLVxcdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2VcXHRcXHQqcGluc3Q7XFxuLVxcdHN0cnVjdCBwYXJhbGxlbF9kYXRhIF9fcmN1XFx0KnBkO1xcbi1cXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YVxcdFxcdCpvcGQ7XFxuLVxcdHN0cnVjdCBsaXN0X2hlYWRcXHRcXHRsaXN0O1xcbi19O1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvaW5pdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvdHlwZXMuaFxcdTAwM2VcXG4gXFxuIC8qKlxcbiAgKiBzdHJ1Y3QgcGFkYXRhX210X2pvYiAtIHJlcHJlc2VudHMgb25lIG11bHRpdGhyZWFkZWQgam9iXFxuQEAgLTE0Niw0NiArNDIsOSBAQCBzdHJ1Y3QgcGFkYXRhX210X2pvYiB7XFxuIFxcdGJvb2xcXHRcXHRcXHRudW1hX2F3YXJlO1xcbiB9O1xcbiBcXG4tLyoqXFxuLSAqIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgLSBUaGUgb3ZlcmFsbCBjb250cm9sIHN0cnVjdHVyZS5cXG4tICpcXG4tICogQGNwdWhwX25vZGU6IExpbmthZ2UgZm9yIENQVSBob3RwbHVnIGNhbGxiYWNrcy5cXG4tICogQHBhcmFsbGVsX3dxOiBUaGUgd29ya3F1ZXVlIHVzZWQgZm9yIHBhcmFsbGVsIHdvcmsuXFxuLSAqIEBzZXJpYWxfd3E6IFRoZSB3b3JrcXVldWUgdXNlZCBmb3Igc2VyaWFsIHdvcmsuXFxuLSAqIEBwc2xpc3Q6IExpc3Qgb2YgcGFkYXRhX3NoZWxsIG9iamVjdHMgYXR0YWNoZWQgdG8gdGhpcyBpbnN0YW5jZS5cXG4tICogQGNwdW1hc2s6IFVzZXIgc3VwcGxpZWQgY3B1bWFza3MgZm9yIHBhcmFsbGVsIGFuZCBzZXJpYWwgd29ya3MuXFxuLSAqIEB2YWxpZGF0ZV9jcHVtYXNrOiBJbnRlcm5hbCBjcHVtYXNrIHVzZWQgdG8gdmFsaWRhdGUgQGNwdW1hc2sgZHVyaW5nIGhvdHBsdWcuXFxuLSAqIEBrb2JqOiBwYWRhdGEgaW5zdGFuY2Uga2VybmVsIG9iamVjdC5cXG4tICogQGxvY2s6IHBhZGF0YSBpbnN0YW5jZSBsb2NrLlxcbi0gKiBAZmxhZ3M6IHBhZGF0YSBmbGFncy5cXG4tICovXFxuLXN0cnVjdCBwYWRhdGFfaW5zdGFuY2Uge1xcbi1cXHRzdHJ1Y3QgaGxpc3Rfbm9kZVxcdFxcdGNwdWhwX25vZGU7XFxuLVxcdHN0cnVjdCB3b3JrcXVldWVfc3RydWN0XFx0XFx0KnBhcmFsbGVsX3dxO1xcbi1cXHRzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdFxcdFxcdCpzZXJpYWxfd3E7XFxuLVxcdHN0cnVjdCBsaXN0X2hlYWRcXHRcXHRwc2xpc3Q7XFxuLVxcdHN0cnVjdCBwYWRhdGFfY3B1bWFza1xcdFxcdGNwdW1hc2s7XFxuLVxcdGNwdW1hc2tfdmFyX3RcXHRcXHRcXHR2YWxpZGF0ZV9jcHVtYXNrO1xcbi1cXHRzdHJ1Y3Qga29iamVjdCAgICAgICAgICAgICAgICAgICBrb2JqO1xcbi1cXHRzdHJ1Y3QgbXV0ZXhcXHRcXHRcXHQgbG9jaztcXG4tXFx0dThcXHRcXHRcXHRcXHQgZmxhZ3M7XFxuLSNkZWZpbmVcXHRQQURBVEFfSU5JVFxcdDFcXG4tI2RlZmluZVxcdFBBREFUQV9SRVNFVFxcdDJcXG4tI2RlZmluZVxcdFBBREFUQV9JTlZBTElEXFx0NFxcbi19O1xcbi1cXG4gI2lmZGVmIENPTkZJR19QQURBVEFcXG4gZXh0ZXJuIHZvaWQgX19pbml0IHBhZGF0YV9pbml0KHZvaWQpO1xcbi1leHRlcm4gc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGFkYXRhX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpO1xcbi1leHRlcm4gdm9pZCBwYWRhdGFfZnJlZShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCk7XFxuLWV4dGVybiBzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwYWRhdGFfYWxsb2Nfc2hlbGwoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpO1xcbi1leHRlcm4gdm9pZCBwYWRhdGFfZnJlZV9zaGVsbChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcyk7XFxuLWV4dGVybiBpbnQgcGFkYXRhX2RvX3BhcmFsbGVsKHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzLFxcbi1cXHRcXHRcXHQgICAgICBzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSwgaW50ICpjYl9jcHUpO1xcbi1leHRlcm4gdm9pZCBwYWRhdGFfZG9fc2VyaWFsKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTtcXG4gZXh0ZXJuIHZvaWQgX19pbml0IHBhZGF0YV9kb19tdWx0aXRocmVhZGVkKHN0cnVjdCBwYWRhdGFfbXRfam9iICpqb2IpO1xcbi1leHRlcm4gaW50IHBhZGF0YV9zZXRfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdW1hc2tfdHlwZSxcXG4tXFx0XFx0XFx0ICAgICAgY3B1bWFza192YXJfdCBjcHVtYXNrKTtcXG4gI2Vsc2VcXG4gc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBwYWRhdGFfaW5pdCh2b2lkKSB7fVxcbiBzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IHBhZGF0YV9kb19tdWx0aXRocmVhZGVkKHN0cnVjdCBwYWRhdGFfbXRfam9iICpqb2IpXFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9wYWRhdGEuYyBiL2tlcm5lbC9wYWRhdGEuY1xcbmluZGV4IDBkM2VhMWI2OGIxZjcwLi42ZWIxMzBkMzEwMjRjNSAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvcGFkYXRhLmNcXG4rKysgYi9rZXJuZWwvcGFkYXRhLmNcXG5AQCAtMSw2ICsxLDYgQEBcXG4gLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4gLypcXG4tICogcGFkYXRhLmMgLSBnZW5lcmljIGludGVyZmFjZSB0byBwcm9jZXNzIGRhdGEgc3RyZWFtcyBpbiBwYXJhbGxlbFxcbisgKiBwYWRhdGEuYyAtIGdlbmVyaWMgaW50ZXJmYWNlIHRvIHJ1biBtdWx0aXRocmVhZGVkIGpvYnNcXG4gICpcXG4gICogU2VlIERvY3VtZW50YXRpb24vY29yZS1hcGkvcGFkYXRhLnJzdCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cXG4gICpcXG5AQCAtMTEsMTcgKzExLDE3IEBAXFxuICAqIEF1dGhvcjogRGFuaWVsIEpvcmRhbiBcXHUwMDNjZGFuaWVsLm0uam9yZGFuQG9yYWNsZS5jb21cXHUwMDNlXFxuICAqL1xcbiBcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2F0b21pYy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvY29tcGxldGlvbi5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvZXhwb3J0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9jcHVtYXNrLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9lcnIuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NwdS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvaW5pdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgva2VybmVsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9saXN0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9ub2RlbWFzay5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvcGFkYXRhLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9tdXRleC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvc2NoZWQuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3N5c2ZzLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9yY3VwZGF0ZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3BpbmxvY2suaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3dvcmtxdWV1ZS5oXFx1MDAzZVxcbiBcXG4gI2RlZmluZVxcdFBBREFUQV9XT1JLX09OU1RBQ0tcXHQxXFx0LyogV29yaydzIG1lbW9yeSBpcyBvbiBzdGFjayAqL1xcbiBcXG5AQCAtNDQsMzYgKzQ0LDggQEAgc3RydWN0IHBhZGF0YV9tdF9qb2Jfc3RhdGUge1xcbiBcXHR1bnNpZ25lZCBsb25nXFx0XFx0Y2h1bmtfc2l6ZTtcXG4gfTtcXG4gXFxuLXN0YXRpYyB2b2lkIHBhZGF0YV9mcmVlX3BkKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCk7XFxuIHN0YXRpYyB2b2lkIF9faW5pdCBwYWRhdGFfbXRfaGVscGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7XFxuIFxcbi1zdGF0aWMgaW5saW5lIHZvaWQgcGFkYXRhX2dldF9wZChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQpXFxuLXtcXG4tXFx0cmVmY291bnRfaW5jKFxcdTAwMjZwZC1cXHUwMDNlcmVmY250KTtcXG4tfVxcbi1cXG4tc3RhdGljIGlubGluZSB2b2lkIHBhZGF0YV9wdXRfcGRfY250KHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCwgaW50IGNudClcXG4te1xcbi1cXHRpZiAocmVmY291bnRfc3ViX2FuZF90ZXN0KGNudCwgXFx1MDAyNnBkLVxcdTAwM2VyZWZjbnQpKVxcbi1cXHRcXHRwYWRhdGFfZnJlZV9wZChwZCk7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbmxpbmUgdm9pZCBwYWRhdGFfcHV0X3BkKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZClcXG4te1xcbi1cXHRwYWRhdGFfcHV0X3BkX2NudChwZCwgMSk7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbnQgcGFkYXRhX2NwdV9oYXNoKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCwgdW5zaWduZWQgaW50IHNlcV9ucilcXG4te1xcbi1cXHQvKlxcbi1cXHQgKiBIYXNoIHRoZSBzZXF1ZW5jZSBudW1iZXJzIHRvIHRoZSBjcHVzIGJ5IHRha2luZ1xcbi1cXHQgKiBzZXFfbnIgbW9kLiBudW1iZXIgb2YgY3B1cyBpbiB1c2UuXFxuLVxcdCAqL1xcbi1cXHRpbnQgY3B1X2luZGV4ID0gc2VxX25yICUgY3B1bWFza193ZWlnaHQocGQtXFx1MDAzZWNwdW1hc2sucGNwdSk7XFxuLVxcbi1cXHRyZXR1cm4gY3B1bWFza19udGgoY3B1X2luZGV4LCBwZC1cXHUwMDNlY3B1bWFzay5wY3B1KTtcXG4tfVxcbi1cXG4gc3RhdGljIHN0cnVjdCBwYWRhdGFfd29yayAqcGFkYXRhX3dvcmtfYWxsb2Modm9pZClcXG4ge1xcbiBcXHRzdHJ1Y3QgcGFkYXRhX3dvcmsgKnB3O1xcbkBAIC0xNDcsMjYwICsxMTksNiBAQCBzdGF0aWMgdm9pZCBfX2luaXQgcGFkYXRhX3dvcmtzX2ZyZWUoc3RydWN0IGxpc3RfaGVhZCAqd29ya3MpXFxuIFxcdHNwaW5fdW5sb2NrX2JoKFxcdTAwMjZwYWRhdGFfd29ya3NfbG9jayk7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIHBhZGF0YV9wYXJhbGxlbF93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICpwYXJhbGxlbF93b3JrKVxcbi17XFxuLVxcdHN0cnVjdCBwYWRhdGFfd29yayAqcHcgPSBjb250YWluZXJfb2YocGFyYWxsZWxfd29yaywgc3RydWN0IHBhZGF0YV93b3JrLFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgICBwd193b3JrKTtcXG4tXFx0c3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEgPSBwdy1cXHUwMDNlcHdfZGF0YTtcXG4tXFxuLVxcdGxvY2FsX2JoX2Rpc2FibGUoKTtcXG4tXFx0cGFkYXRhLVxcdTAwM2VwYXJhbGxlbChwYWRhdGEpO1xcbi1cXHRzcGluX2xvY2soXFx1MDAyNnBhZGF0YV93b3Jrc19sb2NrKTtcXG4tXFx0cGFkYXRhX3dvcmtfZnJlZShwdyk7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZwYWRhdGFfd29ya3NfbG9jayk7XFxuLVxcdGxvY2FsX2JoX2VuYWJsZSgpO1xcbi19XFxuLVxcbi0vKipcXG4tICogcGFkYXRhX2RvX3BhcmFsbGVsIC0gcGFkYXRhIHBhcmFsbGVsaXphdGlvbiBmdW5jdGlvblxcbi0gKlxcbi0gKiBAcHM6IHBhZGF0YXNoZWxsXFxuLSAqIEBwYWRhdGE6IG9iamVjdCB0byBiZSBwYXJhbGxlbGl6ZWRcXG4tICogQGNiX2NwdTogcG9pbnRlciB0byB0aGUgQ1BVIHRoYXQgdGhlIHNlcmlhbGl6YXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gc2hvdWxkXFxuLSAqICAgICAgICAgIHJ1biBvbi4gIElmIGl0J3Mgbm90IGluIHRoZSBzZXJpYWwgY3B1bWFzayBvZiBAcGluc3RcXG4tICogICAgICAgICAgKGkuZS4gY3B1bWFzay5jYmNwdSksIHRoaXMgZnVuY3Rpb24gc2VsZWN0cyBhIGZhbGxiYWNrIENQVSBhbmQgaWZcXG4tICogICAgICAgICAgbm9uZSBmb3VuZCwgcmV0dXJucyAtRUlOVkFMLlxcbi0gKlxcbi0gKiBUaGUgcGFyYWxsZWxpemF0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgcnVuIHdpdGggQkhzIG9mZi5cXG4tICogTm90ZTogRXZlcnkgb2JqZWN0IHdoaWNoIGlzIHBhcmFsbGVsaXplZCBieSBwYWRhdGFfZG9fcGFyYWxsZWxcXG4tICogbXVzdCBiZSBzZWVuIGJ5IHBhZGF0YV9kb19zZXJpYWwuXFxuLSAqXFxuLSAqIFJldHVybjogMCBvbiBzdWNjZXNzIG9yIGVsc2UgbmVnYXRpdmUgZXJyb3IgY29kZS5cXG4tICovXFxuLWludCBwYWRhdGFfZG9fcGFyYWxsZWwoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsXFxuLVxcdFxcdCAgICAgICBzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSwgaW50ICpjYl9jcHUpXFxuLXtcXG4tXFx0c3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QgPSBwcy1cXHUwMDNlcGluc3Q7XFxuLVxcdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDtcXG4tXFx0c3RydWN0IHBhZGF0YV93b3JrICpwdztcXG4tXFx0aW50IGNwdV9pbmRleCwgZXJyO1xcbi1cXG4tXFx0cmN1X3JlYWRfbG9ja19iaCgpO1xcbi1cXG4tXFx0cGQgPSByY3VfZGVyZWZlcmVuY2VfYmgocHMtXFx1MDAzZXBkKTtcXG4tXFxuLVxcdGVyciA9IC1FSU5WQUw7XFxuLVxcdGlmICghKHBpbnN0LVxcdTAwM2VmbGFncyBcXHUwMDI2IFBBREFUQV9JTklUKSB8fCBwaW5zdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBQQURBVEFfSU5WQUxJRClcXG4tXFx0XFx0Z290byBvdXQ7XFxuLVxcbi1cXHRpZiAoIWNwdW1hc2tfdGVzdF9jcHUoKmNiX2NwdSwgcGQtXFx1MDAzZWNwdW1hc2suY2JjcHUpKSB7XFxuLVxcdFxcdGlmIChjcHVtYXNrX2VtcHR5KHBkLVxcdTAwM2VjcHVtYXNrLmNiY3B1KSlcXG4tXFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcbi1cXHRcXHQvKiBTZWxlY3QgYW4gYWx0ZXJuYXRlIGZhbGxiYWNrIENQVSBhbmQgbm90aWZ5IHRoZSBjYWxsZXIuICovXFxuLVxcdFxcdGNwdV9pbmRleCA9ICpjYl9jcHUgJSBjcHVtYXNrX3dlaWdodChwZC1cXHUwMDNlY3B1bWFzay5jYmNwdSk7XFxuLVxcdFxcdCpjYl9jcHUgPSBjcHVtYXNrX250aChjcHVfaW5kZXgsIHBkLVxcdTAwM2VjcHVtYXNrLmNiY3B1KTtcXG4tXFx0fVxcbi1cXG4tXFx0ZXJyID0gLUVCVVNZO1xcbi1cXHRpZiAoKHBpbnN0LVxcdTAwM2VmbGFncyBcXHUwMDI2IFBBREFUQV9SRVNFVCkpXFxuLVxcdFxcdGdvdG8gb3V0O1xcbi1cXG4tXFx0cGFkYXRhX2dldF9wZChwZCk7XFxuLVxcdHBhZGF0YS1cXHUwMDNlcGQgPSBwZDtcXG4tXFx0cGFkYXRhLVxcdTAwM2VjYl9jcHUgPSAqY2JfY3B1O1xcbi1cXG4tXFx0c3Bpbl9sb2NrKFxcdTAwMjZwYWRhdGFfd29ya3NfbG9jayk7XFxuLVxcdHBhZGF0YS1cXHUwMDNlc2VxX25yID0gKytwZC1cXHUwMDNlc2VxX25yO1xcbi1cXHRwdyA9IHBhZGF0YV93b3JrX2FsbG9jKCk7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZwYWRhdGFfd29ya3NfbG9jayk7XFxuLVxcbi1cXHRpZiAoIXB3KSB7XFxuLVxcdFxcdC8qIE1heGltdW0gd29ya3MgbGltaXQgZXhjZWVkZWQsIHJ1biBpbiB0aGUgY3VycmVudCB0YXNrLiAqL1xcbi1cXHRcXHRwYWRhdGEtXFx1MDAzZXBhcmFsbGVsKHBhZGF0YSk7XFxuLVxcdH1cXG4tXFxuLVxcdHJjdV9yZWFkX3VubG9ja19iaCgpO1xcbi1cXG4tXFx0aWYgKHB3KSB7XFxuLVxcdFxcdHBhZGF0YV93b3JrX2luaXQocHcsIHBhZGF0YV9wYXJhbGxlbF93b3JrZXIsIHBhZGF0YSwgMCk7XFxuLVxcdFxcdHF1ZXVlX3dvcmsocGluc3QtXFx1MDAzZXBhcmFsbGVsX3dxLCBcXHUwMDI2cHctXFx1MDAzZXB3X3dvcmspO1xcbi1cXHR9XFxuLVxcbi1cXHRyZXR1cm4gMDtcXG4tb3V0Olxcbi1cXHRyY3VfcmVhZF91bmxvY2tfYmgoKTtcXG4tXFxuLVxcdHJldHVybiBlcnI7XFxuLX1cXG4tRVhQT1JUX1NZTUJPTChwYWRhdGFfZG9fcGFyYWxsZWwpO1xcbi1cXG4tLypcXG4tICogcGFkYXRhX2ZpbmRfbmV4dCAtIEZpbmQgdGhlIG5leHQgb2JqZWN0IHRoYXQgbmVlZHMgc2VyaWFsaXphdGlvbi5cXG4tICpcXG4tICogUmV0dXJuOlxcbi0gKiAqIEEgcG9pbnRlciB0byB0aGUgY29udHJvbCBzdHJ1Y3Qgb2YgdGhlIG5leHQgb2JqZWN0IHRoYXQgbmVlZHNcXG4tICogICBzZXJpYWxpemF0aW9uLCBpZiBwcmVzZW50IGluIG9uZSBvZiB0aGUgcGVyY3B1IHJlb3JkZXIgcXVldWVzLlxcbi0gKiAqIE5VTEwsIGlmIHRoZSBuZXh0IG9iamVjdCB0aGF0IG5lZWRzIHNlcmlhbGl6YXRpb24gd2lsbFxcbi0gKiAgIGJlIHBhcmFsbGVsIHByb2Nlc3NlZCBieSBhbm90aGVyIGNwdSBhbmQgaXMgbm90IHlldCBwcmVzZW50IGluXFxuLSAqICAgdGhlIGNwdSdzIHJlb3JkZXIgcXVldWUuXFxuLSAqL1xcbi1zdGF0aWMgc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGFfZmluZF9uZXh0KHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCwgaW50IGNwdSxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGludCBwcm9jZXNzZWQpXFxuLXtcXG4tXFx0c3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGE7XFxuLVxcdHN0cnVjdCBwYWRhdGFfbGlzdCAqcmVvcmRlcjtcXG4tXFxuLVxcdHJlb3JkZXIgPSBwZXJfY3B1X3B0cihwZC1cXHUwMDNlcmVvcmRlcl9saXN0LCBjcHUpO1xcbi1cXG4tXFx0c3Bpbl9sb2NrKFxcdTAwMjZyZW9yZGVyLVxcdTAwM2Vsb2NrKTtcXG4tXFx0aWYgKGxpc3RfZW1wdHkoXFx1MDAyNnJlb3JkZXItXFx1MDAzZWxpc3QpKVxcbi1cXHRcXHRnb3RvIG5vdGZvdW5kO1xcbi1cXG4tXFx0cGFkYXRhID0gbGlzdF9lbnRyeShyZW9yZGVyLVxcdTAwM2VsaXN0Lm5leHQsIHN0cnVjdCBwYWRhdGFfcHJpdiwgbGlzdCk7XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBDaGVja3MgdGhlIHJhcmUgY2FzZSB3aGVyZSB0d28gb3IgbW9yZSBwYXJhbGxlbCBqb2JzIGhhdmUgaGFzaGVkIHRvXFxuLVxcdCAqIHRoZSBzYW1lIENQVSBhbmQgb25lIG9mIHRoZSBsYXRlciBvbmVzIGZpbmlzaGVzIGZpcnN0Llxcbi1cXHQgKi9cXG4tXFx0aWYgKHBhZGF0YS1cXHUwMDNlc2VxX25yICE9IHByb2Nlc3NlZClcXG4tXFx0XFx0Z290byBub3Rmb3VuZDtcXG4tXFxuLVxcdGxpc3RfZGVsX2luaXQoXFx1MDAyNnBhZGF0YS1cXHUwMDNlbGlzdCk7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZyZW9yZGVyLVxcdTAwM2Vsb2NrKTtcXG4tXFx0cmV0dXJuIHBhZGF0YTtcXG4tXFxuLW5vdGZvdW5kOlxcbi1cXHRwZC1cXHUwMDNlcHJvY2Vzc2VkID0gcHJvY2Vzc2VkO1xcbi1cXHRwZC1cXHUwMDNlY3B1ID0gY3B1O1xcbi1cXHRzcGluX3VubG9jayhcXHUwMDI2cmVvcmRlci1cXHUwMDNlbG9jayk7XFxuLVxcdHJldHVybiBOVUxMO1xcbi19XFxuLVxcbi1zdGF0aWMgdm9pZCBwYWRhdGFfcmVvcmRlcihzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSlcXG4te1xcbi1cXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQgPSBwYWRhdGEtXFx1MDAzZXBkO1xcbi1cXHRzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCA9IHBkLVxcdTAwM2Vwcy1cXHUwMDNlcGluc3Q7XFxuLVxcdHVuc2lnbmVkIGludCBwcm9jZXNzZWQ7XFxuLVxcdGludCBjcHU7XFxuLVxcbi1cXHRwcm9jZXNzZWQgPSBwZC1cXHUwMDNlcHJvY2Vzc2VkO1xcbi1cXHRjcHUgPSBwZC1cXHUwMDNlY3B1O1xcbi1cXG4tXFx0ZG8ge1xcbi1cXHRcXHRzdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZSAqc3F1ZXVlO1xcbi1cXHRcXHRpbnQgY2JfY3B1O1xcbi1cXG4tXFx0XFx0cHJvY2Vzc2VkKys7XFxuLVxcdFxcdC8qIFdoZW4gc2VxdWVuY2Ugd3JhcHMgYXJvdW5kLCByZXNldCB0byB0aGUgZmlyc3QgQ1BVLiAqL1xcbi1cXHRcXHRpZiAodW5saWtlbHkocHJvY2Vzc2VkID09IDApKVxcbi1cXHRcXHRcXHRjcHUgPSBjcHVtYXNrX2ZpcnN0KHBkLVxcdTAwM2VjcHVtYXNrLnBjcHUpO1xcbi1cXHRcXHRlbHNlXFxuLVxcdFxcdFxcdGNwdSA9IGNwdW1hc2tfbmV4dF93cmFwKGNwdSwgcGQtXFx1MDAzZWNwdW1hc2sucGNwdSk7XFxuLVxcbi1cXHRcXHRjYl9jcHUgPSBwYWRhdGEtXFx1MDAzZWNiX2NwdTtcXG4tXFx0XFx0c3F1ZXVlID0gcGVyX2NwdV9wdHIocGQtXFx1MDAzZXNxdWV1ZSwgY2JfY3B1KTtcXG4tXFxuLVxcdFxcdHNwaW5fbG9jayhcXHUwMDI2c3F1ZXVlLVxcdTAwM2VzZXJpYWwubG9jayk7XFxuLVxcdFxcdGxpc3RfYWRkX3RhaWwoXFx1MDAyNnBhZGF0YS1cXHUwMDNlbGlzdCwgXFx1MDAyNnNxdWV1ZS1cXHUwMDNlc2VyaWFsLmxpc3QpO1xcbi1cXHRcXHRxdWV1ZV93b3JrX29uKGNiX2NwdSwgcGluc3QtXFx1MDAzZXNlcmlhbF93cSwgXFx1MDAyNnNxdWV1ZS1cXHUwMDNld29yayk7XFxuLVxcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBJZiB0aGUgbmV4dCBvYmplY3QgdGhhdCBuZWVkcyBzZXJpYWxpemF0aW9uIGlzIHBhcmFsbGVsXFxuLVxcdFxcdCAqIHByb2Nlc3NlZCBieSBhbm90aGVyIGNwdSBhbmQgaXMgc3RpbGwgb24gaXQncyB3YXkgdG8gdGhlXFxuLVxcdFxcdCAqIGNwdSdzIHJlb3JkZXIgcXVldWUsIGVuZCB0aGUgbG9vcC5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdHBhZGF0YSA9IHBhZGF0YV9maW5kX25leHQocGQsIGNwdSwgcHJvY2Vzc2VkKTtcXG4tXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNnNxdWV1ZS1cXHUwMDNlc2VyaWFsLmxvY2spO1xcbi1cXHR9IHdoaWxlIChwYWRhdGEpO1xcbi19XFxuLVxcbi1zdGF0aWMgdm9pZCBwYWRhdGFfc2VyaWFsX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnNlcmlhbF93b3JrKVxcbi17XFxuLVxcdHN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlICpzcXVldWU7XFxuLVxcdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDtcXG4tXFx0TElTVF9IRUFEKGxvY2FsX2xpc3QpO1xcbi1cXHRpbnQgY250O1xcbi1cXG4tXFx0bG9jYWxfYmhfZGlzYWJsZSgpO1xcbi1cXHRzcXVldWUgPSBjb250YWluZXJfb2Yoc2VyaWFsX3dvcmssIHN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlLCB3b3JrKTtcXG4tXFx0cGQgPSBzcXVldWUtXFx1MDAzZXBkO1xcbi1cXG4tXFx0c3Bpbl9sb2NrKFxcdTAwMjZzcXVldWUtXFx1MDAzZXNlcmlhbC5sb2NrKTtcXG4tXFx0bGlzdF9yZXBsYWNlX2luaXQoXFx1MDAyNnNxdWV1ZS1cXHUwMDNlc2VyaWFsLmxpc3QsIFxcdTAwMjZsb2NhbF9saXN0KTtcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnNxdWV1ZS1cXHUwMDNlc2VyaWFsLmxvY2spO1xcbi1cXG4tXFx0Y250ID0gMDtcXG4tXFxuLVxcdHdoaWxlICghbGlzdF9lbXB0eShcXHUwMDI2bG9jYWxfbGlzdCkpIHtcXG4tXFx0XFx0c3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGE7XFxuLVxcbi1cXHRcXHRwYWRhdGEgPSBsaXN0X2VudHJ5KGxvY2FsX2xpc3QubmV4dCxcXG4tXFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBwYWRhdGFfcHJpdiwgbGlzdCk7XFxuLVxcbi1cXHRcXHRsaXN0X2RlbF9pbml0KFxcdTAwMjZwYWRhdGEtXFx1MDAzZWxpc3QpO1xcbi1cXG4tXFx0XFx0cGFkYXRhLVxcdTAwM2VzZXJpYWwocGFkYXRhKTtcXG4tXFx0XFx0Y250Kys7XFxuLVxcdH1cXG4tXFx0bG9jYWxfYmhfZW5hYmxlKCk7XFxuLVxcbi1cXHRwYWRhdGFfcHV0X3BkX2NudChwZCwgY250KTtcXG4tfVxcbi1cXG4tLyoqXFxuLSAqIHBhZGF0YV9kb19zZXJpYWwgLSBwYWRhdGEgc2VyaWFsaXphdGlvbiBmdW5jdGlvblxcbi0gKlxcbi0gKiBAcGFkYXRhOiBvYmplY3QgdG8gYmUgc2VyaWFsaXplZC5cXG4tICpcXG4tICogcGFkYXRhX2RvX3NlcmlhbCBtdXN0IGJlIGNhbGxlZCBmb3IgZXZlcnkgcGFyYWxsZWxpemVkIG9iamVjdC5cXG4tICogVGhlIHNlcmlhbGl6YXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBydW4gd2l0aCBCSHMgb2ZmLlxcbi0gKi9cXG4tdm9pZCBwYWRhdGFfZG9fc2VyaWFsKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKVxcbi17XFxuLVxcdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCA9IHBhZGF0YS1cXHUwMDNlcGQ7XFxuLVxcdGludCBoYXNoZWRfY3B1ID0gcGFkYXRhX2NwdV9oYXNoKHBkLCBwYWRhdGEtXFx1MDAzZXNlcV9ucik7XFxuLVxcdHN0cnVjdCBwYWRhdGFfbGlzdCAqcmVvcmRlciA9IHBlcl9jcHVfcHRyKHBkLVxcdTAwM2VyZW9yZGVyX2xpc3QsIGhhc2hlZF9jcHUpO1xcbi1cXHRzdHJ1Y3QgcGFkYXRhX3ByaXYgKmN1cjtcXG4tXFx0c3RydWN0IGxpc3RfaGVhZCAqcG9zO1xcbi1cXHRib29sIGdvdGl0ID0gdHJ1ZTtcXG4tXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2cmVvcmRlci1cXHUwMDNlbG9jayk7XFxuLVxcdC8qIFNvcnQgaW4gYXNjZW5kaW5nIG9yZGVyIG9mIHNlcXVlbmNlIG51bWJlci4gKi9cXG4tXFx0bGlzdF9mb3JfZWFjaF9wcmV2KHBvcywgXFx1MDAyNnJlb3JkZXItXFx1MDAzZWxpc3QpIHtcXG4tXFx0XFx0Y3VyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBwYWRhdGFfcHJpdiwgbGlzdCk7XFxuLVxcdFxcdC8qIENvbXBhcmUgYnkgZGlmZmVyZW5jZSB0byBjb25zaWRlciBpbnRlZ2VyIHdyYXAgYXJvdW5kICovXFxuLVxcdFxcdGlmICgoc2lnbmVkIGludCkoY3VyLVxcdTAwM2VzZXFfbnIgLSBwYWRhdGEtXFx1MDAzZXNlcV9ucikgXFx1MDAzYyAwKVxcbi1cXHRcXHRcXHRicmVhaztcXG4tXFx0fVxcbi1cXHRpZiAocGFkYXRhLVxcdTAwM2VzZXFfbnIgIT0gcGQtXFx1MDAzZXByb2Nlc3NlZCkge1xcbi1cXHRcXHRnb3RpdCA9IGZhbHNlO1xcbi1cXHRcXHRsaXN0X2FkZChcXHUwMDI2cGFkYXRhLVxcdTAwM2VsaXN0LCBwb3MpO1xcbi1cXHR9XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZyZW9yZGVyLVxcdTAwM2Vsb2NrKTtcXG4tXFxuLVxcdGlmIChnb3RpdClcXG4tXFx0XFx0cGFkYXRhX3Jlb3JkZXIocGFkYXRhKTtcXG4tfVxcbi1FWFBPUlRfU1lNQk9MKHBhZGF0YV9kb19zZXJpYWwpO1xcbi1cXG4tc3RhdGljIGludCBwYWRhdGFfc2V0dXBfY3B1bWFza3Moc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpXFxuLXtcXG4tXFx0c3RydWN0IHdvcmtxdWV1ZV9hdHRycyAqYXR0cnM7XFxuLVxcdGludCBlcnI7XFxuLVxcbi1cXHRhdHRycyA9IGFsbG9jX3dvcmtxdWV1ZV9hdHRycygpO1xcbi1cXHRpZiAoIWF0dHJzKVxcbi1cXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4tXFxuLVxcdC8qIFJlc3RyaWN0IHBhcmFsbGVsX3dxIHdvcmtlcnMgdG8gcGQtXFx1MDAzZWNwdW1hc2sucGNwdS4gKi9cXG4tXFx0Y3B1bWFza19jb3B5KGF0dHJzLVxcdTAwM2VjcHVtYXNrLCBwaW5zdC1cXHUwMDNlY3B1bWFzay5wY3B1KTtcXG4tXFx0ZXJyID0gYXBwbHlfd29ya3F1ZXVlX2F0dHJzKHBpbnN0LVxcdTAwM2VwYXJhbGxlbF93cSwgYXR0cnMpO1xcbi1cXHRmcmVlX3dvcmtxdWV1ZV9hdHRycyhhdHRycyk7XFxuLVxcbi1cXHRyZXR1cm4gZXJyO1xcbi19XFxuLVxcbiBzdGF0aWMgdm9pZCBfX2luaXQgcGFkYXRhX210X2hlbHBlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpXFxuIHtcXG4gXFx0c3RydWN0IHBhZGF0YV93b3JrICpwdyA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgcGFkYXRhX3dvcmssIHB3X3dvcmspO1xcbkBAIC01MDYsNjEzICsyMjQsMTcgQEAgdm9pZCBfX2luaXQgcGFkYXRhX2RvX211bHRpdGhyZWFkZWQoc3RydWN0IHBhZGF0YV9tdF9qb2IgKmpvYilcXG4gXFx0cGFkYXRhX3dvcmtzX2ZyZWUoXFx1MDAyNndvcmtzKTtcXG4gfVxcbiBcXG4tLyogSW5pdGlhbGl6ZSBhbGwgcGVyY3B1IHF1ZXVlcyB1c2VkIGJ5IHNlcmlhbCB3b3JrZXJzICovXFxuLXN0YXRpYyB2b2lkIHBhZGF0YV9pbml0X3NxdWV1ZXMoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKVxcbi17XFxuLVxcdGludCBjcHU7XFxuLVxcdHN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlICpzcXVldWU7XFxuLVxcbi1cXHRmb3JfZWFjaF9jcHUoY3B1LCBwZC1cXHUwMDNlY3B1bWFzay5jYmNwdSkge1xcbi1cXHRcXHRzcXVldWUgPSBwZXJfY3B1X3B0cihwZC1cXHUwMDNlc3F1ZXVlLCBjcHUpO1xcbi1cXHRcXHRzcXVldWUtXFx1MDAzZXBkID0gcGQ7XFxuLVxcdFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZzcXVldWUtXFx1MDAzZXNlcmlhbC5saXN0KTtcXG4tXFx0XFx0c3Bpbl9sb2NrX2luaXQoXFx1MDAyNnNxdWV1ZS1cXHUwMDNlc2VyaWFsLmxvY2spO1xcbi1cXHRcXHRJTklUX1dPUksoXFx1MDAyNnNxdWV1ZS1cXHUwMDNld29yaywgcGFkYXRhX3NlcmlhbF93b3JrZXIpO1xcbi1cXHR9XFxuLX1cXG4tXFxuLS8qIEluaXRpYWxpemUgcGVyLUNQVSByZW9yZGVyIGxpc3RzICovXFxuLXN0YXRpYyB2b2lkIHBhZGF0YV9pbml0X3Jlb3JkZXJfbGlzdChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQpXFxuLXtcXG4tXFx0aW50IGNwdTtcXG4tXFx0c3RydWN0IHBhZGF0YV9saXN0ICpsaXN0O1xcbi1cXG4tXFx0Zm9yX2VhY2hfY3B1KGNwdSwgcGQtXFx1MDAzZWNwdW1hc2sucGNwdSkge1xcbi1cXHRcXHRsaXN0ID0gcGVyX2NwdV9wdHIocGQtXFx1MDAzZXJlb3JkZXJfbGlzdCwgY3B1KTtcXG4tXFx0XFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNmxpc3QtXFx1MDAzZWxpc3QpO1xcbi1cXHRcXHRzcGluX2xvY2tfaW5pdChcXHUwMDI2bGlzdC1cXHUwMDNlbG9jayk7XFxuLVxcdH1cXG4tfVxcbi1cXG4tLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGludGVybmFsIGNwdW1hc2sgZGVwZW5kZW5kIHJlc291cmNlcy4gKi9cXG4tc3RhdGljIHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwYWRhdGFfYWxsb2NfcGQoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgaW50IG9mZmxpbmluZ19jcHUpXFxuLXtcXG4tXFx0c3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QgPSBwcy1cXHUwMDNlcGluc3Q7XFxuLVxcdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDtcXG4tXFxuLVxcdHBkID0ga3phbGxvY19vYmooc3RydWN0IHBhcmFsbGVsX2RhdGEpO1xcbi1cXHRpZiAoIXBkKVxcbi1cXHRcXHRnb3RvIGVycjtcXG4tXFxuLVxcdHBkLVxcdTAwM2VyZW9yZGVyX2xpc3QgPSBhbGxvY19wZXJjcHUoc3RydWN0IHBhZGF0YV9saXN0KTtcXG4tXFx0aWYgKCFwZC1cXHUwMDNlcmVvcmRlcl9saXN0KVxcbi1cXHRcXHRnb3RvIGVycl9mcmVlX3BkO1xcbi1cXG4tXFx0cGQtXFx1MDAzZXNxdWV1ZSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZSk7XFxuLVxcdGlmICghcGQtXFx1MDAzZXNxdWV1ZSlcXG4tXFx0XFx0Z290byBlcnJfZnJlZV9yZW9yZGVyX2xpc3Q7XFxuLVxcbi1cXHRwZC1cXHUwMDNlcHMgPSBwcztcXG4tXFxuLVxcdGlmICghYWxsb2NfY3B1bWFza192YXIoXFx1MDAyNnBkLVxcdTAwM2VjcHVtYXNrLnBjcHUsIEdGUF9LRVJORUwpKVxcbi1cXHRcXHRnb3RvIGVycl9mcmVlX3NxdWV1ZTtcXG4tXFx0aWYgKCFhbGxvY19jcHVtYXNrX3ZhcihcXHUwMDI2cGQtXFx1MDAzZWNwdW1hc2suY2JjcHUsIEdGUF9LRVJORUwpKVxcbi1cXHRcXHRnb3RvIGVycl9mcmVlX3BjcHU7XFxuLVxcbi1cXHRjcHVtYXNrX2FuZChwZC1cXHUwMDNlY3B1bWFzay5wY3B1LCBwaW5zdC1cXHUwMDNlY3B1bWFzay5wY3B1LCBjcHVfb25saW5lX21hc2spO1xcbi1cXHRjcHVtYXNrX2FuZChwZC1cXHUwMDNlY3B1bWFzay5jYmNwdSwgcGluc3QtXFx1MDAzZWNwdW1hc2suY2JjcHUsIGNwdV9vbmxpbmVfbWFzayk7XFxuLVxcdGlmIChvZmZsaW5pbmdfY3B1IFxcdTAwM2U9IDApIHtcXG4tXFx0XFx0X19jcHVtYXNrX2NsZWFyX2NwdShvZmZsaW5pbmdfY3B1LCBwZC1cXHUwMDNlY3B1bWFzay5wY3B1KTtcXG4tXFx0XFx0X19jcHVtYXNrX2NsZWFyX2NwdShvZmZsaW5pbmdfY3B1LCBwZC1cXHUwMDNlY3B1bWFzay5jYmNwdSk7XFxuLVxcdH1cXG4tXFxuLVxcdHBhZGF0YV9pbml0X3Jlb3JkZXJfbGlzdChwZCk7XFxuLVxcdHBhZGF0YV9pbml0X3NxdWV1ZXMocGQpO1xcbi1cXHRwZC1cXHUwMDNlc2VxX25yID0gLTE7XFxuLVxcdHJlZmNvdW50X3NldChcXHUwMDI2cGQtXFx1MDAzZXJlZmNudCwgMSk7XFxuLVxcdHBkLVxcdTAwM2VjcHUgPSBjcHVtYXNrX2ZpcnN0KHBkLVxcdTAwM2VjcHVtYXNrLnBjcHUpO1xcbi1cXG4tXFx0cmV0dXJuIHBkO1xcbi1cXG4tZXJyX2ZyZWVfcGNwdTpcXG4tXFx0ZnJlZV9jcHVtYXNrX3ZhcihwZC1cXHUwMDNlY3B1bWFzay5wY3B1KTtcXG4tZXJyX2ZyZWVfc3F1ZXVlOlxcbi1cXHRmcmVlX3BlcmNwdShwZC1cXHUwMDNlc3F1ZXVlKTtcXG4tZXJyX2ZyZWVfcmVvcmRlcl9saXN0Olxcbi1cXHRmcmVlX3BlcmNwdShwZC1cXHUwMDNlcmVvcmRlcl9saXN0KTtcXG4tZXJyX2ZyZWVfcGQ6XFxuLVxcdGtmcmVlKHBkKTtcXG4tZXJyOlxcbi1cXHRyZXR1cm4gTlVMTDtcXG4tfVxcbi1cXG4tc3RhdGljIHZvaWQgcGFkYXRhX2ZyZWVfcGQoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKVxcbi17XFxuLVxcdGZyZWVfY3B1bWFza192YXIocGQtXFx1MDAzZWNwdW1hc2sucGNwdSk7XFxuLVxcdGZyZWVfY3B1bWFza192YXIocGQtXFx1MDAzZWNwdW1hc2suY2JjcHUpO1xcbi1cXHRmcmVlX3BlcmNwdShwZC1cXHUwMDNlcmVvcmRlcl9saXN0KTtcXG4tXFx0ZnJlZV9wZXJjcHUocGQtXFx1MDAzZXNxdWV1ZSk7XFxuLVxcdGtmcmVlKHBkKTtcXG4tfVxcbi1cXG4tc3RhdGljIHZvaWQgX19wYWRhdGFfc3RhcnQoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpXFxuLXtcXG4tXFx0cGluc3QtXFx1MDAzZWZsYWdzIHw9IFBBREFUQV9JTklUO1xcbi19XFxuLVxcbi1zdGF0aWMgdm9pZCBfX3BhZGF0YV9zdG9wKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KVxcbi17XFxuLVxcdGlmICghKHBpbnN0LVxcdTAwM2VmbGFncyBcXHUwMDI2IFBBREFUQV9JTklUKSlcXG4tXFx0XFx0cmV0dXJuO1xcbi1cXG4tXFx0cGluc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjY9IH5QQURBVEFfSU5JVDtcXG4tXFxuLVxcdHN5bmNocm9uaXplX3JjdSgpO1xcbi19XFxuLVxcbi0vKiBSZXBsYWNlIHRoZSBpbnRlcm5hbCBjb250cm9sIHN0cnVjdHVyZSB3aXRoIGEgbmV3IG9uZS4gKi9cXG4tc3RhdGljIGludCBwYWRhdGFfcmVwbGFjZV9vbmUoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsIGludCBvZmZsaW5pbmdfY3B1KVxcbi17XFxuLVxcdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZF9uZXc7XFxuLVxcbi1cXHRwZF9uZXcgPSBwYWRhdGFfYWxsb2NfcGQocHMsIG9mZmxpbmluZ19jcHUpO1xcbi1cXHRpZiAoIXBkX25ldylcXG4tXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuLVxcbi1cXHRwcy1cXHUwMDNlb3BkID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChwcy1cXHUwMDNlcGQsIDEpO1xcbi1cXHRyY3VfYXNzaWduX3BvaW50ZXIocHMtXFx1MDAzZXBkLCBwZF9uZXcpO1xcbi1cXG4tXFx0cmV0dXJuIDA7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbnQgcGFkYXRhX3JlcGxhY2Uoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsIGludCBvZmZsaW5pbmdfY3B1KVxcbi17XFxuLVxcdHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzO1xcbi1cXHRpbnQgZXJyID0gMDtcXG4tXFxuLVxcdHBpbnN0LVxcdTAwM2VmbGFncyB8PSBQQURBVEFfUkVTRVQ7XFxuLVxcbi1cXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KHBzLCBcXHUwMDI2cGluc3QtXFx1MDAzZXBzbGlzdCwgbGlzdCkge1xcbi1cXHRcXHRlcnIgPSBwYWRhdGFfcmVwbGFjZV9vbmUocHMsIG9mZmxpbmluZ19jcHUpO1xcbi1cXHRcXHRpZiAoZXJyKVxcbi1cXHRcXHRcXHRicmVhaztcXG4tXFx0fVxcbi1cXG4tXFx0c3luY2hyb25pemVfcmN1KCk7XFxuLVxcbi1cXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JldmVyc2UocHMsIFxcdTAwMjZwaW5zdC1cXHUwMDNlcHNsaXN0LCBsaXN0KVxcbi1cXHRcXHRwYWRhdGFfcHV0X3BkKHBzLVxcdTAwM2VvcGQpO1xcbi1cXG4tXFx0cGluc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjY9IH5QQURBVEFfUkVTRVQ7XFxuLVxcbi1cXHRyZXR1cm4gZXJyO1xcbi19XFxuLVxcbi0vKiBJZiBjcHVtYXNrIGNvbnRhaW5zIG5vIGFjdGl2ZSBjcHUsIHdlIG1hcmsgdGhlIGluc3RhbmNlIGFzIGludmFsaWQuICovXFxuLXN0YXRpYyBib29sIHBhZGF0YV92YWxpZGF0ZV9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LFxcbi1cXHRcXHRcXHRcXHQgICAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2ssXFxuLVxcdFxcdFxcdFxcdCAgICBpbnQgb2ZmbGluaW5nX2NwdSlcXG4te1xcbi1cXHRjcHVtYXNrX2NvcHkocGluc3QtXFx1MDAzZXZhbGlkYXRlX2NwdW1hc2ssIGNwdV9vbmxpbmVfbWFzayk7XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBAb2ZmbGluaW5nX2NwdSBpcyBzdGlsbCBpbiBjcHVfb25saW5lX21hc2ssIHNvIHJlbW92ZSBpdCBoZXJlIGZvclxcbi1cXHQgKiB2YWxpZGF0aW9uLiAgVXNpbmcgYSBzdWItQ1BVSFBfVEVBUkRPV05fQ1BVIGhvdHBsdWcgc3RhdGUgd2hlcmVcXG4tXFx0ICogQG9mZmxpbmluZ19jcHUgd291bGRuJ3QgYmUgaW4gdGhlIG9ubGluZSBtYXNrIGRvZXNuJ3Qgd29yayBiZWNhdXNlXFxuLVxcdCAqIHBhZGF0YV9jcHVfb2ZmbGluZSgpIGNhbiBmYWlsIGJ1dCBzdWNoIGEgc3RhdGUgZG9lc24ndCBhbGxvdyBmYWlsdXJlLlxcbi1cXHQgKi9cXG4tXFx0aWYgKG9mZmxpbmluZ19jcHUgXFx1MDAzZT0gMClcXG4tXFx0XFx0X19jcHVtYXNrX2NsZWFyX2NwdShvZmZsaW5pbmdfY3B1LCBwaW5zdC1cXHUwMDNldmFsaWRhdGVfY3B1bWFzayk7XFxuLVxcbi1cXHRpZiAoIWNwdW1hc2tfaW50ZXJzZWN0cyhjcHVtYXNrLCBwaW5zdC1cXHUwMDNldmFsaWRhdGVfY3B1bWFzaykpIHtcXG4tXFx0XFx0cGluc3QtXFx1MDAzZWZsYWdzIHw9IFBBREFUQV9JTlZBTElEO1xcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcdH1cXG4tXFxuLVxcdHBpbnN0LVxcdTAwM2VmbGFncyBcXHUwMDI2PSB+UEFEQVRBX0lOVkFMSUQ7XFxuLVxcdHJldHVybiB0cnVlO1xcbi19XFxuLVxcbi1zdGF0aWMgaW50IF9fcGFkYXRhX3NldF9jcHVtYXNrcyhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCxcXG4tXFx0XFx0XFx0XFx0IGNwdW1hc2tfdmFyX3QgcGNwdW1hc2ssXFxuLVxcdFxcdFxcdFxcdCBjcHVtYXNrX3Zhcl90IGNiY3B1bWFzaylcXG4te1xcbi1cXHRpbnQgdmFsaWQ7XFxuLVxcdGludCBlcnI7XFxuLVxcbi1cXHR2YWxpZCA9IHBhZGF0YV92YWxpZGF0ZV9jcHVtYXNrKHBpbnN0LCBwY3B1bWFzaywgLTEpO1xcbi1cXHRpZiAoIXZhbGlkKSB7XFxuLVxcdFxcdF9fcGFkYXRhX3N0b3AocGluc3QpO1xcbi1cXHRcXHRnb3RvIG91dF9yZXBsYWNlO1xcbi1cXHR9XFxuLVxcbi1cXHR2YWxpZCA9IHBhZGF0YV92YWxpZGF0ZV9jcHVtYXNrKHBpbnN0LCBjYmNwdW1hc2ssIC0xKTtcXG4tXFx0aWYgKCF2YWxpZClcXG4tXFx0XFx0X19wYWRhdGFfc3RvcChwaW5zdCk7XFxuLVxcbi1vdXRfcmVwbGFjZTpcXG4tXFx0Y3B1bWFza19jb3B5KHBpbnN0LVxcdTAwM2VjcHVtYXNrLnBjcHUsIHBjcHVtYXNrKTtcXG4tXFx0Y3B1bWFza19jb3B5KHBpbnN0LVxcdTAwM2VjcHVtYXNrLmNiY3B1LCBjYmNwdW1hc2spO1xcbi1cXG4tXFx0ZXJyID0gcGFkYXRhX3NldHVwX2NwdW1hc2tzKHBpbnN0KSA/OiBwYWRhdGFfcmVwbGFjZShwaW5zdCwgLTEpO1xcbi1cXG4tXFx0aWYgKHZhbGlkKVxcbi1cXHRcXHRfX3BhZGF0YV9zdGFydChwaW5zdCk7XFxuLVxcbi1cXHRyZXR1cm4gZXJyO1xcbi19XFxuLVxcbi0vKipcXG4tICogcGFkYXRhX3NldF9jcHVtYXNrIC0gU2V0cyBzcGVjaWZpZWQgYnkgQGNwdW1hc2tfdHlwZSBjcHVtYXNrIHRvIHRoZSB2YWx1ZVxcbi0gKiAgICAgICAgICAgICAgICAgICAgICBlcXVpdmFsZW50IHRvIEBjcHVtYXNrLlxcbi0gKiBAcGluc3Q6IHBhZGF0YSBpbnN0YW5jZVxcbi0gKiBAY3B1bWFza190eXBlOiBQQURBVEFfQ1BVX1NFUklBTCBvciBQQURBVEFfQ1BVX1BBUkFMTEVMIGNvcnJlc3BvbmRpbmdcXG4tICogICAgICAgICAgICAgICAgdG8gcGFyYWxsZWwgYW5kIHNlcmlhbCBjcHVtYXNrcyByZXNwZWN0aXZlbHkuXFxuLSAqIEBjcHVtYXNrOiB0aGUgY3B1bWFzayB0byB1c2VcXG4tICpcXG4tICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZVxcbi0gKi9cXG4taW50IHBhZGF0YV9zZXRfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdW1hc2tfdHlwZSxcXG4tXFx0XFx0ICAgICAgIGNwdW1hc2tfdmFyX3QgY3B1bWFzaylcXG4te1xcbi1cXHRzdHJ1Y3QgY3B1bWFzayAqc2VyaWFsX21hc2ssICpwYXJhbGxlbF9tYXNrO1xcbi1cXHRpbnQgZXJyID0gLUVJTlZBTDtcXG4tXFxuLVxcdGNwdXNfcmVhZF9sb2NrKCk7XFxuLVxcdG11dGV4X2xvY2soXFx1MDAyNnBpbnN0LVxcdTAwM2Vsb2NrKTtcXG4tXFxuLVxcdHN3aXRjaCAoY3B1bWFza190eXBlKSB7XFxuLVxcdGNhc2UgUEFEQVRBX0NQVV9QQVJBTExFTDpcXG4tXFx0XFx0c2VyaWFsX21hc2sgPSBwaW5zdC1cXHUwMDNlY3B1bWFzay5jYmNwdTtcXG4tXFx0XFx0cGFyYWxsZWxfbWFzayA9IGNwdW1hc2s7XFxuLVxcdFxcdGJyZWFrO1xcbi1cXHRjYXNlIFBBREFUQV9DUFVfU0VSSUFMOlxcbi1cXHRcXHRwYXJhbGxlbF9tYXNrID0gcGluc3QtXFx1MDAzZWNwdW1hc2sucGNwdTtcXG4tXFx0XFx0c2VyaWFsX21hc2sgPSBjcHVtYXNrO1xcbi1cXHRcXHRicmVhaztcXG4tXFx0ZGVmYXVsdDpcXG4tXFx0XFx0IGdvdG8gb3V0O1xcbi1cXHR9XFxuLVxcbi1cXHRlcnIgPSAgX19wYWRhdGFfc2V0X2NwdW1hc2tzKHBpbnN0LCBwYXJhbGxlbF9tYXNrLCBzZXJpYWxfbWFzayk7XFxuLVxcbi1vdXQ6XFxuLVxcdG11dGV4X3VubG9jayhcXHUwMDI2cGluc3QtXFx1MDAzZWxvY2spO1xcbi1cXHRjcHVzX3JlYWRfdW5sb2NrKCk7XFxuLVxcbi1cXHRyZXR1cm4gZXJyO1xcbi19XFxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX3NldF9jcHVtYXNrKTtcXG4tXFxuLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFVcXG4tXFxuLXN0YXRpYyBpbmxpbmUgaW50IHBpbnN0X2hhc19jcHUoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsIGludCBjcHUpXFxuLXtcXG4tXFx0cmV0dXJuIGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBwaW5zdC1cXHUwMDNlY3B1bWFzay5wY3B1KSB8fFxcbi1cXHRcXHRjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgcGluc3QtXFx1MDAzZWNwdW1hc2suY2JjcHUpO1xcbi19XFxuLVxcbi1zdGF0aWMgaW50IHBhZGF0YV9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKVxcbi17XFxuLVxcdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0O1xcbi1cXHRpbnQgcmV0O1xcbi1cXG4tXFx0cGluc3QgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UsIGNwdWhwX25vZGUpO1xcbi1cXHRpZiAoIXBpbnN0X2hhc19jcHUocGluc3QsIGNwdSkpXFxuLVxcdFxcdHJldHVybiAwO1xcbi1cXG4tXFx0bXV0ZXhfbG9jayhcXHUwMDI2cGluc3QtXFx1MDAzZWxvY2spO1xcbi1cXG4tXFx0cmV0ID0gcGFkYXRhX3JlcGxhY2UocGluc3QsIC0xKTtcXG4tXFxuLVxcdGlmIChwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGluc3QtXFx1MDAzZWNwdW1hc2sucGNwdSwgLTEpIFxcdTAwMjZcXHUwMDI2XFxuLVxcdCAgICBwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGluc3QtXFx1MDAzZWNwdW1hc2suY2JjcHUsIC0xKSlcXG4tXFx0XFx0X19wYWRhdGFfc3RhcnQocGluc3QpO1xcbi1cXG4tXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZwaW5zdC1cXHUwMDNlbG9jayk7XFxuLVxcdHJldHVybiByZXQ7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbnQgcGFkYXRhX2NwdV9vZmZsaW5lKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKVxcbi17XFxuLVxcdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0O1xcbi1cXHRpbnQgcmV0O1xcbi1cXG4tXFx0cGluc3QgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UsIGNwdWhwX25vZGUpO1xcbi1cXHRpZiAoIXBpbnN0X2hhc19jcHUocGluc3QsIGNwdSkpXFxuLVxcdFxcdHJldHVybiAwO1xcbi1cXG4tXFx0bXV0ZXhfbG9jayhcXHUwMDI2cGluc3QtXFx1MDAzZWxvY2spO1xcbi1cXG4tXFx0aWYgKCFwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGluc3QtXFx1MDAzZWNwdW1hc2sucGNwdSwgY3B1KSB8fFxcbi1cXHQgICAgIXBhZGF0YV92YWxpZGF0ZV9jcHVtYXNrKHBpbnN0LCBwaW5zdC1cXHUwMDNlY3B1bWFzay5jYmNwdSwgY3B1KSlcXG4tXFx0XFx0X19wYWRhdGFfc3RvcChwaW5zdCk7XFxuLVxcbi1cXHRyZXQgPSBwYWRhdGFfcmVwbGFjZShwaW5zdCwgY3B1KTtcXG4tXFxuLVxcdG11dGV4X3VubG9jayhcXHUwMDI2cGluc3QtXFx1MDAzZWxvY2spO1xcbi1cXHRyZXR1cm4gcmV0O1xcbi19XFxuLVxcbi1zdGF0aWMgZW51bSBjcHVocF9zdGF0ZSBocF9vbmxpbmU7XFxuLSNlbmRpZlxcbi1cXG4tc3RhdGljIHZvaWQgX19wYWRhdGFfZnJlZShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdClcXG4te1xcbi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVXFxuLVxcdGNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzKGhwX29ubGluZSwgXFx1MDAyNnBpbnN0LVxcdTAwM2VjcHVocF9ub2RlKTtcXG4tI2VuZGlmXFxuLVxcbi1cXHRXQVJOX09OKCFsaXN0X2VtcHR5KFxcdTAwMjZwaW5zdC1cXHUwMDNlcHNsaXN0KSk7XFxuLVxcbi1cXHRmcmVlX2NwdW1hc2tfdmFyKHBpbnN0LVxcdTAwM2VjcHVtYXNrLnBjcHUpO1xcbi1cXHRmcmVlX2NwdW1hc2tfdmFyKHBpbnN0LVxcdTAwM2VjcHVtYXNrLmNiY3B1KTtcXG4tXFx0ZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC1cXHUwMDNldmFsaWRhdGVfY3B1bWFzayk7XFxuLVxcdGRlc3Ryb3lfd29ya3F1ZXVlKHBpbnN0LVxcdTAwM2VzZXJpYWxfd3EpO1xcbi1cXHRkZXN0cm95X3dvcmtxdWV1ZShwaW5zdC1cXHUwMDNlcGFyYWxsZWxfd3EpO1xcbi1cXHRrZnJlZShwaW5zdCk7XFxuLX1cXG4tXFxuLSNkZWZpbmUga29iajJwaW5zdChfa29iailcXHRcXHRcXHRcXHRcXHRcXFxcXFxuLVxcdGNvbnRhaW5lcl9vZihfa29iaiwgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSwga29iailcXG4tI2RlZmluZSBhdHRyMnBlbnRyeShfYXR0cilcXHRcXHRcXHRcXHRcXHRcXFxcXFxuLVxcdGNvbnRhaW5lcl9vZl9jb25zdChfYXR0ciwgc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSwgYXR0cilcXG4tXFxuLXN0YXRpYyB2b2lkIHBhZGF0YV9zeXNmc19yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKVxcbi17XFxuLVxcdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0ID0ga29iajJwaW5zdChrb2JqKTtcXG4tXFx0X19wYWRhdGFfZnJlZShwaW5zdCk7XFxuLX1cXG4tXFxuLXN0cnVjdCBwYWRhdGFfc3lzZnNfZW50cnkge1xcbi1cXHRzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7XFxuLVxcdHNzaXplX3QgKCpzaG93KShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKiwgY2hhciAqKTtcXG4tXFx0c3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKixcXG4tXFx0XFx0XFx0IGNvbnN0IGNoYXIgKiwgc2l6ZV90KTtcXG4tfTtcXG4tXFxuLXN0YXRpYyBzc2l6ZV90IHNob3dfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCxcXG4tXFx0XFx0XFx0ICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsICBjaGFyICpidWYpXFxuLXtcXG4tXFx0c3RydWN0IGNwdW1hc2sgKmNwdW1hc2s7XFxuLVxcdHNzaXplX3QgbGVuO1xcbi1cXG4tXFx0bXV0ZXhfbG9jayhcXHUwMDI2cGluc3QtXFx1MDAzZWxvY2spO1xcbi1cXHRpZiAoIXN0cmNtcChhdHRyLVxcdTAwM2VuYW1lLCBcXFwic2VyaWFsX2NwdW1hc2tcXFwiKSlcXG4tXFx0XFx0Y3B1bWFzayA9IHBpbnN0LVxcdTAwM2VjcHVtYXNrLmNiY3B1O1xcbi1cXHRlbHNlXFxuLVxcdFxcdGNwdW1hc2sgPSBwaW5zdC1cXHUwMDNlY3B1bWFzay5wY3B1O1xcbi1cXG4tXFx0bGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsIFxcXCIlKnBiXFxcXG5cXFwiLFxcbi1cXHRcXHQgICAgICAgbnJfY3B1X2lkcywgY3B1bWFza19iaXRzKGNwdW1hc2spKTtcXG4tXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZwaW5zdC1cXHUwMDNlbG9jayk7XFxuLVxcdHJldHVybiBsZW4gXFx1MDAzYyBQQUdFX1NJWkUgPyBsZW4gOiAtRUlOVkFMO1xcbi19XFxuLVxcbi1zdGF0aWMgc3NpemVfdCBzdG9yZV9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LFxcbi1cXHRcXHRcXHQgICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsXFxuLVxcdFxcdFxcdCAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpXFxuLXtcXG4tXFx0Y3B1bWFza192YXJfdCBuZXdfY3B1bWFzaztcXG4tXFx0c3NpemVfdCByZXQ7XFxuLVxcdGludCBtYXNrX3R5cGU7XFxuLVxcbi1cXHRpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKFxcdTAwMjZuZXdfY3B1bWFzaywgR0ZQX0tFUk5FTCkpXFxuLVxcdFxcdHJldHVybiAtRU5PTUVNO1xcbi1cXG4tXFx0cmV0ID0gYml0bWFwX3BhcnNlKGJ1ZiwgY291bnQsIGNwdW1hc2tfYml0cyhuZXdfY3B1bWFzayksXFxuLVxcdFxcdFxcdCAgIG5yX2NwdW1hc2tfYml0cyk7XFxuLVxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFxuLVxcdG1hc2tfdHlwZSA9ICFzdHJjbXAoYXR0ci1cXHUwMDNlbmFtZSwgXFxcInNlcmlhbF9jcHVtYXNrXFxcIikgP1xcbi1cXHRcXHRQQURBVEFfQ1BVX1NFUklBTCA6IFBBREFUQV9DUFVfUEFSQUxMRUw7XFxuLVxcdHJldCA9IHBhZGF0YV9zZXRfY3B1bWFzayhwaW5zdCwgbWFza190eXBlLCBuZXdfY3B1bWFzayk7XFxuLVxcdGlmICghcmV0KVxcbi1cXHRcXHRyZXQgPSBjb3VudDtcXG4tXFxuLW91dDpcXG4tXFx0ZnJlZV9jcHVtYXNrX3ZhcihuZXdfY3B1bWFzayk7XFxuLVxcdHJldHVybiByZXQ7XFxuLX1cXG4tXFxuLSNkZWZpbmUgUEFEQVRBX0FUVFJfUlcoX25hbWUsIF9zaG93X25hbWUsIF9zdG9yZV9uYW1lKVxcdFxcdFxcXFxcXG4tXFx0c3RhdGljIGNvbnN0IHN0cnVjdCBwYWRhdGFfc3lzZnNfZW50cnkgX25hbWUjI19hdHRyID1cXHRcXFxcXFxuLVxcdFxcdF9fQVRUUihfbmFtZSwgMDY0NCwgX3Nob3dfbmFtZSwgX3N0b3JlX25hbWUpXFxuLSNkZWZpbmUgUEFEQVRBX0FUVFJfUk8oX25hbWUsIF9zaG93X25hbWUpXFx0XFx0XFx0XFxcXFxcbi1cXHRzdGF0aWMgY29uc3Qgc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSBfbmFtZSMjX2F0dHIgPVxcdFxcXFxcXG4tXFx0XFx0X19BVFRSKF9uYW1lLCAwNDAwLCBfc2hvd19uYW1lLCBOVUxMKVxcbi1cXG4tUEFEQVRBX0FUVFJfUlcoc2VyaWFsX2NwdW1hc2ssIHNob3dfY3B1bWFzaywgc3RvcmVfY3B1bWFzayk7XFxuLVBBREFUQV9BVFRSX1JXKHBhcmFsbGVsX2NwdW1hc2ssIHNob3dfY3B1bWFzaywgc3RvcmVfY3B1bWFzayk7XFxuLVxcbi0vKlxcbi0gKiBQYWRhdGEgc3lzZnMgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBvYmplY3RzOlxcbi0gKiBzZXJpYWxfY3B1bWFzayAgIFtSV10gLSBjcHVtYXNrIGZvciBzZXJpYWwgd29ya2Vyc1xcbi0gKiBwYXJhbGxlbF9jcHVtYXNrIFtSV10gLSBjcHVtYXNrIGZvciBwYXJhbGxlbCB3b3JrZXJzXFxuLSAqL1xcbi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqY29uc3QgcGFkYXRhX2RlZmF1bHRfYXR0cnNbXSA9IHtcXG4tXFx0XFx1MDAyNnNlcmlhbF9jcHVtYXNrX2F0dHIuYXR0cixcXG4tXFx0XFx1MDAyNnBhcmFsbGVsX2NwdW1hc2tfYXR0ci5hdHRyLFxcbi1cXHROVUxMLFxcbi19O1xcbi1BVFRSSUJVVEVfR1JPVVBTKHBhZGF0YV9kZWZhdWx0KTtcXG4tXFxuLXN0YXRpYyBzc2l6ZV90IHBhZGF0YV9zeXNmc19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLFxcbi1cXHRcXHRcXHRcXHQgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVxcbi17XFxuLVxcdGNvbnN0IHN0cnVjdCBwYWRhdGFfc3lzZnNfZW50cnkgKnBlbnRyeTtcXG4tXFx0c3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3Q7XFxuLVxcdHNzaXplX3QgcmV0ID0gLUVJTztcXG4tXFxuLVxcdHBpbnN0ID0ga29iajJwaW5zdChrb2JqKTtcXG4tXFx0cGVudHJ5ID0gYXR0cjJwZW50cnkoYXR0cik7XFxuLVxcdGlmIChwZW50cnktXFx1MDAzZXNob3cpXFxuLVxcdFxcdHJldCA9IHBlbnRyeS1cXHUwMDNlc2hvdyhwaW5zdCwgYXR0ciwgYnVmKTtcXG4tXFxuLVxcdHJldHVybiByZXQ7XFxuLX1cXG4tXFxuLXN0YXRpYyBzc2l6ZV90IHBhZGF0YV9zeXNmc19zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cixcXG4tXFx0XFx0XFx0XFx0ICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudClcXG4te1xcbi1cXHRjb25zdCBzdHJ1Y3QgcGFkYXRhX3N5c2ZzX2VudHJ5ICpwZW50cnk7XFxuLVxcdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0O1xcbi1cXHRzc2l6ZV90IHJldCA9IC1FSU87XFxuLVxcbi1cXHRwaW5zdCA9IGtvYmoycGluc3Qoa29iaik7XFxuLVxcdHBlbnRyeSA9IGF0dHIycGVudHJ5KGF0dHIpO1xcbi1cXHRpZiAocGVudHJ5LVxcdTAwM2VzdG9yZSlcXG4tXFx0XFx0cmV0ID0gcGVudHJ5LVxcdTAwM2VzdG9yZShwaW5zdCwgYXR0ciwgYnVmLCBjb3VudCk7XFxuLVxcbi1cXHRyZXR1cm4gcmV0O1xcbi19XFxuLVxcbi1zdGF0aWMgY29uc3Qgc3RydWN0IHN5c2ZzX29wcyBwYWRhdGFfc3lzZnNfb3BzID0ge1xcbi1cXHQuc2hvdyA9IHBhZGF0YV9zeXNmc19zaG93LFxcbi1cXHQuc3RvcmUgPSBwYWRhdGFfc3lzZnNfc3RvcmUsXFxuLX07XFxuLVxcbi1zdGF0aWMgY29uc3Qgc3RydWN0IGtvYmpfdHlwZSBwYWRhdGFfYXR0cl90eXBlID0ge1xcbi1cXHQuc3lzZnNfb3BzID0gXFx1MDAyNnBhZGF0YV9zeXNmc19vcHMsXFxuLVxcdC5kZWZhdWx0X2dyb3VwcyA9IHBhZGF0YV9kZWZhdWx0X2dyb3VwcyxcXG4tXFx0LnJlbGVhc2UgPSBwYWRhdGFfc3lzZnNfcmVsZWFzZSxcXG4tfTtcXG4tXFxuLS8qKlxcbi0gKiBwYWRhdGFfYWxsb2MgLSBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIHBhZGF0YSBpbnN0YW5jZVxcbi0gKiBAbmFtZTogdXNlZCB0byBpZGVudGlmeSB0aGUgaW5zdGFuY2VcXG4tICpcXG4tICogUmV0dXJuOiBuZXcgaW5zdGFuY2Ugb24gc3VjY2VzcywgTlVMTCBvbiBlcnJvclxcbi0gKi9cXG4tc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGFkYXRhX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpXFxuLXtcXG4tXFx0c3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3Q7XFxuLVxcbi1cXHRwaW5zdCA9IGt6YWxsb2Nfb2JqKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UpO1xcbi1cXHRpZiAoIXBpbnN0KVxcbi1cXHRcXHRnb3RvIGVycjtcXG4tXFxuLVxcdHBpbnN0LVxcdTAwM2VwYXJhbGxlbF93cSA9IGFsbG9jX3dvcmtxdWV1ZShcXFwiJXNfcGFyYWxsZWxcXFwiLCBXUV9VTkJPVU5ELCAwLFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgIG5hbWUpO1xcbi1cXHRpZiAoIXBpbnN0LVxcdTAwM2VwYXJhbGxlbF93cSlcXG4tXFx0XFx0Z290byBlcnJfZnJlZV9pbnN0O1xcbi1cXG4tXFx0Y3B1c19yZWFkX2xvY2soKTtcXG4tXFxuLVxcdHBpbnN0LVxcdTAwM2VzZXJpYWxfd3EgPSBhbGxvY193b3JrcXVldWUoXFxcIiVzX3NlcmlhbFxcXCIsXFxuLVxcdFxcdFxcdFxcdFxcdCAgIFdRX01FTV9SRUNMQUlNIHwgV1FfQ1BVX0lOVEVOU0lWRSB8IFdRX1BFUkNQVSxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgMSwgbmFtZSk7XFxuLVxcdGlmICghcGluc3QtXFx1MDAzZXNlcmlhbF93cSlcXG4tXFx0XFx0Z290byBlcnJfcHV0X2NwdXM7XFxuLVxcbi1cXHRpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKFxcdTAwMjZwaW5zdC1cXHUwMDNlY3B1bWFzay5wY3B1LCBHRlBfS0VSTkVMKSlcXG4tXFx0XFx0Z290byBlcnJfZnJlZV9zZXJpYWxfd3E7XFxuLVxcdGlmICghYWxsb2NfY3B1bWFza192YXIoXFx1MDAyNnBpbnN0LVxcdTAwM2VjcHVtYXNrLmNiY3B1LCBHRlBfS0VSTkVMKSlcXG4tXFx0XFx0Z290byBlcnJfZnJlZV9wX21hc2s7XFxuLVxcdGlmICghYWxsb2NfY3B1bWFza192YXIoXFx1MDAyNnBpbnN0LVxcdTAwM2V2YWxpZGF0ZV9jcHVtYXNrLCBHRlBfS0VSTkVMKSlcXG4tXFx0XFx0Z290byBlcnJfZnJlZV9jYl9tYXNrO1xcbi1cXG4tXFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNnBpbnN0LVxcdTAwM2Vwc2xpc3QpO1xcbi1cXG4tXFx0Y3B1bWFza19jb3B5KHBpbnN0LVxcdTAwM2VjcHVtYXNrLnBjcHUsIGNwdV9wb3NzaWJsZV9tYXNrKTtcXG4tXFx0Y3B1bWFza19jb3B5KHBpbnN0LVxcdTAwM2VjcHVtYXNrLmNiY3B1LCBjcHVfcG9zc2libGVfbWFzayk7XFxuLVxcbi1cXHRpZiAocGFkYXRhX3NldHVwX2NwdW1hc2tzKHBpbnN0KSlcXG4tXFx0XFx0Z290byBlcnJfZnJlZV92X21hc2s7XFxuLVxcbi1cXHRfX3BhZGF0YV9zdGFydChwaW5zdCk7XFxuLVxcbi1cXHRrb2JqZWN0X2luaXQoXFx1MDAyNnBpbnN0LVxcdTAwM2Vrb2JqLCBcXHUwMDI2cGFkYXRhX2F0dHJfdHlwZSk7XFxuLVxcdG11dGV4X2luaXQoXFx1MDAyNnBpbnN0LVxcdTAwM2Vsb2NrKTtcXG4tXFxuLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFVcXG4tXFx0Y3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlX25vY2FsbHNfY3B1c2xvY2tlZChocF9vbmxpbmUsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdCAgICBcXHUwMDI2cGluc3QtXFx1MDAzZWNwdWhwX25vZGUpO1xcbi0jZW5kaWZcXG4tXFxuLVxcdGNwdXNfcmVhZF91bmxvY2soKTtcXG4tXFxuLVxcdHJldHVybiBwaW5zdDtcXG4tXFxuLWVycl9mcmVlX3ZfbWFzazpcXG4tXFx0ZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC1cXHUwMDNldmFsaWRhdGVfY3B1bWFzayk7XFxuLWVycl9mcmVlX2NiX21hc2s6XFxuLVxcdGZyZWVfY3B1bWFza192YXIocGluc3QtXFx1MDAzZWNwdW1hc2suY2JjcHUpO1xcbi1lcnJfZnJlZV9wX21hc2s6XFxuLVxcdGZyZWVfY3B1bWFza192YXIocGluc3QtXFx1MDAzZWNwdW1hc2sucGNwdSk7XFxuLWVycl9mcmVlX3NlcmlhbF93cTpcXG4tXFx0ZGVzdHJveV93b3JrcXVldWUocGluc3QtXFx1MDAzZXNlcmlhbF93cSk7XFxuLWVycl9wdXRfY3B1czpcXG4tXFx0Y3B1c19yZWFkX3VubG9jaygpO1xcbi1cXHRkZXN0cm95X3dvcmtxdWV1ZShwaW5zdC1cXHUwMDNlcGFyYWxsZWxfd3EpO1xcbi1lcnJfZnJlZV9pbnN0Olxcbi1cXHRrZnJlZShwaW5zdCk7XFxuLWVycjpcXG4tXFx0cmV0dXJuIE5VTEw7XFxuLX1cXG4tRVhQT1JUX1NZTUJPTChwYWRhdGFfYWxsb2MpO1xcbi1cXG4tLyoqXFxuLSAqIHBhZGF0YV9mcmVlIC0gZnJlZSBhIHBhZGF0YSBpbnN0YW5jZVxcbi0gKlxcbi0gKiBAcGluc3Q6IHBhZGF0YSBpbnN0YW5jZSB0byBmcmVlXFxuLSAqL1xcbi12b2lkIHBhZGF0YV9mcmVlKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KVxcbi17XFxuLVxcdGtvYmplY3RfcHV0KFxcdTAwMjZwaW5zdC1cXHUwMDNla29iaik7XFxuLX1cXG4tRVhQT1JUX1NZTUJPTChwYWRhdGFfZnJlZSk7XFxuLVxcbi0vKipcXG4tICogcGFkYXRhX2FsbG9jX3NoZWxsIC0gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcGFkYXRhIHNoZWxsLlxcbi0gKlxcbi0gKiBAcGluc3Q6IFBhcmVudCBwYWRhdGFfaW5zdGFuY2Ugb2JqZWN0Llxcbi0gKlxcbi0gKiBSZXR1cm46IG5ldyBzaGVsbCBvbiBzdWNjZXNzLCBOVUxMIG9uIGVycm9yXFxuLSAqL1xcbi1zdHJ1Y3QgcGFkYXRhX3NoZWxsICpwYWRhdGFfYWxsb2Nfc2hlbGwoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpXFxuLXtcXG4tXFx0c3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkO1xcbi1cXHRzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcztcXG4tXFxuLVxcdHBzID0ga3phbGxvY19vYmooKnBzKTtcXG4tXFx0aWYgKCFwcylcXG4tXFx0XFx0Z290byBvdXQ7XFxuLVxcbi1cXHRwcy1cXHUwMDNlcGluc3QgPSBwaW5zdDtcXG4tXFxuLVxcdGNwdXNfcmVhZF9sb2NrKCk7XFxuLVxcdHBkID0gcGFkYXRhX2FsbG9jX3BkKHBzLCAtMSk7XFxuLVxcdGNwdXNfcmVhZF91bmxvY2soKTtcXG4tXFxuLVxcdGlmICghcGQpXFxuLVxcdFxcdGdvdG8gb3V0X2ZyZWVfcHM7XFxuLVxcbi1cXHRtdXRleF9sb2NrKFxcdTAwMjZwaW5zdC1cXHUwMDNlbG9jayk7XFxuLVxcdFJDVV9JTklUX1BPSU5URVIocHMtXFx1MDAzZXBkLCBwZCk7XFxuLVxcdGxpc3RfYWRkKFxcdTAwMjZwcy1cXHUwMDNlbGlzdCwgXFx1MDAyNnBpbnN0LVxcdTAwM2Vwc2xpc3QpO1xcbi1cXHRtdXRleF91bmxvY2soXFx1MDAyNnBpbnN0LVxcdTAwM2Vsb2NrKTtcXG4tXFxuLVxcdHJldHVybiBwcztcXG4tXFxuLW91dF9mcmVlX3BzOlxcbi1cXHRrZnJlZShwcyk7XFxuLW91dDpcXG4tXFx0cmV0dXJuIE5VTEw7XFxuLX1cXG4tRVhQT1JUX1NZTUJPTChwYWRhdGFfYWxsb2Nfc2hlbGwpO1xcbi1cXG4tLyoqXFxuLSAqIHBhZGF0YV9mcmVlX3NoZWxsIC0gZnJlZSBhIHBhZGF0YSBzaGVsbFxcbi0gKlxcbi0gKiBAcHM6IHBhZGF0YSBzaGVsbCB0byBmcmVlXFxuLSAqL1xcbi12b2lkIHBhZGF0YV9mcmVlX3NoZWxsKHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzKVxcbi17XFxuLVxcdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDtcXG4tXFxuLVxcdGlmICghcHMpXFxuLVxcdFxcdHJldHVybjtcXG4tXFxuLVxcdG11dGV4X2xvY2soXFx1MDAyNnBzLVxcdTAwM2VwaW5zdC1cXHUwMDNlbG9jayk7XFxuLVxcdGxpc3RfZGVsKFxcdTAwMjZwcy1cXHUwMDNlbGlzdCk7XFxuLVxcdHBkID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChwcy1cXHUwMDNlcGQsIDEpO1xcbi1cXHRwYWRhdGFfcHV0X3BkKHBkKTtcXG4tXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZwcy1cXHUwMDNlcGluc3QtXFx1MDAzZWxvY2spO1xcbi1cXG4tXFx0a2ZyZWUocHMpO1xcbi19XFxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX2ZyZWVfc2hlbGwpO1xcbi1cXG4gdm9pZCBfX2luaXQgcGFkYXRhX2luaXQodm9pZClcXG4ge1xcbiBcXHR1bnNpZ25lZCBpbnQgaSwgcG9zc2libGVfY3B1cztcXG4tI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVVxcbi1cXHRpbnQgcmV0O1xcbi1cXG4tXFx0cmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkoQ1BVSFBfQVBfT05MSU5FX0RZTiwgXFxcInBhZGF0YTpvbmxpbmVcXFwiLFxcbi1cXHRcXHRcXHRcXHQgICAgICBwYWRhdGFfY3B1X29ubGluZSwgcGFkYXRhX2NwdV9vZmZsaW5lKTtcXG4tXFx0aWYgKHJldCBcXHUwMDNjIDApXFxuLVxcdFxcdGdvdG8gZXJyO1xcbi1cXHRocF9vbmxpbmUgPSByZXQ7XFxuLSNlbmRpZlxcbiBcXG4gXFx0cG9zc2libGVfY3B1cyA9IG51bV9wb3NzaWJsZV9jcHVzKCk7XFxuIFxcdHBhZGF0YV93b3JrcyA9IGttYWxsb2Nfb2JqcyhzdHJ1Y3QgcGFkYXRhX3dvcmssIHBvc3NpYmxlX2NwdXMpO1xcbi1cXHRpZiAoIXBhZGF0YV93b3JrcylcXG4tXFx0XFx0Z290byByZW1vdmVfb25saW5lX3N0YXRlO1xcbitcXHRpZiAoIXBhZGF0YV93b3Jrcykge1xcbitcXHRcXHRwcl93YXJuKFxcXCJwYWRhdGE6IGluaXRpYWxpemF0aW9uIGZhaWxlZFxcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbiBcXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHBvc3NpYmxlX2NwdXM7ICsraSlcXG4gXFx0XFx0bGlzdF9hZGQoXFx1MDAyNnBhZGF0YV93b3Jrc1tpXS5wd19saXN0LCBcXHUwMDI2cGFkYXRhX2ZyZWVfd29ya3MpO1xcbi1cXG4tXFx0cmV0dXJuO1xcbi1cXG4tcmVtb3ZlX29ubGluZV9zdGF0ZTpcXG4tI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVVxcbi1cXHRjcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUoaHBfb25saW5lKTtcXG4tZXJyOlxcbi0jZW5kaWZcXG4tXFx0cHJfd2FybihcXFwicGFkYXRhOiBpbml0aWFsaXphdGlvbiBmYWlsZWRcXFxcblxcXCIpO1xcbiB9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2NyeXB0by90Y3J5cHQvdGNyeXB0X3NwZWVkX2NvbXBhcmUucHkgYi90b29scy9jcnlwdG8vdGNyeXB0L3RjcnlwdF9zcGVlZF9jb21wYXJlLnB5XFxuaW5kZXggZjNmNTc4M2NkYzA2NmIuLjBiZjM4YzA3M2RiYzAzIDEwMDc1NVxcbi0tLSBhL3Rvb2xzL2NyeXB0by90Y3J5cHQvdGNyeXB0X3NwZWVkX2NvbXBhcmUucHlcXG4rKysgYi90b29scy9jcnlwdG8vdGNyeXB0L3RjcnlwdF9zcGVlZF9jb21wYXJlLnB5XFxuQEAgLTI4LDE5ICsyOCwxNiBAQCBudW1fbWI9OFxcbiBtb2RlPTIxMVxcbiBcXG4gIyBiYXNlIHNwZWVkIHRlc3RcXG4tbHNtb2QgfCBncmVwIHBjcnlwdCBcXHUwMDI2XFx1MDAyNiBtb2Rwcm9iZSAtciBwY3J5cHRcXG4gZG1lc2cgLUNcXG4tbW9kcHJvYmUgdGNyeXB0IGFsZz1cXFwicGNyeXB0KHJmYzQxMDYoZ2NtKGFlcykpKVxcXCIgdHlwZT0zXFxuK21vZHByb2JlIHRjcnlwdCBhbGc9XFxcInJmYzQxMDYoZ2NtKGFlcykpXFxcIiB0eXBlPTNcXG4gbW9kcHJvYmUgdGNyeXB0IG1vZGU9JHttb2RlfSBzZWM9JHtzZWN9IG51bV9tYj0ke251bV9tYn1cXG4gZG1lc2cgXFx1MDAzZSAke3NlcV9udW19X2Jhc2VfZG1lc2cubG9nXFxuIFxcbiAjIG5ldyBzcGVlZCB0ZXN0XFxuLWxzbW9kIHwgZ3JlcCBwY3J5cHQgXFx1MDAyNlxcdTAwMjYgbW9kcHJvYmUgLXIgcGNyeXB0XFxuIGRtZXNnIC1DXFxuLW1vZHByb2JlIHRjcnlwdCBhbGc9XFxcInBjcnlwdChyZmM0MTA2KGdjbShhZXMpKSlcXFwiIHR5cGU9M1xcbittb2Rwcm9iZSB0Y3J5cHQgYWxnPVxcXCJyZmM0MTA2KGdjbShhZXMpKVxcXCIgdHlwZT0zXFxuIG1vZHByb2JlIHRjcnlwdCBtb2RlPSR7bW9kZX0gc2VjPSR7c2VjfSBudW1fbWI9JHtudW1fbWJ9XFxuIGRtZXNnIFxcdTAwM2UgJHtzZXFfbnVtfV9uZXdfZG1lc2cubG9nXFxuLWxzbW9kIHwgZ3JlcCBwY3J5cHQgXFx1MDAyNlxcdTAwMjYgbW9kcHJvYmUgLXIgcGNyeXB0XFxuIFxcbiB0b29scy9jcnlwdG8vdGNyeXB0L3RjcnlwdF9zcGVlZF9jb21wYXJlLnB5IFxcXFxcXG4gICAgICR7c2VxX251bX1fYmFzZV9kbWVzZy5sb2cgXFxcXFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNFQwMzozNToxNS41MTcwMTMyMTdaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEyNjczMDg2MjU1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZW1vdmVzIHRoZSBwY3J5cHQgcGFyYWxsZWwgY3J5cHRvIGVuZ2luZSBhbmQgdGhlIGFzc29jaWF0ZWQgc2VyaWFsaXplZCBqb2Igc3VwcG9ydCBmcm9tIHBhZGF0YS4gSXQgaXMgYSBwdXJlIGNsZWFudXAvcmVtb3ZhbCBwYXRjaCBhbmQgZG9lcyBub3QgaW50cm9kdWNlIGFueSBuZXcgZnVuY3Rpb25hbCBjb2RlIG9yIGxvZ2ljIHRoYXQgcmVxdWlyZXMgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXRcbiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSxcbiAgIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgY2MzOTRjYzljZTFkY2NjNDE1YmM4ZmM2NWZlNjU2N2FhOGM3NTM0NFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgSnVsIDE0IDAzOjM1OjEyIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9wYWRhdGEucnN0IGIvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9wYWRhdGEucnN0XG5pbmRleCAwNWI3M2M2YzEwNWYwNC4uZDdkYzdlMzMwNTRkYmQgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL3BhZGF0YS5yc3RcbisrKyBiL0RvY3VtZW50YXRpb24vY29yZS1hcGkvcGFkYXRhLnJzdFxuQEAgLTcsMTUyICs3LDExIEBAIFRoZSBwYWRhdGEgcGFyYWxsZWwgZXhlY3V0aW9uIG1lY2hhbmlzbVxuIDpEYXRlOiBNYXkgMjAyMFxuIFxuIFBhZGF0YSBpcyBhIG1lY2hhbmlzbSBieSB3aGljaCB0aGUga2VybmVsIGNhbiBmYXJtIGpvYnMgb3V0IHRvIGJlIGRvbmUgaW5cbi1wYXJhbGxlbCBvbiBtdWx0aXBsZSBDUFVzIHdoaWxlIG9wdGlvbmFsbHkgcmV0YWluaW5nIHRoZWlyIG9yZGVyaW5nLlxuK3BhcmFsbGVsIG9uIG11bHRpcGxlIENQVXMgd2hpbGUgY29vcmRpbmF0aW5nIGJldHdlZW4gdGhyZWFkcy5cbiBcbi1JdCB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQgZm9yIElQc2VjLCB3aGljaCBuZWVkcyB0byBwZXJmb3JtIGVuY3J5cHRpb24gYW5kXG4tZGVjcnlwdGlvbiBvbiBsYXJnZSBudW1iZXJzIG9mIHBhY2tldHMgd2l0aG91dCByZW9yZGVyaW5nIHRob3NlIHBhY2tldHMuICBUaGlzXG4taXMgY3VycmVudGx5IHRoZSBzb2xlIGNvbnN1bWVyIG9mIHBhZGF0YSdzIHNlcmlhbGl6ZWQgam9iIHN1cHBvcnQuXG4tXG4tUGFkYXRhIGFsc28gc3VwcG9ydHMgbXVsdGl0aHJlYWRlZCBqb2JzLCBzcGxpdHRpbmcgdXAgdGhlIGpvYiBldmVubHkgd2hpbGUgbG9hZFxuK1BhZGF0YSBzdXBwb3J0cyBtdWx0aXRocmVhZGVkIGpvYnMsIHNwbGl0dGluZyB1cCB0aGUgam9iIGV2ZW5seSB3aGlsZSBsb2FkXG4gYmFsYW5jaW5nIGFuZCBjb29yZGluYXRpbmcgYmV0d2VlbiB0aHJlYWRzLlxuIFxuLVJ1bm5pbmcgU2VyaWFsaXplZCBKb2JzXG4tPT09PT09PT09PT09PT09PT09PT09PT1cbi1cbi1Jbml0aWFsaXppbmdcbi0tLS0tLS0tLS0tLS1cbi1cbi1UaGUgZmlyc3Qgc3RlcCBpbiB1c2luZyBwYWRhdGEgdG8gcnVuIHNlcmlhbGl6ZWQgam9icyBpcyB0byBzZXQgdXAgYVxuLXBhZGF0YV9pbnN0YW5jZSBzdHJ1Y3R1cmUgZm9yIG92ZXJhbGwgY29udHJvbCBvZiBob3cgam9icyBhcmUgdG8gYmUgcnVuOjpcbi1cbi0gICAgI2luY2x1ZGUgXHUwMDNjbGludXgvcGFkYXRhLmhcdTAwM2Vcbi1cbi0gICAgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGFkYXRhX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpO1xuLVxuLSduYW1lJyBzaW1wbHkgaWRlbnRpZmllcyB0aGUgaW5zdGFuY2UuXG4tXG4tVGhlbiwgY29tcGxldGUgcGFkYXRhIGluaXRpYWxpemF0aW9uIGJ5IGFsbG9jYXRpbmcgYSBwYWRhdGFfc2hlbGw6OlxuLVxuLSAgIHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBhZGF0YV9hbGxvY19zaGVsbChzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCk7XG4tXG4tQSBwYWRhdGFfc2hlbGwgaXMgdXNlZCB0byBzdWJtaXQgYSBqb2IgdG8gcGFkYXRhIGFuZCBhbGxvd3MgYSBzZXJpZXMgb2Ygc3VjaFxuLWpvYnMgdG8gYmUgc2VyaWFsaXplZCBpbmRlcGVuZGVudGx5LiAgQSBwYWRhdGFfaW5zdGFuY2UgbWF5IGhhdmUgb25lIG9yIG1vcmVcbi1wYWRhdGFfc2hlbGxzIGFzc29jaWF0ZWQgd2l0aCBpdCwgZWFjaCBhbGxvd2luZyBhIHNlcGFyYXRlIHNlcmllcyBvZiBqb2JzLlxuLVxuLU1vZGlmeWluZyBjcHVtYXNrc1xuLS0tLS0tLS0tLS0tLS0tLS0tLVxuLVxuLVRoZSBDUFVzIHVzZWQgdG8gcnVuIGpvYnMgY2FuIGJlIGNoYW5nZWQgaW4gdHdvIHdheXMsIHByb2dyYW1tYXRpY2FsbHkgd2l0aFxuLXBhZGF0YV9zZXRfY3B1bWFzaygpIG9yIHZpYSBzeXNmcy4gIFRoZSBmb3JtZXIgaXMgZGVmaW5lZDo6XG4tXG4tICAgIGludCBwYWRhdGFfc2V0X2NwdW1hc2soc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsIGludCBjcHVtYXNrX3R5cGUsXG4tXHRcdFx0ICAgY3B1bWFza192YXJfdCBjcHVtYXNrKTtcbi1cbi1IZXJlIGNwdW1hc2tfdHlwZSBpcyBvbmUgb2YgUEFEQVRBX0NQVV9QQVJBTExFTCBvciBQQURBVEFfQ1BVX1NFUklBTCwgd2hlcmUgYVxuLXBhcmFsbGVsIGNwdW1hc2sgZGVzY3JpYmVzIHdoaWNoIHByb2Nlc3NvcnMgd2lsbCBiZSB1c2VkIHRvIGV4ZWN1dGUgam9ic1xuLXN1Ym1pdHRlZCB0byB0aGlzIGluc3RhbmNlIGluIHBhcmFsbGVsIGFuZCBhIHNlcmlhbCBjcHVtYXNrIGRlZmluZXMgd2hpY2hcbi1wcm9jZXNzb3JzIGFyZSBhbGxvd2VkIHRvIGJlIHVzZWQgYXMgdGhlIHNlcmlhbGl6YXRpb24gY2FsbGJhY2sgcHJvY2Vzc29yLlxuLWNwdW1hc2sgc3BlY2lmaWVzIHRoZSBuZXcgY3B1bWFzayB0byB1c2UuXG4tXG4tVGhlcmUgbWF5IGJlIHN5c2ZzIGZpbGVzIGZvciBhbiBpbnN0YW5jZSdzIGNwdW1hc2tzLiAgRm9yIGV4YW1wbGUsIHBjcnlwdCdzXG4tbGl2ZSBpbiAvc3lzL2tlcm5lbC9wY3J5cHQvXHUwMDNjaW5zdGFuY2UtbmFtZVx1MDAzZS4gIFdpdGhpbiBhbiBpbnN0YW5jZSdzIGRpcmVjdG9yeVxuLXRoZXJlIGFyZSB0d28gZmlsZXMsIHBhcmFsbGVsX2NwdW1hc2sgYW5kIHNlcmlhbF9jcHVtYXNrLCBhbmQgZWl0aGVyIGNwdW1hc2tcbi1tYXkgYmUgY2hhbmdlZCBieSBlY2hvaW5nIGEgYml0bWFzayBpbnRvIHRoZSBmaWxlLCBmb3IgZXhhbXBsZTo6XG4tXG4tICAgIGVjaG8gZiBcdTAwM2UgL3N5cy9rZXJuZWwvcGNyeXB0L3BlbmNyeXB0L3BhcmFsbGVsX2NwdW1hc2tcbi1cbi1SZWFkaW5nIG9uZSBvZiB0aGVzZSBmaWxlcyBzaG93cyB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrLCB3aGljaCBtYXkgYmVcbi1kaWZmZXJlbnQgZnJvbSB0aGUgJ3VzYWJsZScgY3B1bWFzay5cbi1cbi1QYWRhdGEgbWFpbnRhaW5zIHR3byBwYWlycyBvZiBjcHVtYXNrcyBpbnRlcm5hbGx5LCB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrc1xuLWFuZCB0aGUgJ3VzYWJsZScgY3B1bWFza3MuICAoRWFjaCBwYWlyIGNvbnNpc3RzIG9mIGEgcGFyYWxsZWwgYW5kIGEgc2VyaWFsXG4tY3B1bWFzay4pICBUaGUgdXNlci1zdXBwbGllZCBjcHVtYXNrcyBkZWZhdWx0IHRvIGFsbCBwb3NzaWJsZSBDUFVzIG9uIGluc3RhbmNlXG4tYWxsb2NhdGlvbiBhbmQgbWF5IGJlIGNoYW5nZWQgYXMgYWJvdmUuICBUaGUgdXNhYmxlIGNwdW1hc2tzIGFyZSBhbHdheXMgYVxuLXN1YnNldCBvZiB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrcyBhbmQgY29udGFpbiBvbmx5IHRoZSBvbmxpbmUgQ1BVcyBpbiB0aGVcbi11c2VyLXN1cHBsaWVkIG1hc2tzOyB0aGVzZSBhcmUgdGhlIGNwdW1hc2tzIHBhZGF0YSBhY3R1YWxseSB1c2VzLiAgU28gaXQgaXNcbi1sZWdhbCB0byBzdXBwbHkgYSBjcHVtYXNrIHRvIHBhZGF0YSB0aGF0IGNvbnRhaW5zIG9mZmxpbmUgQ1BVcy4gIE9uY2UgYW5cbi1vZmZsaW5lIENQVSBpbiB0aGUgdXNlci1zdXBwbGllZCBjcHVtYXNrIGNvbWVzIG9ubGluZSwgcGFkYXRhIGlzIGdvaW5nIHRvIHVzZVxuLWl0LlxuLVxuLUNoYW5naW5nIHRoZSBDUFUgbWFza3MgYXJlIGV4cGVuc2l2ZSBvcGVyYXRpb25zLCBzbyBpdCBzaG91bGQgbm90IGJlIGRvbmUgd2l0aFxuLWdyZWF0IGZyZXF1ZW5jeS5cbi1cbi1SdW5uaW5nIEEgSm9iXG4tLS0tLS0tLS0tLS0tLVxuLVxuLUFjdHVhbGx5IHN1Ym1pdHRpbmcgd29yayB0byB0aGUgcGFkYXRhIGluc3RhbmNlIHJlcXVpcmVzIHRoZSBjcmVhdGlvbiBvZiBhXG4tcGFkYXRhX3ByaXYgc3RydWN0dXJlLCB3aGljaCByZXByZXNlbnRzIG9uZSBqb2I6OlxuLVxuLSAgICBzdHJ1Y3QgcGFkYXRhX3ByaXYge1xuLSAgICAgICAgLyogT3RoZXIgc3R1ZmYgaGVyZS4uLiAqL1xuLVx0dm9pZCAgICAgICAgICAgICAgICAgICAgKCpwYXJhbGxlbCkoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpO1xuLVx0dm9pZCAgICAgICAgICAgICAgICAgICAgKCpzZXJpYWwpKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTtcbi0gICAgfTtcbi1cbi1UaGlzIHN0cnVjdHVyZSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgZW1iZWRkZWQgd2l0aGluIHNvbWUgbGFyZ2VyXG4tc3RydWN0dXJlIHNwZWNpZmljIHRvIHRoZSB3b3JrIHRvIGJlIGRvbmUuICBNb3N0IG9mIGl0cyBmaWVsZHMgYXJlIHByaXZhdGUgdG9cbi1wYWRhdGEsIGJ1dCB0aGUgc3RydWN0dXJlIHNob3VsZCBiZSB6ZXJvZWQgYXQgaW5pdGlhbGlzYXRpb24gdGltZSwgYW5kIHRoZVxuLXBhcmFsbGVsKCkgYW5kIHNlcmlhbCgpIGZ1bmN0aW9ucyBzaG91bGQgYmUgcHJvdmlkZWQuICBUaG9zZSBmdW5jdGlvbnMgd2lsbFxuLWJlIGNhbGxlZCBpbiB0aGUgcHJvY2VzcyBvZiBnZXR0aW5nIHRoZSB3b3JrIGRvbmUgYXMgd2Ugd2lsbCBzZWVcbi1tb21lbnRhcmlseS5cbi1cbi1UaGUgc3VibWlzc2lvbiBvZiB0aGUgam9iIGlzIGRvbmUgd2l0aDo6XG4tXG4tICAgIGludCBwYWRhdGFfZG9fcGFyYWxsZWwoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsXG4tXHRcdCAgICAgICAgICAgc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEsIGludCAqY2JfY3B1KTtcbi1cbi1UaGUgcHMgYW5kIHBhZGF0YSBzdHJ1Y3R1cmVzIG11c3QgYmUgc2V0IHVwIGFzIGRlc2NyaWJlZCBhYm92ZTsgY2JfY3B1XG4tcG9pbnRzIHRvIHRoZSBwcmVmZXJyZWQgQ1BVIHRvIGJlIHVzZWQgZm9yIHRoZSBmaW5hbCBjYWxsYmFjayB3aGVuIHRoZSBqb2IgaXNcbi1kb25lOyBpdCBtdXN0IGJlIGluIHRoZSBjdXJyZW50IGluc3RhbmNlJ3MgQ1BVIG1hc2sgKGlmIG5vdCB0aGUgY2JfY3B1IHBvaW50ZXJcbi1pcyB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBDUFUgYWN0dWFsbHkgY2hvc2VuKS4gIFRoZSByZXR1cm4gdmFsdWUgZnJvbVxuLXBhZGF0YV9kb19wYXJhbGxlbCgpIGlzIHplcm8gb24gc3VjY2VzcywgaW5kaWNhdGluZyB0aGF0IHRoZSBqb2IgaXMgaW5cbi1wcm9ncmVzcy4gLUVCVVNZIG1lYW5zIHRoYXQgc29tZWJvZHksIHNvbWV3aGVyZSBlbHNlIGlzIG1lc3Npbmcgd2l0aCB0aGVcbi1pbnN0YW5jZSdzIENQVSBtYXNrLCB3aGlsZSAtRUlOVkFMIGlzIGEgY29tcGxhaW50IGFib3V0IGNiX2NwdSBub3QgYmVpbmcgaW4gdGhlXG4tc2VyaWFsIGNwdW1hc2ssIG5vIG9ubGluZSBDUFVzIGluIHRoZSBwYXJhbGxlbCBvciBzZXJpYWwgY3B1bWFza3MsIG9yIGEgc3RvcHBlZFxuLWluc3RhbmNlLlxuLVxuLUVhY2ggam9iIHN1Ym1pdHRlZCB0byBwYWRhdGFfZG9fcGFyYWxsZWwoKSB3aWxsLCBpbiB0dXJuLCBiZSBwYXNzZWQgdG9cbi1leGFjdGx5IG9uZSBjYWxsIHRvIHRoZSBhYm92ZS1tZW50aW9uZWQgcGFyYWxsZWwoKSBmdW5jdGlvbiwgb24gb25lIENQVSwgc29cbi10cnVlIHBhcmFsbGVsaXNtIGlzIGFjaGlldmVkIGJ5IHN1Ym1pdHRpbmcgbXVsdGlwbGUgam9icy4gIHBhcmFsbGVsKCkgcnVucyB3aXRoXG4tc29mdHdhcmUgaW50ZXJydXB0cyBkaXNhYmxlZCBhbmQgdGh1cyBjYW5ub3Qgc2xlZXAuICBUaGUgcGFyYWxsZWwoKVxuLWZ1bmN0aW9uIGdldHMgdGhlIHBhZGF0YV9wcml2IHN0cnVjdHVyZSBwb2ludGVyIGFzIGl0cyBsb25lIHBhcmFtZXRlcjtcbi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgYWN0dWFsIHdvcmsgdG8gYmUgZG9uZSBpcyBwcm9iYWJseSBvYnRhaW5lZCBieSB1c2luZ1xuLWNvbnRhaW5lcl9vZigpIHRvIGZpbmQgdGhlIGVuY2xvc2luZyBzdHJ1Y3R1cmUuXG4tXG4tTm90ZSB0aGF0IHBhcmFsbGVsKCkgaGFzIG5vIHJldHVybiB2YWx1ZTsgdGhlIHBhZGF0YSBzdWJzeXN0ZW0gYXNzdW1lcyB0aGF0XG4tcGFyYWxsZWwoKSB3aWxsIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBqb2IgZnJvbSB0aGlzIHBvaW50LiAgVGhlIGpvYlxuLW5lZWQgbm90IGJlIGNvbXBsZXRlZCBkdXJpbmcgdGhpcyBjYWxsLCBidXQsIGlmIHBhcmFsbGVsKCkgbGVhdmVzIHdvcmtcbi1vdXRzdGFuZGluZywgaXQgc2hvdWxkIGJlIHByZXBhcmVkIHRvIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIGEgbmV3IGpvYiBiZWZvcmVcbi10aGUgcHJldmlvdXMgb25lIGNvbXBsZXRlcy5cbi1cbi1TZXJpYWxpemluZyBKb2JzXG4tLS0tLS0tLS0tLS0tLS0tLVxuLVxuLVdoZW4gYSBqb2IgZG9lcyBjb21wbGV0ZSwgcGFyYWxsZWwoKSAob3Igd2hhdGV2ZXIgZnVuY3Rpb24gYWN0dWFsbHkgZmluaXNoZXNcbi10aGUgd29yaykgc2hvdWxkIGluZm9ybSBwYWRhdGEgb2YgdGhlIGZhY3Qgd2l0aCBhIGNhbGwgdG86OlxuLVxuLSAgICB2b2lkIHBhZGF0YV9kb19zZXJpYWwoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpO1xuLVxuLUF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSwgcGFkYXRhX2RvX3NlcmlhbCgpIHdpbGwgdHJpZ2dlciBhIGNhbGwgdG8gdGhlXG4tc2VyaWFsKCkgZnVuY3Rpb24gaW4gdGhlIHBhZGF0YV9wcml2IHN0cnVjdHVyZS4gIFRoYXQgY2FsbCB3aWxsIGhhcHBlbiBvblxuLXRoZSBDUFUgcmVxdWVzdGVkIGluIHRoZSBpbml0aWFsIGNhbGwgdG8gcGFkYXRhX2RvX3BhcmFsbGVsKCk7IGl0LCB0b28sIGlzXG4tcnVuIHdpdGggbG9jYWwgc29mdHdhcmUgaW50ZXJydXB0cyBkaXNhYmxlZC5cbi1Ob3RlIHRoYXQgdGhpcyBjYWxsIG1heSBiZSBkZWZlcnJlZCBmb3IgYSB3aGlsZSBzaW5jZSB0aGUgcGFkYXRhIGNvZGUgdGFrZXNcbi1wYWlucyB0byBlbnN1cmUgdGhhdCBqb2JzIGFyZSBjb21wbGV0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZVxuLXN1Ym1pdHRlZC5cbi1cbi1EZXN0cm95aW5nXG4tLS0tLS0tLS0tLVxuLVxuLUNsZWFuaW5nIHVwIGEgcGFkYXRhIGluc3RhbmNlIHByZWRpY3RhYmx5IGludm9sdmVzIGNhbGxpbmcgdGhlIHR3byBmcmVlXG4tZnVuY3Rpb25zIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgYWxsb2NhdGlvbiBpbiByZXZlcnNlOjpcbi1cbi0gICAgdm9pZCBwYWRhdGFfZnJlZV9zaGVsbChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcyk7XG4tICAgIHZvaWQgcGFkYXRhX2ZyZWUoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpO1xuLVxuLUl0IGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIGFsbCBvdXRzdGFuZGluZyBqb2JzIGFyZSBjb21wbGV0ZVxuLWJlZm9yZSBhbnkgb2YgdGhlIGFib3ZlIGFyZSBjYWxsZWQuXG4tXG4gUnVubmluZyBNdWx0aXRocmVhZGVkIEpvYnNcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuIFxuZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlNcbmluZGV4IDgwNmJkMmQ4MGQxNTM1Li4yNjBiM2JkYzc2MTQ4YyAxMDA2NDRcbi0tLSBhL01BSU5UQUlORVJTXG4rKysgYi9NQUlOVEFJTkVSU1xuQEAgLTIxMDg1LDEzICsyMTA4NSw2IEBAIEw6XHRuZXRkZXZAdmdlci5rZXJuZWwub3JnXG4gUzpcdE1haW50YWluZWRcbiBGOlx0ZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3BjbmV0MzIuY1xuIFxuLVBDUllQVCBQQVJBTExFTCBDUllQVE8gRU5HSU5FXG4tTTpcdFN0ZWZmZW4gS2xhc3NlcnQgXHUwMDNjc3RlZmZlbi5rbGFzc2VydEBzZWN1bmV0LmNvbVx1MDAzZVxuLUw6XHRsaW51eC1jcnlwdG9Admdlci5rZXJuZWwub3JnXG4tUzpcdE1haW50YWluZWRcbi1GOlx0Y3J5cHRvL3BjcnlwdC5jXG4tRjpcdGluY2x1ZGUvY3J5cHRvL3BjcnlwdC5oXG4tXG4gUERTIERTQyBWSVJUSU8gREFUQSBQQVRIIEFDQ0VMRVJBVE9SXG4gUjpcdEJyZXR0IENyZWVsZXkgXHUwMDNjYnJldHQuY3JlZWxleUBhbWQuY29tXHUwMDNlXG4gRjpcdGRyaXZlcnMvdmRwYS9wZHMvXG5kaWZmIC0tZ2l0IGEvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjMyX2RlZmNvbmZpZyBiL2FyY2gvbG9vbmdhcmNoL2NvbmZpZ3MvbG9vbmdzb24zMl9kZWZjb25maWdcbmluZGV4IDdjOGYwMTUxM2VkMjdjLi5jZjk3ZjQ0OTM1NzM2ZiAxMDA2NDRcbi0tLSBhL2FyY2gvbG9vbmdhcmNoL2NvbmZpZ3MvbG9vbmdzb24zMl9kZWZjb25maWdcbisrKyBiL2FyY2gvbG9vbmdhcmNoL2NvbmZpZ3MvbG9vbmdzb24zMl9kZWZjb25maWdcbkBAIC0xMDYzLDcgKzEwNjMsNiBAQCBDT05GSUdfU0VDVVJJVFlfWUFNQT15XG4gQ09ORklHX0RFRkFVTFRfU0VDVVJJVFlfREFDPXlcbiBDT05GSUdfQ1JZUFRPX1VTRVI9bVxuIENPTkZJR19DUllQVE9fU0VMRlRFU1RTPXlcbi1DT05GSUdfQ1JZUFRPX1BDUllQVD1tXG4gQ09ORklHX0NSWVBUT19DUllQVEQ9bVxuIENPTkZJR19DUllQVE9fQU5VQklTPW1cbiBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIPW1cbmRpZmYgLS1naXQgYS9hcmNoL2xvb25nYXJjaC9jb25maWdzL2xvb25nc29uNjRfZGVmY29uZmlnIGIvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjY0X2RlZmNvbmZpZ1xuaW5kZXggOGUzOTA2ZDNiZDcwY2EuLmQwZWNlNzkyMGYyMTU4IDEwMDY0NFxuLS0tIGEvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjY0X2RlZmNvbmZpZ1xuKysrIGIvYXJjaC9sb29uZ2FyY2gvY29uZmlncy9sb29uZ3NvbjY0X2RlZmNvbmZpZ1xuQEAgLTEwOTYsNyArMTA5Niw2IEBAIENPTkZJR19TRUNVUklUWV9ZQU1BPXlcbiBDT05GSUdfREVGQVVMVF9TRUNVUklUWV9EQUM9eVxuIENPTkZJR19DUllQVE9fVVNFUj1tXG4gQ09ORklHX0NSWVBUT19TRUxGVEVTVFM9eVxuLUNPTkZJR19DUllQVE9fUENSWVBUPW1cbiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tXG4gQ09ORklHX0NSWVBUT19BTlVCSVM9bVxuIENPTkZJR19DUllQVE9fQkxPV0ZJU0g9bVxuZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jb25maWdzL2RlYnVnX2RlZmNvbmZpZyBiL2FyY2gvczM5MC9jb25maWdzL2RlYnVnX2RlZmNvbmZpZ1xuaW5kZXggNTQ2MzdiZTg3ZmI3MzUuLjE1ZjUxY2I5MjRkYmYwIDEwMDY0NFxuLS0tIGEvYXJjaC9zMzkwL2NvbmZpZ3MvZGVidWdfZGVmY29uZmlnXG4rKysgYi9hcmNoL3MzOTAvY29uZmlncy9kZWJ1Z19kZWZjb25maWdcbkBAIC03NjUsNyArNzY1LDYgQEAgQ09ORklHX0NSWVBUT19VU0VSPW1cbiBDT05GSUdfQ1JZUFRPX1NFTEZURVNUUz15XG4gQ09ORklHX0NSWVBUT19TRUxGVEVTVFNfRlVMTD15XG4gQ09ORklHX0NSWVBUT19OVUxMPXlcbi1DT05GSUdfQ1JZUFRPX1BDUllQVD1tXG4gQ09ORklHX0NSWVBUT19DUllQVEQ9bVxuIENPTkZJR19DUllQVE9fQkVOQ0hNQVJLPW1cbiBDT05GSUdfQ1JZUFRPX0RIPW1cbmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY29uZmlncy9kZWZjb25maWcgYi9hcmNoL3MzOTAvY29uZmlncy9kZWZjb25maWdcbmluZGV4IDVmNTExNGEyNTNjZjdjLi44ODI1N2ZmM2MyYzZhYSAxMDA2NDRcbi0tLSBhL2FyY2gvczM5MC9jb25maWdzL2RlZmNvbmZpZ1xuKysrIGIvYXJjaC9zMzkwL2NvbmZpZ3MvZGVmY29uZmlnXG5AQCAtNzQ5LDcgKzc0OSw2IEBAIENPTkZJR19DUllQVE9fRklQUz15XG4gQ09ORklHX0NSWVBUT19VU0VSPW1cbiBDT05GSUdfQ1JZUFRPX1NFTEZURVNUUz15XG4gQ09ORklHX0NSWVBUT19OVUxMPXlcbi1DT05GSUdfQ1JZUFRPX1BDUllQVD1tXG4gQ09ORklHX0NSWVBUT19DUllQVEQ9bVxuIENPTkZJR19DUllQVE9fQkVOQ0hNQVJLPW1cbiBDT05GSUdfQ1JZUFRPX0RIPW1cbmRpZmYgLS1naXQgYS9jcnlwdG8vS2NvbmZpZyBiL2NyeXB0by9LY29uZmlnXG5pbmRleCBmMWUzNzIxOTUyNzMxNi4uMjI4YTdhYzlmMDYzYTIgMTAwNjQ0XG4tLS0gYS9jcnlwdG8vS2NvbmZpZ1xuKysrIGIvY3J5cHRvL0tjb25maWdcbkBAIC0yMDEsMTYgKzIwMSw2IEBAIGNvbmZpZyBDUllQVE9fTlVMTFxuIFx0aGVscFxuIFx0ICBUaGVzZSBhcmUgJ051bGwnIGFsZ29yaXRobXMsIHVzZWQgYnkgSVBzZWMsIHdoaWNoIGRvIG5vdGhpbmcuXG4gXG4tY29uZmlnIENSWVBUT19QQ1JZUFRcbi1cdHRyaXN0YXRlIFwiUGFyYWxsZWwgY3J5cHRvIGVuZ2luZVwiXG4tXHRkZXBlbmRzIG9uIFNNUFxuLVx0c2VsZWN0IFBBREFUQVxuLVx0c2VsZWN0IENSWVBUT19NQU5BR0VSXG4tXHRzZWxlY3QgQ1JZUFRPX0FFQURcbi1cdGhlbHBcbi1cdCAgVGhpcyBjb252ZXJ0cyBhbiBhcmJpdHJhcnkgY3J5cHRvIGFsZ29yaXRobSBpbnRvIGEgcGFyYWxsZWxcbi1cdCAgYWxnb3JpdGhtIHRoYXQgZXhlY3V0ZXMgaW4ga2VybmVsIHRocmVhZHMuXG4tXG4gY29uZmlnIENSWVBUT19DUllQVERcbiBcdHRyaXN0YXRlIFwiU29mdHdhcmUgYXN5bmMgY3J5cHRvIGRhZW1vblwiXG4gXHRzZWxlY3QgQ1JZUFRPX0FFQURcbmRpZmYgLS1naXQgYS9jcnlwdG8vTWFrZWZpbGUgYi9jcnlwdG8vTWFrZWZpbGVcbmluZGV4IDgzODZkNTVhOTc1NWU3Li4yZTQ4N2M5NDZlNjNkNyAxMDA2NDRcbi0tLSBhL2NyeXB0by9NYWtlZmlsZVxuKysrIGIvY3J5cHRvL01ha2VmaWxlXG5AQCAtMTIwLDcgKzEyMCw2IEBAIENGTEFHU19hZWdpczEyOC1uZW9uLWlubmVyLm8gKz0gJChhZWdpczEyOC1jZmxhZ3MteSlcbiBhZWdpczEyOC0kKENPTkZJR19DUllQVE9fQUVHSVMxMjhfU0lNRCkgKz0gYWVnaXMxMjgtbmVvbi5vIGFlZ2lzMTI4LW5lb24taW5uZXIub1xuIGVuZGlmXG4gXG4tb2JqLSQoQ09ORklHX0NSWVBUT19QQ1JZUFQpICs9IHBjcnlwdC5vXG4gb2JqLSQoQ09ORklHX0NSWVBUT19DUllQVEQpICs9IGNyeXB0ZC5vXG4gb2JqLSQoQ09ORklHX0NSWVBUT19ERVMpICs9IGRlc19nZW5lcmljLm9cbiBvYmotJChDT05GSUdfQ1JZUFRPX0JMT1dGSVNIKSArPSBibG93ZmlzaF9nZW5lcmljLm9cbmRpZmYgLS1naXQgYS9jcnlwdG8vcGNyeXB0LmMgYi9jcnlwdG8vcGNyeXB0LmNcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggOWYzNzI0NDI5ODFlNjUuLjAwMDAwMDAwMDAwMDAwXG4tLS0gYS9jcnlwdG8vcGNyeXB0LmNcbisrKyAvZGV2L251bGxcbkBAIC0xLDM5NCArMCwwIEBAXG4tLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuLS8qXG4tICogcGNyeXB0IC0gUGFyYWxsZWwgY3J5cHRvIHdyYXBwZXIuXG4tICpcbi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgc2VjdW5ldCBTZWN1cml0eSBOZXR3b3JrcyBBR1xuLSAqIENvcHlyaWdodCAoQykgMjAwOSBTdGVmZmVuIEtsYXNzZXJ0IFx1MDAzY3N0ZWZmZW4ua2xhc3NlcnRAc2VjdW5ldC5jb21cdTAwM2Vcbi0gKi9cbi1cbi0jaW5jbHVkZSBcdTAwM2NjcnlwdG8vYWxnYXBpLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NjcnlwdG8vaW50ZXJuYWwvYWVhZC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvYXRvbWljLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9lcnIuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2luaXQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgva29iamVjdC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvY3B1LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NjcnlwdG8vcGNyeXB0LmhcdTAwM2Vcbi1cbi1zdGF0aWMgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGVuY3J5cHQ7XG4tc3RhdGljIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBkZWNyeXB0O1xuLXN0YXRpYyBzdHJ1Y3Qga3NldCAgICAgICAgICAgKnBjcnlwdF9rc2V0O1xuLVxuLXN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4IHtcbi1cdHN0cnVjdCBjcnlwdG9fYWVhZF9zcGF3biBzcGF3bjtcbi1cdHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzZW5jO1xuLVx0c3RydWN0IHBhZGF0YV9zaGVsbCAqcHNkZWM7XG4tXHRhdG9taWNfdCB0Zm1fY291bnQ7XG4tfTtcbi1cbi1zdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4IHtcbi1cdHN0cnVjdCBjcnlwdG9fYWVhZCAqY2hpbGQ7XG4tXHR1bnNpZ25lZCBpbnQgY2JfY3B1O1xuLX07XG4tXG4tc3RhdGljIGlubGluZSBzdHJ1Y3QgcGNyeXB0X2luc3RhbmNlX2N0eCAqcGNyeXB0X3RmbV9pY3R4KFxuLVx0c3RydWN0IGNyeXB0b19hZWFkICp0Zm0pXG4te1xuLVx0cmV0dXJuIGFlYWRfaW5zdGFuY2VfY3R4KGFlYWRfYWxnX2luc3RhbmNlKHRmbSkpO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX3NldGtleShzdHJ1Y3QgY3J5cHRvX2FlYWQgKnBhcmVudCxcbi1cdFx0XHQgICAgICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKVxuLXtcbi1cdHN0cnVjdCBwY3J5cHRfYWVhZF9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eChwYXJlbnQpO1xuLVxuLVx0cmV0dXJuIGNyeXB0b19hZWFkX3NldGtleShjdHgtXHUwMDNlY2hpbGQsIGtleSwga2V5bGVuKTtcbi19XG4tXG4tc3RhdGljIGludCBwY3J5cHRfYWVhZF9zZXRhdXRoc2l6ZShzdHJ1Y3QgY3J5cHRvX2FlYWQgKnBhcmVudCxcbi1cdFx0XHRcdCAgIHVuc2lnbmVkIGludCBhdXRoc2l6ZSlcbi17XG4tXHRzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgocGFyZW50KTtcbi1cbi1cdHJldHVybiBjcnlwdG9fYWVhZF9zZXRhdXRoc2l6ZShjdHgtXHUwMDNlY2hpbGQsIGF1dGhzaXplKTtcbi19XG4tXG4tc3RhdGljIHZvaWQgcGNyeXB0X2FlYWRfc2VyaWFsKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKVxuLXtcbi1cdHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IHBjcnlwdF9wYWRhdGFfcmVxdWVzdChwYWRhdGEpO1xuLVx0c3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxID0gcGNyeXB0X3JlcXVlc3RfY3R4KHByZXEpO1xuLVxuLVx0YWVhZF9yZXF1ZXN0X2NvbXBsZXRlKHJlcS1cdTAwM2ViYXNlLmRhdGEsIHBhZGF0YS1cdTAwM2VpbmZvKTtcbi19XG4tXG4tc3RhdGljIHZvaWQgcGNyeXB0X2FlYWRfZG9uZSh2b2lkICpkYXRhLCBpbnQgZXJyKVxuLXtcbi1cdHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSA9IGRhdGE7XG4tXHRzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnByZXEgPSBhZWFkX3JlcXVlc3RfY3R4KHJlcSk7XG4tXHRzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSA9IHBjcnlwdF9yZXF1ZXN0X3BhZGF0YShwcmVxKTtcbi1cbi1cdGlmIChlcnIgPT0gLUVJTlBST0dSRVNTKVxuLVx0XHRyZXR1cm47XG4tXG4tXHRwYWRhdGEtXHUwMDNlaW5mbyA9IGVycjtcbi1cbi1cdHBhZGF0YV9kb19zZXJpYWwocGFkYXRhKTtcbi19XG4tXG4tc3RhdGljIHZvaWQgcGNyeXB0X2FlYWRfZW5jKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKVxuLXtcbi1cdHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcHJlcSA9IHBjcnlwdF9wYWRhdGFfcmVxdWVzdChwYWRhdGEpO1xuLVx0c3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxID0gcGNyeXB0X3JlcXVlc3RfY3R4KHByZXEpO1xuLVx0aW50IHJldDtcbi1cbi1cdHJldCA9IGNyeXB0b19hZWFkX2VuY3J5cHQocmVxKTtcbi1cbi1cdGlmIChyZXQgPT0gLUVJTlBST0dSRVNTIHx8IHJldCA9PSAtRUJVU1kpXG4tXHRcdHJldHVybjtcbi1cbi1cdHBhZGF0YS1cdTAwM2VpbmZvID0gcmV0O1xuLVx0cGFkYXRhX2RvX3NlcmlhbChwYWRhdGEpO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX2VuY3J5cHQoc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxKVxuLXtcbi1cdGludCBlcnI7XG4tXHRzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnByZXEgPSBhZWFkX3JlcXVlc3RfY3R4KHJlcSk7XG4tXHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpjcmVxID0gcGNyeXB0X3JlcXVlc3RfY3R4KHByZXEpO1xuLVx0c3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEgPSBwY3J5cHRfcmVxdWVzdF9wYWRhdGEocHJlcSk7XG4tXHRzdHJ1Y3QgY3J5cHRvX2FlYWQgKmFlYWQgPSBjcnlwdG9fYWVhZF9yZXF0Zm0ocmVxKTtcbi1cdHN0cnVjdCBwY3J5cHRfYWVhZF9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eChhZWFkKTtcbi1cdHUzMiBmbGFncyA9IGFlYWRfcmVxdWVzdF9mbGFncyhyZXEpO1xuLVx0c3RydWN0IHBjcnlwdF9pbnN0YW5jZV9jdHggKmljdHg7XG4tXG4tXHRpY3R4ID0gcGNyeXB0X3RmbV9pY3R4KGFlYWQpO1xuLVxuLVx0bWVtc2V0KHBhZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBwYWRhdGFfcHJpdikpO1xuLVxuLVx0cGFkYXRhLVx1MDAzZXBhcmFsbGVsID0gcGNyeXB0X2FlYWRfZW5jO1xuLVx0cGFkYXRhLVx1MDAzZXNlcmlhbCA9IHBjcnlwdF9hZWFkX3NlcmlhbDtcbi1cbi1cdGFlYWRfcmVxdWVzdF9zZXRfdGZtKGNyZXEsIGN0eC1cdTAwM2VjaGlsZCk7XG4tXHRhZWFkX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKGNyZXEsIGZsYWdzIFx1MDAyNiB+Q1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQLFxuLVx0XHRcdFx0ICBwY3J5cHRfYWVhZF9kb25lLCByZXEpO1xuLVx0YWVhZF9yZXF1ZXN0X3NldF9jcnlwdChjcmVxLCByZXEtXHUwMDNlc3JjLCByZXEtXHUwMDNlZHN0LFxuLVx0XHRcdCAgICAgICByZXEtXHUwMDNlY3J5cHRsZW4sIHJlcS1cdTAwM2Vpdik7XG4tXHRhZWFkX3JlcXVlc3Rfc2V0X2FkKGNyZXEsIHJlcS1cdTAwM2Vhc3NvY2xlbik7XG4tXG4tXHRlcnIgPSBwYWRhdGFfZG9fcGFyYWxsZWwoaWN0eC1cdTAwM2Vwc2VuYywgcGFkYXRhLCBcdTAwMjZjdHgtXHUwMDNlY2JfY3B1KTtcbi1cdGlmICghZXJyKVxuLVx0XHRyZXR1cm4gLUVJTlBST0dSRVNTO1xuLVx0aWYgKGVyciA9PSAtRUJVU1kpIHtcbi1cdFx0LyogdHJ5IG5vbi1wYXJhbGxlbCBtb2RlICovXG4tXHRcdGFlYWRfcmVxdWVzdF9zZXRfY2FsbGJhY2soY3JlcSwgZmxhZ3MsIHJlcS1cdTAwM2ViYXNlLmNvbXBsZXRlLFxuLVx0XHRcdFx0XHQgIHJlcS1cdTAwM2ViYXNlLmRhdGEpO1xuLVx0XHRyZXR1cm4gY3J5cHRvX2FlYWRfZW5jcnlwdChjcmVxKTtcbi1cdH1cbi1cbi1cdHJldHVybiBlcnI7XG4tfVxuLVxuLXN0YXRpYyB2b2lkIHBjcnlwdF9hZWFkX2RlYyhzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSlcbi17XG4tXHRzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnByZXEgPSBwY3J5cHRfcGFkYXRhX3JlcXVlc3QocGFkYXRhKTtcbi1cdHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSA9IHBjcnlwdF9yZXF1ZXN0X2N0eChwcmVxKTtcbi1cdGludCByZXQ7XG4tXG4tXHRyZXQgPSBjcnlwdG9fYWVhZF9kZWNyeXB0KHJlcSk7XG4tXG4tXHRpZiAocmV0ID09IC1FSU5QUk9HUkVTUyB8fCByZXQgPT0gLUVCVVNZKVxuLVx0XHRyZXR1cm47XG4tXG4tXHRwYWRhdGEtXHUwMDNlaW5mbyA9IHJldDtcbi1cdHBhZGF0YV9kb19zZXJpYWwocGFkYXRhKTtcbi19XG4tXG4tc3RhdGljIGludCBwY3J5cHRfYWVhZF9kZWNyeXB0KHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSlcbi17XG4tXHRpbnQgZXJyO1xuLVx0c3RydWN0IHBjcnlwdF9yZXF1ZXN0ICpwcmVxID0gYWVhZF9yZXF1ZXN0X2N0eChyZXEpO1xuLVx0c3RydWN0IGFlYWRfcmVxdWVzdCAqY3JlcSA9IHBjcnlwdF9yZXF1ZXN0X2N0eChwcmVxKTtcbi1cdHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhID0gcGNyeXB0X3JlcXVlc3RfcGFkYXRhKHByZXEpO1xuLVx0c3RydWN0IGNyeXB0b19hZWFkICphZWFkID0gY3J5cHRvX2FlYWRfcmVxdGZtKHJlcSk7XG4tXHRzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgoYWVhZCk7XG4tXHR1MzIgZmxhZ3MgPSBhZWFkX3JlcXVlc3RfZmxhZ3MocmVxKTtcbi1cdHN0cnVjdCBwY3J5cHRfaW5zdGFuY2VfY3R4ICppY3R4O1xuLVxuLVx0aWN0eCA9IHBjcnlwdF90Zm1faWN0eChhZWFkKTtcbi1cbi1cdG1lbXNldChwYWRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgcGFkYXRhX3ByaXYpKTtcbi1cbi1cdHBhZGF0YS1cdTAwM2VwYXJhbGxlbCA9IHBjcnlwdF9hZWFkX2RlYztcbi1cdHBhZGF0YS1cdTAwM2VzZXJpYWwgPSBwY3J5cHRfYWVhZF9zZXJpYWw7XG4tXG4tXHRhZWFkX3JlcXVlc3Rfc2V0X3RmbShjcmVxLCBjdHgtXHUwMDNlY2hpbGQpO1xuLVx0YWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhjcmVxLCBmbGFncyBcdTAwMjYgfkNSWVBUT19URk1fUkVRX01BWV9TTEVFUCxcbi1cdFx0XHRcdCAgcGNyeXB0X2FlYWRfZG9uZSwgcmVxKTtcbi1cdGFlYWRfcmVxdWVzdF9zZXRfY3J5cHQoY3JlcSwgcmVxLVx1MDAzZXNyYywgcmVxLVx1MDAzZWRzdCxcbi1cdFx0XHQgICAgICAgcmVxLVx1MDAzZWNyeXB0bGVuLCByZXEtXHUwMDNlaXYpO1xuLVx0YWVhZF9yZXF1ZXN0X3NldF9hZChjcmVxLCByZXEtXHUwMDNlYXNzb2NsZW4pO1xuLVxuLVx0ZXJyID0gcGFkYXRhX2RvX3BhcmFsbGVsKGljdHgtXHUwMDNlcHNkZWMsIHBhZGF0YSwgXHUwMDI2Y3R4LVx1MDAzZWNiX2NwdSk7XG4tXHRpZiAoIWVycilcbi1cdFx0cmV0dXJuIC1FSU5QUk9HUkVTUztcbi1cdGlmIChlcnIgPT0gLUVCVVNZKSB7XG4tXHRcdC8qIHRyeSBub24tcGFyYWxsZWwgbW9kZSAqL1xuLVx0XHRhZWFkX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKGNyZXEsIGZsYWdzLCByZXEtXHUwMDNlYmFzZS5jb21wbGV0ZSxcbi1cdFx0XHRcdFx0ICByZXEtXHUwMDNlYmFzZS5kYXRhKTtcbi1cdFx0cmV0dXJuIGNyeXB0b19hZWFkX2RlY3J5cHQoY3JlcSk7XG4tXHR9XG4tXG4tXHRyZXR1cm4gZXJyO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBjcnlwdF9hZWFkX2luaXRfdGZtKHN0cnVjdCBjcnlwdG9fYWVhZCAqdGZtKVxuLXtcbi1cdGludCBjcHVfaW5kZXg7XG4tXHRzdHJ1Y3QgYWVhZF9pbnN0YW5jZSAqaW5zdCA9IGFlYWRfYWxnX2luc3RhbmNlKHRmbSk7XG4tXHRzdHJ1Y3QgcGNyeXB0X2luc3RhbmNlX2N0eCAqaWN0eCA9IGFlYWRfaW5zdGFuY2VfY3R4KGluc3QpO1xuLVx0c3RydWN0IHBjcnlwdF9hZWFkX2N0eCAqY3R4ID0gY3J5cHRvX2FlYWRfY3R4KHRmbSk7XG4tXHRzdHJ1Y3QgY3J5cHRvX2FlYWQgKmNpcGhlcjtcbi1cbi1cdGNwdV9pbmRleCA9ICh1bnNpZ25lZCBpbnQpYXRvbWljX2luY19yZXR1cm4oXHUwMDI2aWN0eC1cdTAwM2V0Zm1fY291bnQpICVcbi1cdFx0ICAgIGNwdW1hc2tfd2VpZ2h0KGNwdV9vbmxpbmVfbWFzayk7XG4tXG4tXHRjdHgtXHUwMDNlY2JfY3B1ID0gY3B1bWFza19udGgoY3B1X2luZGV4LCBjcHVfb25saW5lX21hc2spO1xuLVx0Y2lwaGVyID0gY3J5cHRvX3NwYXduX2FlYWQoXHUwMDI2aWN0eC1cdTAwM2VzcGF3bik7XG4tXG4tXHRpZiAoSVNfRVJSKGNpcGhlcikpXG4tXHRcdHJldHVybiBQVFJfRVJSKGNpcGhlcik7XG4tXG4tXHRjdHgtXHUwMDNlY2hpbGQgPSBjaXBoZXI7XG4tXHRjcnlwdG9fYWVhZF9zZXRfcmVxc2l6ZSh0Zm0sIHNpemVvZihzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QpICtcbi1cdFx0XHRcdCAgICAgc2l6ZW9mKHN0cnVjdCBhZWFkX3JlcXVlc3QpICtcbi1cdFx0XHRcdCAgICAgY3J5cHRvX2FlYWRfcmVxc2l6ZShjaXBoZXIpKTtcbi1cbi1cdHJldHVybiAwO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBwY3J5cHRfYWVhZF9leGl0X3RmbShzdHJ1Y3QgY3J5cHRvX2FlYWQgKnRmbSlcbi17XG4tXHRzdHJ1Y3QgcGNyeXB0X2FlYWRfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgodGZtKTtcbi1cbi1cdGNyeXB0b19mcmVlX2FlYWQoY3R4LVx1MDAzZWNoaWxkKTtcbi19XG4tXG4tc3RhdGljIHZvaWQgcGNyeXB0X2ZyZWUoc3RydWN0IGFlYWRfaW5zdGFuY2UgKmluc3QpXG4te1xuLVx0c3RydWN0IHBjcnlwdF9pbnN0YW5jZV9jdHggKmN0eCA9IGFlYWRfaW5zdGFuY2VfY3R4KGluc3QpO1xuLVxuLVx0Y3J5cHRvX2Ryb3BfYWVhZChcdTAwMjZjdHgtXHUwMDNlc3Bhd24pO1xuLVx0cGFkYXRhX2ZyZWVfc2hlbGwoY3R4LVx1MDAzZXBzZGVjKTtcbi1cdHBhZGF0YV9mcmVlX3NoZWxsKGN0eC1cdTAwM2Vwc2VuYyk7XG4tXHRrZnJlZShpbnN0KTtcbi19XG4tXG4tc3RhdGljIGludCBwY3J5cHRfaW5pdF9pbnN0YW5jZShzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICppbnN0LFxuLVx0XHRcdFx0c3RydWN0IGNyeXB0b19hbGcgKmFsZylcbi17XG4tXHRpZiAoc25wcmludGYoaW5zdC1cdTAwM2VhbGcuY3JhX2RyaXZlcl9uYW1lLCBDUllQVE9fTUFYX0FMR19OQU1FLFxuLVx0XHQgICAgIFwicGNyeXB0KCVzKVwiLCBhbGctXHUwMDNlY3JhX2RyaXZlcl9uYW1lKSBcdTAwM2U9IENSWVBUT19NQVhfQUxHX05BTUUpXG4tXHRcdHJldHVybiAtRU5BTUVUT09MT05HO1xuLVxuLVx0bWVtY3B5KGluc3QtXHUwMDNlYWxnLmNyYV9uYW1lLCBhbGctXHUwMDNlY3JhX25hbWUsIENSWVBUT19NQVhfQUxHX05BTUUpO1xuLVxuLVx0aW5zdC1cdTAwM2VhbGcuY3JhX3ByaW9yaXR5ID0gYWxnLVx1MDAzZWNyYV9wcmlvcml0eSArIDEwMDtcbi1cdGluc3QtXHUwMDNlYWxnLmNyYV9ibG9ja3NpemUgPSBhbGctXHUwMDNlY3JhX2Jsb2Nrc2l6ZTtcbi1cdGluc3QtXHUwMDNlYWxnLmNyYV9hbGlnbm1hc2sgPSBhbGctXHUwMDNlY3JhX2FsaWdubWFzaztcbi1cbi1cdHJldHVybiAwO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBjcnlwdF9jcmVhdGVfYWVhZChzdHJ1Y3QgY3J5cHRvX3RlbXBsYXRlICp0bXBsLCBzdHJ1Y3QgcnRhdHRyICoqdGIsXG4tXHRcdFx0ICAgICAgc3RydWN0IGNyeXB0b19hdHRyX3R5cGUgKmFsZ3QpXG4te1xuLVx0c3RydWN0IHBjcnlwdF9pbnN0YW5jZV9jdHggKmN0eDtcbi1cdHN0cnVjdCBhZWFkX2luc3RhbmNlICppbnN0O1xuLVx0c3RydWN0IGFlYWRfYWxnICphbGc7XG4tXHR1MzIgbWFzayA9IGNyeXB0b19hbGd0X2luaGVyaXRlZF9tYXNrKGFsZ3QpO1xuLVx0aW50IGVycjtcbi1cbi1cdGluc3QgPSBremFsbG9jKHNpemVvZigqaW5zdCkgKyBzaXplb2YoKmN0eCksIEdGUF9LRVJORUwpO1xuLVx0aWYgKCFpbnN0KVxuLVx0XHRyZXR1cm4gLUVOT01FTTtcbi1cbi1cdGVyciA9IC1FTk9NRU07XG4tXG4tXHRjdHggPSBhZWFkX2luc3RhbmNlX2N0eChpbnN0KTtcbi1cdGN0eC1cdTAwM2Vwc2VuYyA9IHBhZGF0YV9hbGxvY19zaGVsbChwZW5jcnlwdCk7XG4tXHRpZiAoIWN0eC1cdTAwM2Vwc2VuYylcbi1cdFx0Z290byBlcnJfZnJlZV9pbnN0O1xuLVxuLVx0Y3R4LVx1MDAzZXBzZGVjID0gcGFkYXRhX2FsbG9jX3NoZWxsKHBkZWNyeXB0KTtcbi1cdGlmICghY3R4LVx1MDAzZXBzZGVjKVxuLVx0XHRnb3RvIGVycl9mcmVlX2luc3Q7XG4tXG4tXHRlcnIgPSBjcnlwdG9fZ3JhYl9hZWFkKFx1MDAyNmN0eC1cdTAwM2VzcGF3biwgYWVhZF9jcnlwdG9faW5zdGFuY2UoaW5zdCksXG4tXHRcdFx0ICAgICAgIGNyeXB0b19hdHRyX2FsZ19uYW1lKHRiWzFdKSwgMCwgbWFzayk7XG4tXHRpZiAoZXJyKVxuLVx0XHRnb3RvIGVycl9mcmVlX2luc3Q7XG4tXG4tXHRhbGcgPSBjcnlwdG9fc3Bhd25fYWVhZF9hbGcoXHUwMDI2Y3R4LVx1MDAzZXNwYXduKTtcbi1cdGVyciA9IHBjcnlwdF9pbml0X2luc3RhbmNlKGFlYWRfY3J5cHRvX2luc3RhbmNlKGluc3QpLCBcdTAwMjZhbGctXHUwMDNlYmFzZSk7XG4tXHRpZiAoZXJyKVxuLVx0XHRnb3RvIGVycl9mcmVlX2luc3Q7XG4tXG4tXHRpbnN0LVx1MDAzZWFsZy5iYXNlLmNyYV9mbGFncyB8PSBDUllQVE9fQUxHX0FTWU5DO1xuLVxuLVx0aW5zdC1cdTAwM2VhbGcuaXZzaXplID0gY3J5cHRvX2FlYWRfYWxnX2l2c2l6ZShhbGcpO1xuLVx0aW5zdC1cdTAwM2VhbGcubWF4YXV0aHNpemUgPSBjcnlwdG9fYWVhZF9hbGdfbWF4YXV0aHNpemUoYWxnKTtcbi1cbi1cdGluc3QtXHUwMDNlYWxnLmJhc2UuY3JhX2N0eHNpemUgPSBzaXplb2Yoc3RydWN0IHBjcnlwdF9hZWFkX2N0eCk7XG4tXG4tXHRpbnN0LVx1MDAzZWFsZy5pbml0ID0gcGNyeXB0X2FlYWRfaW5pdF90Zm07XG4tXHRpbnN0LVx1MDAzZWFsZy5leGl0ID0gcGNyeXB0X2FlYWRfZXhpdF90Zm07XG4tXG4tXHRpbnN0LVx1MDAzZWFsZy5zZXRrZXkgPSBwY3J5cHRfYWVhZF9zZXRrZXk7XG4tXHRpbnN0LVx1MDAzZWFsZy5zZXRhdXRoc2l6ZSA9IHBjcnlwdF9hZWFkX3NldGF1dGhzaXplO1xuLVx0aW5zdC1cdTAwM2VhbGcuZW5jcnlwdCA9IHBjcnlwdF9hZWFkX2VuY3J5cHQ7XG4tXHRpbnN0LVx1MDAzZWFsZy5kZWNyeXB0ID0gcGNyeXB0X2FlYWRfZGVjcnlwdDtcbi1cbi1cdGluc3QtXHUwMDNlZnJlZSA9IHBjcnlwdF9mcmVlO1xuLVxuLVx0ZXJyID0gYWVhZF9yZWdpc3Rlcl9pbnN0YW5jZSh0bXBsLCBpbnN0KTtcbi1cdGlmIChlcnIpIHtcbi1lcnJfZnJlZV9pbnN0OlxuLVx0XHRwY3J5cHRfZnJlZShpbnN0KTtcbi1cdH1cbi1cdHJldHVybiBlcnI7XG4tfVxuLVxuLXN0YXRpYyBpbnQgcGNyeXB0X2NyZWF0ZShzdHJ1Y3QgY3J5cHRvX3RlbXBsYXRlICp0bXBsLCBzdHJ1Y3QgcnRhdHRyICoqdGIpXG4te1xuLVx0c3RydWN0IGNyeXB0b19hdHRyX3R5cGUgKmFsZ3Q7XG4tXG4tXHRhbGd0ID0gY3J5cHRvX2dldF9hdHRyX3R5cGUodGIpO1xuLVx0aWYgKElTX0VSUihhbGd0KSlcbi1cdFx0cmV0dXJuIFBUUl9FUlIoYWxndCk7XG4tXG4tXHRzd2l0Y2ggKGFsZ3QtXHUwMDNldHlwZSBcdTAwMjYgYWxndC1cdTAwM2VtYXNrIFx1MDAyNiBDUllQVE9fQUxHX1RZUEVfTUFTSykge1xuLVx0Y2FzZSBDUllQVE9fQUxHX1RZUEVfQUVBRDpcbi1cdFx0cmV0dXJuIHBjcnlwdF9jcmVhdGVfYWVhZCh0bXBsLCB0YiwgYWxndCk7XG4tXHR9XG4tXG4tXHRyZXR1cm4gLUVJTlZBTDtcbi19XG4tXG4tc3RhdGljIGludCBwY3J5cHRfc3lzZnNfYWRkKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBjb25zdCBjaGFyICpuYW1lKVxuLXtcbi1cdGludCByZXQ7XG4tXG4tXHRwaW5zdC1cdTAwM2Vrb2JqLmtzZXQgPSBwY3J5cHRfa3NldDtcbi1cdHJldCA9IGtvYmplY3RfYWRkKFx1MDAyNnBpbnN0LVx1MDAzZWtvYmosIE5VTEwsIFwiJXNcIiwgbmFtZSk7XG4tXHRpZiAoIXJldClcbi1cdFx0a29iamVjdF91ZXZlbnQoXHUwMDI2cGluc3QtXHUwMDNla29iaiwgS09CSl9BREQpO1xuLVxuLVx0cmV0dXJuIHJldDtcbi19XG4tXG4tc3RhdGljIGludCBwY3J5cHRfaW5pdF9wYWRhdGEoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqKnBpbnN0LCBjb25zdCBjaGFyICpuYW1lKVxuLXtcbi1cdGludCByZXQgPSAtRU5PTUVNO1xuLVxuLVx0KnBpbnN0ID0gcGFkYXRhX2FsbG9jKG5hbWUpO1xuLVx0aWYgKCEqcGluc3QpXG4tXHRcdHJldHVybiByZXQ7XG4tXG4tXHRyZXQgPSBwY3J5cHRfc3lzZnNfYWRkKCpwaW5zdCwgbmFtZSk7XG4tXHRpZiAocmV0KVxuLVx0XHRwYWRhdGFfZnJlZSgqcGluc3QpO1xuLVxuLVx0cmV0dXJuIHJldDtcbi19XG4tXG4tc3RhdGljIHN0cnVjdCBjcnlwdG9fdGVtcGxhdGUgcGNyeXB0X3RtcGwgPSB7XG4tXHQubmFtZSA9IFwicGNyeXB0XCIsXG4tXHQuY3JlYXRlID0gcGNyeXB0X2NyZWF0ZSxcbi1cdC5tb2R1bGUgPSBUSElTX01PRFVMRSxcbi19O1xuLVxuLXN0YXRpYyBpbnQgX19pbml0IHBjcnlwdF9pbml0KHZvaWQpXG4te1xuLVx0aW50IGVyciA9IC1FTk9NRU07XG4tXG4tXHRwY3J5cHRfa3NldCA9IGtzZXRfY3JlYXRlX2FuZF9hZGQoXCJwY3J5cHRcIiwgTlVMTCwga2VybmVsX2tvYmopO1xuLVx0aWYgKCFwY3J5cHRfa3NldClcbi1cdFx0Z290byBlcnI7XG4tXG4tXHRlcnIgPSBwY3J5cHRfaW5pdF9wYWRhdGEoXHUwMDI2cGVuY3J5cHQsIFwicGVuY3J5cHRcIik7XG4tXHRpZiAoZXJyKVxuLVx0XHRnb3RvIGVycl91bnJlZ19rc2V0O1xuLVxuLVx0ZXJyID0gcGNyeXB0X2luaXRfcGFkYXRhKFx1MDAyNnBkZWNyeXB0LCBcInBkZWNyeXB0XCIpO1xuLVx0aWYgKGVycilcbi1cdFx0Z290byBlcnJfZGVpbml0X3BlbmNyeXB0O1xuLVxuLVx0cmV0dXJuIGNyeXB0b19yZWdpc3Rlcl90ZW1wbGF0ZShcdTAwMjZwY3J5cHRfdG1wbCk7XG4tXG4tZXJyX2RlaW5pdF9wZW5jcnlwdDpcbi1cdHBhZGF0YV9mcmVlKHBlbmNyeXB0KTtcbi1lcnJfdW5yZWdfa3NldDpcbi1cdGtzZXRfdW5yZWdpc3RlcihwY3J5cHRfa3NldCk7XG4tZXJyOlxuLVx0cmV0dXJuIGVycjtcbi19XG4tXG4tc3RhdGljIHZvaWQgX19leGl0IHBjcnlwdF9leGl0KHZvaWQpXG4te1xuLVx0Y3J5cHRvX3VucmVnaXN0ZXJfdGVtcGxhdGUoXHUwMDI2cGNyeXB0X3RtcGwpO1xuLVxuLVx0cGFkYXRhX2ZyZWUocGVuY3J5cHQpO1xuLVx0cGFkYXRhX2ZyZWUocGRlY3J5cHQpO1xuLVxuLVx0a3NldF91bnJlZ2lzdGVyKHBjcnlwdF9rc2V0KTtcbi19XG4tXG4tbW9kdWxlX2luaXQocGNyeXB0X2luaXQpO1xuLW1vZHVsZV9leGl0KHBjcnlwdF9leGl0KTtcbi1cbi1NT0RVTEVfTElDRU5TRShcIkdQTFwiKTtcbi1NT0RVTEVfQVVUSE9SKFwiU3RlZmZlbiBLbGFzc2VydCBcdTAwM2NzdGVmZmVuLmtsYXNzZXJ0QHNlY3VuZXQuY29tXHUwMDNlXCIpO1xuLU1PRFVMRV9ERVNDUklQVElPTihcIlBhcmFsbGVsIGNyeXB0byB3cmFwcGVyXCIpO1xuLU1PRFVMRV9BTElBU19DUllQVE8oXCJwY3J5cHRcIik7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9jcnlwdG8vcGNyeXB0LmggYi9pbmNsdWRlL2NyeXB0by9wY3J5cHQuaFxuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAyMzRkN2NmM2NmNWVhZC4uMDAwMDAwMDAwMDAwMDBcbi0tLSBhL2luY2x1ZGUvY3J5cHRvL3BjcnlwdC5oXG4rKysgL2Rldi9udWxsXG5AQCAtMSwzOSArMCwwIEBAXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuLS8qXG4tICogcGNyeXB0IC0gUGFyYWxsZWwgY3J5cHRvIGVuZ2luZS5cbi0gKlxuLSAqIENvcHlyaWdodCAoQykgMjAwOSBzZWN1bmV0IFNlY3VyaXR5IE5ldHdvcmtzIEFHXG4tICogQ29weXJpZ2h0IChDKSAyMDA5IFN0ZWZmZW4gS2xhc3NlcnQgXHUwMDNjc3RlZmZlbi5rbGFzc2VydEBzZWN1bmV0LmNvbVx1MDAzZVxuLSAqL1xuLVxuLSNpZm5kZWYgX0NSWVBUT19QQ1JZUFRfSFxuLSNkZWZpbmUgX0NSWVBUT19QQ1JZUFRfSFxuLVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2NvbnRhaW5lcl9vZi5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvY3J5cHRvLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9wYWRhdGEuaFx1MDAzZVxuLVxuLXN0cnVjdCBwY3J5cHRfcmVxdWVzdCB7XG4tXHRzdHJ1Y3QgcGFkYXRhX3ByaXZcdHBhZGF0YTtcbi1cdHZvaWRcdFx0XHQqZGF0YTtcbi1cdHZvaWRcdFx0XHQqX19jdHhbXSBDUllQVE9fTUlOQUxJR05fQVRUUjtcbi19O1xuLVxuLXN0YXRpYyBpbmxpbmUgdm9pZCAqcGNyeXB0X3JlcXVlc3RfY3R4KHN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcmVxKVxuLXtcbi1cdHJldHVybiByZXEtXHUwMDNlX19jdHg7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmVcbi1zdHJ1Y3QgcGFkYXRhX3ByaXYgKnBjcnlwdF9yZXF1ZXN0X3BhZGF0YShzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QgKnJlcSlcbi17XG4tXHRyZXR1cm4gXHUwMDI2cmVxLVx1MDAzZXBhZGF0YTtcbi19XG4tXG4tc3RhdGljIGlubGluZVxuLXN0cnVjdCBwY3J5cHRfcmVxdWVzdCAqcGNyeXB0X3BhZGF0YV9yZXF1ZXN0KHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKVxuLXtcbi1cdHJldHVybiBjb250YWluZXJfb2YocGFkYXRhLCBzdHJ1Y3QgcGNyeXB0X3JlcXVlc3QsIHBhZGF0YSk7XG4tfVxuLVxuLSNlbmRpZlxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGFkYXRhLmggYi9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oXG5pbmRleCBiNjIzMmJlYTZlZGY1OS4uZWE0NWVhNjgwY2I3OTcgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oXG5AQCAtMTIsMTEyICsxMiw4IEBAXG4gI2lmbmRlZiBQQURBVEFfSFxuICNkZWZpbmUgUEFEQVRBX0hcbiBcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9yZWZjb3VudC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvY29tcGlsZXJfdHlwZXMuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3dvcmtxdWV1ZS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc3BpbmxvY2suaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2xpc3QuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tvYmplY3QuaFx1MDAzZVxuLVxuLSNkZWZpbmUgUEFEQVRBX0NQVV9TRVJJQUwgICAweDAxXG4tI2RlZmluZSBQQURBVEFfQ1BVX1BBUkFMTEVMIDB4MDJcbi1cbi0vKipcbi0gKiBzdHJ1Y3QgcGFkYXRhX3ByaXYgLSBSZXByZXNlbnRzIG9uZSBqb2Jcbi0gKlxuLSAqIEBsaXN0OiBMaXN0IGVudHJ5LCB0byBhdHRhY2ggdG8gdGhlIHBhZGF0YSBsaXN0cy5cbi0gKiBAcGQ6IFBvaW50ZXIgdG8gdGhlIGludGVybmFsIGNvbnRyb2wgc3RydWN0dXJlLlxuLSAqIEBjYl9jcHU6IENhbGxiYWNrIGNwdSBmb3Igc2VyaWFsaXphdGlvb24uXG4tICogQHNlcV9ucjogU2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBwYXJhbGxlbGl6ZWQgZGF0YSBvYmplY3QuXG4tICogQGluZm86IFVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXJhbGxlbCB0byB0aGUgc2VyaWFsIGZ1bmN0aW9uLlxuLSAqIEBwYXJhbGxlbDogUGFyYWxsZWwgZXhlY3V0aW9uIGZ1bmN0aW9uLlxuLSAqIEBzZXJpYWw6IFNlcmlhbCBjb21wbGV0ZSBmdW5jdGlvbi5cbi0gKi9cbi1zdHJ1Y3QgcGFkYXRhX3ByaXYge1xuLVx0c3RydWN0IGxpc3RfaGVhZFx0bGlzdDtcbi1cdHN0cnVjdCBwYXJhbGxlbF9kYXRhXHQqcGQ7XG4tXHRpbnRcdFx0XHRjYl9jcHU7XG4tXHR1bnNpZ25lZCBpbnRcdFx0c2VxX25yO1xuLVx0aW50XHRcdFx0aW5mbztcbi1cdHZvaWQgICAgICAgICAgICAgICAgICAgICgqcGFyYWxsZWwpKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTtcbi1cdHZvaWQgICAgICAgICAgICAgICAgICAgICgqc2VyaWFsKShzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSk7XG4tfTtcbi1cbi0vKipcbi0gKiBzdHJ1Y3QgcGFkYXRhX2xpc3QgLSBvbmUgcGVyIHdvcmsgdHlwZSBwZXIgQ1BVXG4tICpcbi0gKiBAbGlzdDogTGlzdCBoZWFkLlxuLSAqIEBsb2NrOiBMaXN0IGxvY2suXG4tICovXG4tc3RydWN0IHBhZGF0YV9saXN0IHtcbi1cdHN0cnVjdCBsaXN0X2hlYWQgICAgICAgIGxpc3Q7XG4tXHRzcGlubG9ja190ICAgICAgICAgICAgICBsb2NrO1xuLX07XG4tXG4tLyoqXG4tKiBzdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZSAtIFRoZSBwZXJjcHUgcGFkYXRhIHNlcmlhbCBxdWV1ZVxuLSpcbi0qIEBzZXJpYWw6IExpc3QgdG8gd2FpdCBmb3Igc2VyaWFsaXphdGlvbiBhZnRlciByZW9yZGVyaW5nLlxuLSogQHdvcms6IHdvcmsgc3RydWN0IGZvciBzZXJpYWxpemF0aW9uLlxuLSogQHBkOiBCYWNrcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgY29udHJvbCBzdHJ1Y3R1cmUuXG4tKi9cbi1zdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZSB7XG4tICAgICAgIHN0cnVjdCBwYWRhdGFfbGlzdCAgICBzZXJpYWw7XG4tICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCAgICB3b3JrO1xuLSAgICAgICBzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQ7XG4tfTtcbi1cbi0vKipcbi0gKiBzdHJ1Y3QgcGFkYXRhX2NwdW1hc2sgLSBUaGUgY3B1bWFza3MgZm9yIHRoZSBwYXJhbGxlbC9zZXJpYWwgd29ya2Vyc1xuLSAqXG4tICogQHBjcHU6IGNwdW1hc2sgZm9yIHRoZSBwYXJhbGxlbCB3b3JrZXJzLlxuLSAqIEBjYmNwdTogY3B1bWFzayBmb3IgdGhlIHNlcmlhbCAoY2FsbGJhY2spIHdvcmtlcnMuXG4tICovXG4tc3RydWN0IHBhZGF0YV9jcHVtYXNrIHtcbi1cdGNwdW1hc2tfdmFyX3RcdHBjcHU7XG4tXHRjcHVtYXNrX3Zhcl90XHRjYmNwdTtcbi19O1xuLVxuLS8qKlxuLSAqIHN0cnVjdCBwYXJhbGxlbF9kYXRhIC0gSW50ZXJuYWwgY29udHJvbCBzdHJ1Y3R1cmUsIGNvdmVycyBldmVyeXRoaW5nXG4tICogdGhhdCBkZXBlbmRzIG9uIHRoZSBjcHVtYXNrIGluIHVzZS5cbi0gKlxuLSAqIEBwczogcGFkYXRhX3NoZWxsIG9iamVjdC5cbi0gKiBAcmVvcmRlcl9saXN0OiBwZXJjcHUgcmVvcmRlciBsaXN0c1xuLSAqIEBzcXVldWU6IHBlcmNwdSBwYWRhdGEgcXVldWVzIHVzZWQgZm9yIHNlcmlhbHV6YXRpb24uXG4tICogQHJlZmNudDogTnVtYmVyIG9mIG9iamVjdHMgaG9sZGluZyBhIHJlZmVyZW5jZSBvbiB0aGlzIHBhcmFsbGVsX2RhdGEuXG4tICogQHNlcV9ucjogU2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBwYXJhbGxlbGl6ZWQgZGF0YSBvYmplY3QuXG4tICogQHByb2Nlc3NlZDogTnVtYmVyIG9mIGFscmVhZHkgcHJvY2Vzc2VkIG9iamVjdHMuXG4tICogQGNwdTogTmV4dCBDUFUgdG8gYmUgcHJvY2Vzc2VkLlxuLSAqIEBjcHVtYXNrOiBUaGUgY3B1bWFza3MgaW4gdXNlIGZvciBwYXJhbGxlbCBhbmQgc2VyaWFsIHdvcmtlcnMuXG4tICovXG4tc3RydWN0IHBhcmFsbGVsX2RhdGEge1xuLVx0c3RydWN0IHBhZGF0YV9zaGVsbFx0XHQqcHM7XG4tXHRzdHJ1Y3QgcGFkYXRhX2xpc3RcdFx0X19wZXJjcHUgKnJlb3JkZXJfbGlzdDtcbi1cdHN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlXHRfX3BlcmNwdSAqc3F1ZXVlO1xuLVx0cmVmY291bnRfdFx0XHRcdHJlZmNudDtcbi1cdHVuc2lnbmVkIGludFx0XHRcdHNlcV9ucjtcbi1cdHVuc2lnbmVkIGludFx0XHRcdHByb2Nlc3NlZDtcbi1cdGludFx0XHRcdFx0Y3B1O1xuLVx0c3RydWN0IHBhZGF0YV9jcHVtYXNrXHRcdGNwdW1hc2s7XG4tfTtcbi1cbi0vKipcbi0gKiBzdHJ1Y3QgcGFkYXRhX3NoZWxsIC0gV3JhcHBlciBhcm91bmQgc3RydWN0IHBhcmFsbGVsX2RhdGEsIGl0c1xuLSAqIHB1cnBvc2UgaXMgdG8gYWxsb3cgdGhlIHVuZGVybHlpbmcgY29udHJvbCBzdHJ1Y3R1cmUgdG8gYmUgcmVwbGFjZWRcbi0gKiBvbiB0aGUgZmx5IHVzaW5nIFJDVS5cbi0gKlxuLSAqIEBwaW5zdDogcGFkYXQgaW5zdGFuY2UuXG4tICogQHBkOiBBY3R1YWwgcGFyYWxsZWxfZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggbWF5IGJlIHN1YnN0aXR1dGVkIG9uIHRoZSBmbHkuXG4tICogQG9wZDogUG9pbnRlciB0byBvbGQgcGQgdG8gYmUgZnJlZWQgYnkgcGFkYXRhX3JlcGxhY2UuXG4tICogQGxpc3Q6IExpc3QgZW50cnkgaW4gcGFkYXRhX2luc3RhbmNlIGxpc3QuXG4tICovXG4tc3RydWN0IHBhZGF0YV9zaGVsbCB7XG4tXHRzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlXHRcdCpwaW5zdDtcbi1cdHN0cnVjdCBwYXJhbGxlbF9kYXRhIF9fcmN1XHQqcGQ7XG4tXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YVx0XHQqb3BkO1xuLVx0c3RydWN0IGxpc3RfaGVhZFx0XHRsaXN0O1xuLX07XG4rI2luY2x1ZGUgXHUwMDNjbGludXgvaW5pdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvdHlwZXMuaFx1MDAzZVxuIFxuIC8qKlxuICAqIHN0cnVjdCBwYWRhdGFfbXRfam9iIC0gcmVwcmVzZW50cyBvbmUgbXVsdGl0aHJlYWRlZCBqb2JcbkBAIC0xNDYsNDYgKzQyLDkgQEAgc3RydWN0IHBhZGF0YV9tdF9qb2Ige1xuIFx0Ym9vbFx0XHRcdG51bWFfYXdhcmU7XG4gfTtcbiBcbi0vKipcbi0gKiBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlIC0gVGhlIG92ZXJhbGwgY29udHJvbCBzdHJ1Y3R1cmUuXG4tICpcbi0gKiBAY3B1aHBfbm9kZTogTGlua2FnZSBmb3IgQ1BVIGhvdHBsdWcgY2FsbGJhY2tzLlxuLSAqIEBwYXJhbGxlbF93cTogVGhlIHdvcmtxdWV1ZSB1c2VkIGZvciBwYXJhbGxlbCB3b3JrLlxuLSAqIEBzZXJpYWxfd3E6IFRoZSB3b3JrcXVldWUgdXNlZCBmb3Igc2VyaWFsIHdvcmsuXG4tICogQHBzbGlzdDogTGlzdCBvZiBwYWRhdGFfc2hlbGwgb2JqZWN0cyBhdHRhY2hlZCB0byB0aGlzIGluc3RhbmNlLlxuLSAqIEBjcHVtYXNrOiBVc2VyIHN1cHBsaWVkIGNwdW1hc2tzIGZvciBwYXJhbGxlbCBhbmQgc2VyaWFsIHdvcmtzLlxuLSAqIEB2YWxpZGF0ZV9jcHVtYXNrOiBJbnRlcm5hbCBjcHVtYXNrIHVzZWQgdG8gdmFsaWRhdGUgQGNwdW1hc2sgZHVyaW5nIGhvdHBsdWcuXG4tICogQGtvYmo6IHBhZGF0YSBpbnN0YW5jZSBrZXJuZWwgb2JqZWN0LlxuLSAqIEBsb2NrOiBwYWRhdGEgaW5zdGFuY2UgbG9jay5cbi0gKiBAZmxhZ3M6IHBhZGF0YSBmbGFncy5cbi0gKi9cbi1zdHJ1Y3QgcGFkYXRhX2luc3RhbmNlIHtcbi1cdHN0cnVjdCBobGlzdF9ub2RlXHRcdGNwdWhwX25vZGU7XG4tXHRzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdFx0XHQqcGFyYWxsZWxfd3E7XG4tXHRzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdFx0XHQqc2VyaWFsX3dxO1xuLVx0c3RydWN0IGxpc3RfaGVhZFx0XHRwc2xpc3Q7XG4tXHRzdHJ1Y3QgcGFkYXRhX2NwdW1hc2tcdFx0Y3B1bWFzaztcbi1cdGNwdW1hc2tfdmFyX3RcdFx0XHR2YWxpZGF0ZV9jcHVtYXNrO1xuLVx0c3RydWN0IGtvYmplY3QgICAgICAgICAgICAgICAgICAga29iajtcbi1cdHN0cnVjdCBtdXRleFx0XHRcdCBsb2NrO1xuLVx0dThcdFx0XHRcdCBmbGFncztcbi0jZGVmaW5lXHRQQURBVEFfSU5JVFx0MVxuLSNkZWZpbmVcdFBBREFUQV9SRVNFVFx0MlxuLSNkZWZpbmVcdFBBREFUQV9JTlZBTElEXHQ0XG4tfTtcbi1cbiAjaWZkZWYgQ09ORklHX1BBREFUQVxuIGV4dGVybiB2b2lkIF9faW5pdCBwYWRhdGFfaW5pdCh2b2lkKTtcbi1leHRlcm4gc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGFkYXRhX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpO1xuLWV4dGVybiB2b2lkIHBhZGF0YV9mcmVlKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KTtcbi1leHRlcm4gc3RydWN0IHBhZGF0YV9zaGVsbCAqcGFkYXRhX2FsbG9jX3NoZWxsKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KTtcbi1leHRlcm4gdm9pZCBwYWRhdGFfZnJlZV9zaGVsbChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcyk7XG4tZXh0ZXJuIGludCBwYWRhdGFfZG9fcGFyYWxsZWwoc3RydWN0IHBhZGF0YV9zaGVsbCAqcHMsXG4tXHRcdFx0ICAgICAgc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEsIGludCAqY2JfY3B1KTtcbi1leHRlcm4gdm9pZCBwYWRhdGFfZG9fc2VyaWFsKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKTtcbiBleHRlcm4gdm9pZCBfX2luaXQgcGFkYXRhX2RvX211bHRpdGhyZWFkZWQoc3RydWN0IHBhZGF0YV9tdF9qb2IgKmpvYik7XG4tZXh0ZXJuIGludCBwYWRhdGFfc2V0X2NwdW1hc2soc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsIGludCBjcHVtYXNrX3R5cGUsXG4tXHRcdFx0ICAgICAgY3B1bWFza192YXJfdCBjcHVtYXNrKTtcbiAjZWxzZVxuIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgcGFkYXRhX2luaXQodm9pZCkge31cbiBzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IHBhZGF0YV9kb19tdWx0aXRocmVhZGVkKHN0cnVjdCBwYWRhdGFfbXRfam9iICpqb2IpXG5kaWZmIC0tZ2l0IGEva2VybmVsL3BhZGF0YS5jIGIva2VybmVsL3BhZGF0YS5jXG5pbmRleCAwZDNlYTFiNjhiMWY3MC4uNmViMTMwZDMxMDI0YzUgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvcGFkYXRhLmNcbisrKyBiL2tlcm5lbC9wYWRhdGEuY1xuQEAgLTEsNiArMSw2IEBAXG4gLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiAvKlxuLSAqIHBhZGF0YS5jIC0gZ2VuZXJpYyBpbnRlcmZhY2UgdG8gcHJvY2VzcyBkYXRhIHN0cmVhbXMgaW4gcGFyYWxsZWxcbisgKiBwYWRhdGEuYyAtIGdlbmVyaWMgaW50ZXJmYWNlIHRvIHJ1biBtdWx0aXRocmVhZGVkIGpvYnNcbiAgKlxuICAqIFNlZSBEb2N1bWVudGF0aW9uL2NvcmUtYXBpL3BhZGF0YS5yc3QgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICpcbkBAIC0xMSwxNyArMTEsMTcgQEBcbiAgKiBBdXRob3I6IERhbmllbCBKb3JkYW4gXHUwMDNjZGFuaWVsLm0uam9yZGFuQG9yYWNsZS5jb21cdTAwM2VcbiAgKi9cbiBcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9hdG9taWMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2NvbXBsZXRpb24uaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2V4cG9ydC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvY3B1bWFzay5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvZXJyLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9jcHUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2luaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbGlzdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbm9kZW1hc2suaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhZGF0YS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbXV0ZXguaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zeXNmcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvcmN1cGRhdGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NwaW5sb2NrLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC93b3JrcXVldWUuaFx1MDAzZVxuIFxuICNkZWZpbmVcdFBBREFUQV9XT1JLX09OU1RBQ0tcdDFcdC8qIFdvcmsncyBtZW1vcnkgaXMgb24gc3RhY2sgKi9cbiBcbkBAIC00NCwzNiArNDQsOCBAQCBzdHJ1Y3QgcGFkYXRhX210X2pvYl9zdGF0ZSB7XG4gXHR1bnNpZ25lZCBsb25nXHRcdGNodW5rX3NpemU7XG4gfTtcbiBcbi1zdGF0aWMgdm9pZCBwYWRhdGFfZnJlZV9wZChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQpO1xuIHN0YXRpYyB2b2lkIF9faW5pdCBwYWRhdGFfbXRfaGVscGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7XG4gXG4tc3RhdGljIGlubGluZSB2b2lkIHBhZGF0YV9nZXRfcGQoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKVxuLXtcbi1cdHJlZmNvdW50X2luYyhcdTAwMjZwZC1cdTAwM2VyZWZjbnQpO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIHZvaWQgcGFkYXRhX3B1dF9wZF9jbnQoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkLCBpbnQgY250KVxuLXtcbi1cdGlmIChyZWZjb3VudF9zdWJfYW5kX3Rlc3QoY250LCBcdTAwMjZwZC1cdTAwM2VyZWZjbnQpKVxuLVx0XHRwYWRhdGFfZnJlZV9wZChwZCk7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmUgdm9pZCBwYWRhdGFfcHV0X3BkKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZClcbi17XG4tXHRwYWRhdGFfcHV0X3BkX2NudChwZCwgMSk7XG4tfVxuLVxuLXN0YXRpYyBpbnQgcGFkYXRhX2NwdV9oYXNoKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCwgdW5zaWduZWQgaW50IHNlcV9ucilcbi17XG4tXHQvKlxuLVx0ICogSGFzaCB0aGUgc2VxdWVuY2UgbnVtYmVycyB0byB0aGUgY3B1cyBieSB0YWtpbmdcbi1cdCAqIHNlcV9uciBtb2QuIG51bWJlciBvZiBjcHVzIGluIHVzZS5cbi1cdCAqL1xuLVx0aW50IGNwdV9pbmRleCA9IHNlcV9uciAlIGNwdW1hc2tfd2VpZ2h0KHBkLVx1MDAzZWNwdW1hc2sucGNwdSk7XG4tXG4tXHRyZXR1cm4gY3B1bWFza19udGgoY3B1X2luZGV4LCBwZC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLX1cbi1cbiBzdGF0aWMgc3RydWN0IHBhZGF0YV93b3JrICpwYWRhdGFfd29ya19hbGxvYyh2b2lkKVxuIHtcbiBcdHN0cnVjdCBwYWRhdGFfd29yayAqcHc7XG5AQCAtMTQ3LDI2MCArMTE5LDYgQEAgc3RhdGljIHZvaWQgX19pbml0IHBhZGF0YV93b3Jrc19mcmVlKHN0cnVjdCBsaXN0X2hlYWQgKndvcmtzKVxuIFx0c3Bpbl91bmxvY2tfYmgoXHUwMDI2cGFkYXRhX3dvcmtzX2xvY2spO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBwYWRhdGFfcGFyYWxsZWxfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqcGFyYWxsZWxfd29yaylcbi17XG4tXHRzdHJ1Y3QgcGFkYXRhX3dvcmsgKnB3ID0gY29udGFpbmVyX29mKHBhcmFsbGVsX3dvcmssIHN0cnVjdCBwYWRhdGFfd29yayxcbi1cdFx0XHRcdFx0ICAgICAgcHdfd29yayk7XG4tXHRzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSA9IHB3LVx1MDAzZXB3X2RhdGE7XG4tXG4tXHRsb2NhbF9iaF9kaXNhYmxlKCk7XG4tXHRwYWRhdGEtXHUwMDNlcGFyYWxsZWwocGFkYXRhKTtcbi1cdHNwaW5fbG9jayhcdTAwMjZwYWRhdGFfd29ya3NfbG9jayk7XG4tXHRwYWRhdGFfd29ya19mcmVlKHB3KTtcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnBhZGF0YV93b3Jrc19sb2NrKTtcbi1cdGxvY2FsX2JoX2VuYWJsZSgpO1xuLX1cbi1cbi0vKipcbi0gKiBwYWRhdGFfZG9fcGFyYWxsZWwgLSBwYWRhdGEgcGFyYWxsZWxpemF0aW9uIGZ1bmN0aW9uXG4tICpcbi0gKiBAcHM6IHBhZGF0YXNoZWxsXG4tICogQHBhZGF0YTogb2JqZWN0IHRvIGJlIHBhcmFsbGVsaXplZFxuLSAqIEBjYl9jcHU6IHBvaW50ZXIgdG8gdGhlIENQVSB0aGF0IHRoZSBzZXJpYWxpemF0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uIHNob3VsZFxuLSAqICAgICAgICAgIHJ1biBvbi4gIElmIGl0J3Mgbm90IGluIHRoZSBzZXJpYWwgY3B1bWFzayBvZiBAcGluc3Rcbi0gKiAgICAgICAgICAoaS5lLiBjcHVtYXNrLmNiY3B1KSwgdGhpcyBmdW5jdGlvbiBzZWxlY3RzIGEgZmFsbGJhY2sgQ1BVIGFuZCBpZlxuLSAqICAgICAgICAgIG5vbmUgZm91bmQsIHJldHVybnMgLUVJTlZBTC5cbi0gKlxuLSAqIFRoZSBwYXJhbGxlbGl6YXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBydW4gd2l0aCBCSHMgb2ZmLlxuLSAqIE5vdGU6IEV2ZXJ5IG9iamVjdCB3aGljaCBpcyBwYXJhbGxlbGl6ZWQgYnkgcGFkYXRhX2RvX3BhcmFsbGVsXG4tICogbXVzdCBiZSBzZWVuIGJ5IHBhZGF0YV9kb19zZXJpYWwuXG4tICpcbi0gKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBlbHNlIG5lZ2F0aXZlIGVycm9yIGNvZGUuXG4tICovXG4taW50IHBhZGF0YV9kb19wYXJhbGxlbChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcyxcbi1cdFx0ICAgICAgIHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhLCBpbnQgKmNiX2NwdSlcbi17XG4tXHRzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCA9IHBzLVx1MDAzZXBpbnN0O1xuLVx0c3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkO1xuLVx0c3RydWN0IHBhZGF0YV93b3JrICpwdztcbi1cdGludCBjcHVfaW5kZXgsIGVycjtcbi1cbi1cdHJjdV9yZWFkX2xvY2tfYmgoKTtcbi1cbi1cdHBkID0gcmN1X2RlcmVmZXJlbmNlX2JoKHBzLVx1MDAzZXBkKTtcbi1cbi1cdGVyciA9IC1FSU5WQUw7XG4tXHRpZiAoIShwaW5zdC1cdTAwM2VmbGFncyBcdTAwMjYgUEFEQVRBX0lOSVQpIHx8IHBpbnN0LVx1MDAzZWZsYWdzIFx1MDAyNiBQQURBVEFfSU5WQUxJRClcbi1cdFx0Z290byBvdXQ7XG4tXG4tXHRpZiAoIWNwdW1hc2tfdGVzdF9jcHUoKmNiX2NwdSwgcGQtXHUwMDNlY3B1bWFzay5jYmNwdSkpIHtcbi1cdFx0aWYgKGNwdW1hc2tfZW1wdHkocGQtXHUwMDNlY3B1bWFzay5jYmNwdSkpXG4tXHRcdFx0Z290byBvdXQ7XG4tXG4tXHRcdC8qIFNlbGVjdCBhbiBhbHRlcm5hdGUgZmFsbGJhY2sgQ1BVIGFuZCBub3RpZnkgdGhlIGNhbGxlci4gKi9cbi1cdFx0Y3B1X2luZGV4ID0gKmNiX2NwdSAlIGNwdW1hc2tfd2VpZ2h0KHBkLVx1MDAzZWNwdW1hc2suY2JjcHUpO1xuLVx0XHQqY2JfY3B1ID0gY3B1bWFza19udGgoY3B1X2luZGV4LCBwZC1cdTAwM2VjcHVtYXNrLmNiY3B1KTtcbi1cdH1cbi1cbi1cdGVyciA9IC1FQlVTWTtcbi1cdGlmICgocGluc3QtXHUwMDNlZmxhZ3MgXHUwMDI2IFBBREFUQV9SRVNFVCkpXG4tXHRcdGdvdG8gb3V0O1xuLVxuLVx0cGFkYXRhX2dldF9wZChwZCk7XG4tXHRwYWRhdGEtXHUwMDNlcGQgPSBwZDtcbi1cdHBhZGF0YS1cdTAwM2VjYl9jcHUgPSAqY2JfY3B1O1xuLVxuLVx0c3Bpbl9sb2NrKFx1MDAyNnBhZGF0YV93b3Jrc19sb2NrKTtcbi1cdHBhZGF0YS1cdTAwM2VzZXFfbnIgPSArK3BkLVx1MDAzZXNlcV9ucjtcbi1cdHB3ID0gcGFkYXRhX3dvcmtfYWxsb2MoKTtcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnBhZGF0YV93b3Jrc19sb2NrKTtcbi1cbi1cdGlmICghcHcpIHtcbi1cdFx0LyogTWF4aW11bSB3b3JrcyBsaW1pdCBleGNlZWRlZCwgcnVuIGluIHRoZSBjdXJyZW50IHRhc2suICovXG4tXHRcdHBhZGF0YS1cdTAwM2VwYXJhbGxlbChwYWRhdGEpO1xuLVx0fVxuLVxuLVx0cmN1X3JlYWRfdW5sb2NrX2JoKCk7XG4tXG4tXHRpZiAocHcpIHtcbi1cdFx0cGFkYXRhX3dvcmtfaW5pdChwdywgcGFkYXRhX3BhcmFsbGVsX3dvcmtlciwgcGFkYXRhLCAwKTtcbi1cdFx0cXVldWVfd29yayhwaW5zdC1cdTAwM2VwYXJhbGxlbF93cSwgXHUwMDI2cHctXHUwMDNlcHdfd29yayk7XG4tXHR9XG4tXG4tXHRyZXR1cm4gMDtcbi1vdXQ6XG4tXHRyY3VfcmVhZF91bmxvY2tfYmgoKTtcbi1cbi1cdHJldHVybiBlcnI7XG4tfVxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX2RvX3BhcmFsbGVsKTtcbi1cbi0vKlxuLSAqIHBhZGF0YV9maW5kX25leHQgLSBGaW5kIHRoZSBuZXh0IG9iamVjdCB0aGF0IG5lZWRzIHNlcmlhbGl6YXRpb24uXG4tICpcbi0gKiBSZXR1cm46XG4tICogKiBBIHBvaW50ZXIgdG8gdGhlIGNvbnRyb2wgc3RydWN0IG9mIHRoZSBuZXh0IG9iamVjdCB0aGF0IG5lZWRzXG4tICogICBzZXJpYWxpemF0aW9uLCBpZiBwcmVzZW50IGluIG9uZSBvZiB0aGUgcGVyY3B1IHJlb3JkZXIgcXVldWVzLlxuLSAqICogTlVMTCwgaWYgdGhlIG5leHQgb2JqZWN0IHRoYXQgbmVlZHMgc2VyaWFsaXphdGlvbiB3aWxsXG4tICogICBiZSBwYXJhbGxlbCBwcm9jZXNzZWQgYnkgYW5vdGhlciBjcHUgYW5kIGlzIG5vdCB5ZXQgcHJlc2VudCBpblxuLSAqICAgdGhlIGNwdSdzIHJlb3JkZXIgcXVldWUuXG4tICovXG4tc3RhdGljIHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhX2ZpbmRfbmV4dChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQsIGludCBjcHUsXG4tXHRcdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgcHJvY2Vzc2VkKVxuLXtcbi1cdHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhO1xuLVx0c3RydWN0IHBhZGF0YV9saXN0ICpyZW9yZGVyO1xuLVxuLVx0cmVvcmRlciA9IHBlcl9jcHVfcHRyKHBkLVx1MDAzZXJlb3JkZXJfbGlzdCwgY3B1KTtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZyZW9yZGVyLVx1MDAzZWxvY2spO1xuLVx0aWYgKGxpc3RfZW1wdHkoXHUwMDI2cmVvcmRlci1cdTAwM2VsaXN0KSlcbi1cdFx0Z290byBub3Rmb3VuZDtcbi1cbi1cdHBhZGF0YSA9IGxpc3RfZW50cnkocmVvcmRlci1cdTAwM2VsaXN0Lm5leHQsIHN0cnVjdCBwYWRhdGFfcHJpdiwgbGlzdCk7XG4tXG4tXHQvKlxuLVx0ICogQ2hlY2tzIHRoZSByYXJlIGNhc2Ugd2hlcmUgdHdvIG9yIG1vcmUgcGFyYWxsZWwgam9icyBoYXZlIGhhc2hlZCB0b1xuLVx0ICogdGhlIHNhbWUgQ1BVIGFuZCBvbmUgb2YgdGhlIGxhdGVyIG9uZXMgZmluaXNoZXMgZmlyc3QuXG4tXHQgKi9cbi1cdGlmIChwYWRhdGEtXHUwMDNlc2VxX25yICE9IHByb2Nlc3NlZClcbi1cdFx0Z290byBub3Rmb3VuZDtcbi1cbi1cdGxpc3RfZGVsX2luaXQoXHUwMDI2cGFkYXRhLVx1MDAzZWxpc3QpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2cmVvcmRlci1cdTAwM2Vsb2NrKTtcbi1cdHJldHVybiBwYWRhdGE7XG4tXG4tbm90Zm91bmQ6XG4tXHRwZC1cdTAwM2Vwcm9jZXNzZWQgPSBwcm9jZXNzZWQ7XG4tXHRwZC1cdTAwM2VjcHUgPSBjcHU7XG4tXHRzcGluX3VubG9jayhcdTAwMjZyZW9yZGVyLVx1MDAzZWxvY2spO1xuLVx0cmV0dXJuIE5VTEw7XG4tfVxuLVxuLXN0YXRpYyB2b2lkIHBhZGF0YV9yZW9yZGVyKHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhKVxuLXtcbi1cdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCA9IHBhZGF0YS1cdTAwM2VwZDtcbi1cdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0ID0gcGQtXHUwMDNlcHMtXHUwMDNlcGluc3Q7XG4tXHR1bnNpZ25lZCBpbnQgcHJvY2Vzc2VkO1xuLVx0aW50IGNwdTtcbi1cbi1cdHByb2Nlc3NlZCA9IHBkLVx1MDAzZXByb2Nlc3NlZDtcbi1cdGNwdSA9IHBkLVx1MDAzZWNwdTtcbi1cbi1cdGRvIHtcbi1cdFx0c3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUgKnNxdWV1ZTtcbi1cdFx0aW50IGNiX2NwdTtcbi1cbi1cdFx0cHJvY2Vzc2VkKys7XG4tXHRcdC8qIFdoZW4gc2VxdWVuY2Ugd3JhcHMgYXJvdW5kLCByZXNldCB0byB0aGUgZmlyc3QgQ1BVLiAqL1xuLVx0XHRpZiAodW5saWtlbHkocHJvY2Vzc2VkID09IDApKVxuLVx0XHRcdGNwdSA9IGNwdW1hc2tfZmlyc3QocGQtXHUwMDNlY3B1bWFzay5wY3B1KTtcbi1cdFx0ZWxzZVxuLVx0XHRcdGNwdSA9IGNwdW1hc2tfbmV4dF93cmFwKGNwdSwgcGQtXHUwMDNlY3B1bWFzay5wY3B1KTtcbi1cbi1cdFx0Y2JfY3B1ID0gcGFkYXRhLVx1MDAzZWNiX2NwdTtcbi1cdFx0c3F1ZXVlID0gcGVyX2NwdV9wdHIocGQtXHUwMDNlc3F1ZXVlLCBjYl9jcHUpO1xuLVxuLVx0XHRzcGluX2xvY2soXHUwMDI2c3F1ZXVlLVx1MDAzZXNlcmlhbC5sb2NrKTtcbi1cdFx0bGlzdF9hZGRfdGFpbChcdTAwMjZwYWRhdGEtXHUwMDNlbGlzdCwgXHUwMDI2c3F1ZXVlLVx1MDAzZXNlcmlhbC5saXN0KTtcbi1cdFx0cXVldWVfd29ya19vbihjYl9jcHUsIHBpbnN0LVx1MDAzZXNlcmlhbF93cSwgXHUwMDI2c3F1ZXVlLVx1MDAzZXdvcmspO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBJZiB0aGUgbmV4dCBvYmplY3QgdGhhdCBuZWVkcyBzZXJpYWxpemF0aW9uIGlzIHBhcmFsbGVsXG4tXHRcdCAqIHByb2Nlc3NlZCBieSBhbm90aGVyIGNwdSBhbmQgaXMgc3RpbGwgb24gaXQncyB3YXkgdG8gdGhlXG4tXHRcdCAqIGNwdSdzIHJlb3JkZXIgcXVldWUsIGVuZCB0aGUgbG9vcC5cbi1cdFx0ICovXG4tXHRcdHBhZGF0YSA9IHBhZGF0YV9maW5kX25leHQocGQsIGNwdSwgcHJvY2Vzc2VkKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3F1ZXVlLVx1MDAzZXNlcmlhbC5sb2NrKTtcbi1cdH0gd2hpbGUgKHBhZGF0YSk7XG4tfVxuLVxuLXN0YXRpYyB2b2lkIHBhZGF0YV9zZXJpYWxfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqc2VyaWFsX3dvcmspXG4te1xuLVx0c3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUgKnNxdWV1ZTtcbi1cdHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDtcbi1cdExJU1RfSEVBRChsb2NhbF9saXN0KTtcbi1cdGludCBjbnQ7XG4tXG4tXHRsb2NhbF9iaF9kaXNhYmxlKCk7XG4tXHRzcXVldWUgPSBjb250YWluZXJfb2Yoc2VyaWFsX3dvcmssIHN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlLCB3b3JrKTtcbi1cdHBkID0gc3F1ZXVlLVx1MDAzZXBkO1xuLVxuLVx0c3Bpbl9sb2NrKFx1MDAyNnNxdWV1ZS1cdTAwM2VzZXJpYWwubG9jayk7XG4tXHRsaXN0X3JlcGxhY2VfaW5pdChcdTAwMjZzcXVldWUtXHUwMDNlc2VyaWFsLmxpc3QsIFx1MDAyNmxvY2FsX2xpc3QpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3F1ZXVlLVx1MDAzZXNlcmlhbC5sb2NrKTtcbi1cbi1cdGNudCA9IDA7XG4tXG4tXHR3aGlsZSAoIWxpc3RfZW1wdHkoXHUwMDI2bG9jYWxfbGlzdCkpIHtcbi1cdFx0c3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGE7XG4tXG4tXHRcdHBhZGF0YSA9IGxpc3RfZW50cnkobG9jYWxfbGlzdC5uZXh0LFxuLVx0XHRcdFx0ICAgIHN0cnVjdCBwYWRhdGFfcHJpdiwgbGlzdCk7XG4tXG4tXHRcdGxpc3RfZGVsX2luaXQoXHUwMDI2cGFkYXRhLVx1MDAzZWxpc3QpO1xuLVxuLVx0XHRwYWRhdGEtXHUwMDNlc2VyaWFsKHBhZGF0YSk7XG4tXHRcdGNudCsrO1xuLVx0fVxuLVx0bG9jYWxfYmhfZW5hYmxlKCk7XG4tXG4tXHRwYWRhdGFfcHV0X3BkX2NudChwZCwgY250KTtcbi19XG4tXG4tLyoqXG4tICogcGFkYXRhX2RvX3NlcmlhbCAtIHBhZGF0YSBzZXJpYWxpemF0aW9uIGZ1bmN0aW9uXG4tICpcbi0gKiBAcGFkYXRhOiBvYmplY3QgdG8gYmUgc2VyaWFsaXplZC5cbi0gKlxuLSAqIHBhZGF0YV9kb19zZXJpYWwgbXVzdCBiZSBjYWxsZWQgZm9yIGV2ZXJ5IHBhcmFsbGVsaXplZCBvYmplY3QuXG4tICogVGhlIHNlcmlhbGl6YXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBydW4gd2l0aCBCSHMgb2ZmLlxuLSAqL1xuLXZvaWQgcGFkYXRhX2RvX3NlcmlhbChzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSlcbi17XG4tXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQgPSBwYWRhdGEtXHUwMDNlcGQ7XG4tXHRpbnQgaGFzaGVkX2NwdSA9IHBhZGF0YV9jcHVfaGFzaChwZCwgcGFkYXRhLVx1MDAzZXNlcV9ucik7XG4tXHRzdHJ1Y3QgcGFkYXRhX2xpc3QgKnJlb3JkZXIgPSBwZXJfY3B1X3B0cihwZC1cdTAwM2VyZW9yZGVyX2xpc3QsIGhhc2hlZF9jcHUpO1xuLVx0c3RydWN0IHBhZGF0YV9wcml2ICpjdXI7XG4tXHRzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7XG4tXHRib29sIGdvdGl0ID0gdHJ1ZTtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZyZW9yZGVyLVx1MDAzZWxvY2spO1xuLVx0LyogU29ydCBpbiBhc2NlbmRpbmcgb3JkZXIgb2Ygc2VxdWVuY2UgbnVtYmVyLiAqL1xuLVx0bGlzdF9mb3JfZWFjaF9wcmV2KHBvcywgXHUwMDI2cmVvcmRlci1cdTAwM2VsaXN0KSB7XG4tXHRcdGN1ciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgcGFkYXRhX3ByaXYsIGxpc3QpO1xuLVx0XHQvKiBDb21wYXJlIGJ5IGRpZmZlcmVuY2UgdG8gY29uc2lkZXIgaW50ZWdlciB3cmFwIGFyb3VuZCAqL1xuLVx0XHRpZiAoKHNpZ25lZCBpbnQpKGN1ci1cdTAwM2VzZXFfbnIgLSBwYWRhdGEtXHUwMDNlc2VxX25yKSBcdTAwM2MgMClcbi1cdFx0XHRicmVhaztcbi1cdH1cbi1cdGlmIChwYWRhdGEtXHUwMDNlc2VxX25yICE9IHBkLVx1MDAzZXByb2Nlc3NlZCkge1xuLVx0XHRnb3RpdCA9IGZhbHNlO1xuLVx0XHRsaXN0X2FkZChcdTAwMjZwYWRhdGEtXHUwMDNlbGlzdCwgcG9zKTtcbi1cdH1cbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnJlb3JkZXItXHUwMDNlbG9jayk7XG4tXG4tXHRpZiAoZ290aXQpXG4tXHRcdHBhZGF0YV9yZW9yZGVyKHBhZGF0YSk7XG4tfVxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX2RvX3NlcmlhbCk7XG4tXG4tc3RhdGljIGludCBwYWRhdGFfc2V0dXBfY3B1bWFza3Moc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpXG4te1xuLVx0c3RydWN0IHdvcmtxdWV1ZV9hdHRycyAqYXR0cnM7XG4tXHRpbnQgZXJyO1xuLVxuLVx0YXR0cnMgPSBhbGxvY193b3JrcXVldWVfYXR0cnMoKTtcbi1cdGlmICghYXR0cnMpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuLVxuLVx0LyogUmVzdHJpY3QgcGFyYWxsZWxfd3Egd29ya2VycyB0byBwZC1cdTAwM2VjcHVtYXNrLnBjcHUuICovXG4tXHRjcHVtYXNrX2NvcHkoYXR0cnMtXHUwMDNlY3B1bWFzaywgcGluc3QtXHUwMDNlY3B1bWFzay5wY3B1KTtcbi1cdGVyciA9IGFwcGx5X3dvcmtxdWV1ZV9hdHRycyhwaW5zdC1cdTAwM2VwYXJhbGxlbF93cSwgYXR0cnMpO1xuLVx0ZnJlZV93b3JrcXVldWVfYXR0cnMoYXR0cnMpO1xuLVxuLVx0cmV0dXJuIGVycjtcbi19XG4tXG4gc3RhdGljIHZvaWQgX19pbml0IHBhZGF0YV9tdF9oZWxwZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3KVxuIHtcbiBcdHN0cnVjdCBwYWRhdGFfd29yayAqcHcgPSBjb250YWluZXJfb2Yodywgc3RydWN0IHBhZGF0YV93b3JrLCBwd193b3JrKTtcbkBAIC01MDYsNjEzICsyMjQsMTcgQEAgdm9pZCBfX2luaXQgcGFkYXRhX2RvX211bHRpdGhyZWFkZWQoc3RydWN0IHBhZGF0YV9tdF9qb2IgKmpvYilcbiBcdHBhZGF0YV93b3Jrc19mcmVlKFx1MDAyNndvcmtzKTtcbiB9XG4gXG4tLyogSW5pdGlhbGl6ZSBhbGwgcGVyY3B1IHF1ZXVlcyB1c2VkIGJ5IHNlcmlhbCB3b3JrZXJzICovXG4tc3RhdGljIHZvaWQgcGFkYXRhX2luaXRfc3F1ZXVlcyhzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQpXG4te1xuLVx0aW50IGNwdTtcbi1cdHN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlICpzcXVldWU7XG4tXG4tXHRmb3JfZWFjaF9jcHUoY3B1LCBwZC1cdTAwM2VjcHVtYXNrLmNiY3B1KSB7XG4tXHRcdHNxdWV1ZSA9IHBlcl9jcHVfcHRyKHBkLVx1MDAzZXNxdWV1ZSwgY3B1KTtcbi1cdFx0c3F1ZXVlLVx1MDAzZXBkID0gcGQ7XG4tXHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNnNxdWV1ZS1cdTAwM2VzZXJpYWwubGlzdCk7XG4tXHRcdHNwaW5fbG9ja19pbml0KFx1MDAyNnNxdWV1ZS1cdTAwM2VzZXJpYWwubG9jayk7XG4tXHRcdElOSVRfV09SSyhcdTAwMjZzcXVldWUtXHUwMDNld29yaywgcGFkYXRhX3NlcmlhbF93b3JrZXIpO1xuLVx0fVxuLX1cbi1cbi0vKiBJbml0aWFsaXplIHBlci1DUFUgcmVvcmRlciBsaXN0cyAqL1xuLXN0YXRpYyB2b2lkIHBhZGF0YV9pbml0X3Jlb3JkZXJfbGlzdChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQpXG4te1xuLVx0aW50IGNwdTtcbi1cdHN0cnVjdCBwYWRhdGFfbGlzdCAqbGlzdDtcbi1cbi1cdGZvcl9lYWNoX2NwdShjcHUsIHBkLVx1MDAzZWNwdW1hc2sucGNwdSkge1xuLVx0XHRsaXN0ID0gcGVyX2NwdV9wdHIocGQtXHUwMDNlcmVvcmRlcl9saXN0LCBjcHUpO1xuLVx0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZsaXN0LVx1MDAzZWxpc3QpO1xuLVx0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZsaXN0LVx1MDAzZWxvY2spO1xuLVx0fVxuLX1cbi1cbi0vKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgY3B1bWFzayBkZXBlbmRlbmQgcmVzb3VyY2VzLiAqL1xuLXN0YXRpYyBzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGFkYXRhX2FsbG9jX3BkKHN0cnVjdCBwYWRhdGFfc2hlbGwgKnBzLFxuLVx0XHRcdFx0XHQgICAgIGludCBvZmZsaW5pbmdfY3B1KVxuLXtcbi1cdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0ID0gcHMtXHUwMDNlcGluc3Q7XG4tXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQ7XG4tXG4tXHRwZCA9IGt6YWxsb2Nfb2JqKHN0cnVjdCBwYXJhbGxlbF9kYXRhKTtcbi1cdGlmICghcGQpXG4tXHRcdGdvdG8gZXJyO1xuLVxuLVx0cGQtXHUwMDNlcmVvcmRlcl9saXN0ID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBwYWRhdGFfbGlzdCk7XG4tXHRpZiAoIXBkLVx1MDAzZXJlb3JkZXJfbGlzdClcbi1cdFx0Z290byBlcnJfZnJlZV9wZDtcbi1cbi1cdHBkLVx1MDAzZXNxdWV1ZSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZSk7XG4tXHRpZiAoIXBkLVx1MDAzZXNxdWV1ZSlcbi1cdFx0Z290byBlcnJfZnJlZV9yZW9yZGVyX2xpc3Q7XG4tXG4tXHRwZC1cdTAwM2VwcyA9IHBzO1xuLVxuLVx0aWYgKCFhbGxvY19jcHVtYXNrX3ZhcihcdTAwMjZwZC1cdTAwM2VjcHVtYXNrLnBjcHUsIEdGUF9LRVJORUwpKVxuLVx0XHRnb3RvIGVycl9mcmVlX3NxdWV1ZTtcbi1cdGlmICghYWxsb2NfY3B1bWFza192YXIoXHUwMDI2cGQtXHUwMDNlY3B1bWFzay5jYmNwdSwgR0ZQX0tFUk5FTCkpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfcGNwdTtcbi1cbi1cdGNwdW1hc2tfYW5kKHBkLVx1MDAzZWNwdW1hc2sucGNwdSwgcGluc3QtXHUwMDNlY3B1bWFzay5wY3B1LCBjcHVfb25saW5lX21hc2spO1xuLVx0Y3B1bWFza19hbmQocGQtXHUwMDNlY3B1bWFzay5jYmNwdSwgcGluc3QtXHUwMDNlY3B1bWFzay5jYmNwdSwgY3B1X29ubGluZV9tYXNrKTtcbi1cdGlmIChvZmZsaW5pbmdfY3B1IFx1MDAzZT0gMCkge1xuLVx0XHRfX2NwdW1hc2tfY2xlYXJfY3B1KG9mZmxpbmluZ19jcHUsIHBkLVx1MDAzZWNwdW1hc2sucGNwdSk7XG4tXHRcdF9fY3B1bWFza19jbGVhcl9jcHUob2ZmbGluaW5nX2NwdSwgcGQtXHUwMDNlY3B1bWFzay5jYmNwdSk7XG4tXHR9XG4tXG4tXHRwYWRhdGFfaW5pdF9yZW9yZGVyX2xpc3QocGQpO1xuLVx0cGFkYXRhX2luaXRfc3F1ZXVlcyhwZCk7XG4tXHRwZC1cdTAwM2VzZXFfbnIgPSAtMTtcbi1cdHJlZmNvdW50X3NldChcdTAwMjZwZC1cdTAwM2VyZWZjbnQsIDEpO1xuLVx0cGQtXHUwMDNlY3B1ID0gY3B1bWFza19maXJzdChwZC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLVxuLVx0cmV0dXJuIHBkO1xuLVxuLWVycl9mcmVlX3BjcHU6XG4tXHRmcmVlX2NwdW1hc2tfdmFyKHBkLVx1MDAzZWNwdW1hc2sucGNwdSk7XG4tZXJyX2ZyZWVfc3F1ZXVlOlxuLVx0ZnJlZV9wZXJjcHUocGQtXHUwMDNlc3F1ZXVlKTtcbi1lcnJfZnJlZV9yZW9yZGVyX2xpc3Q6XG4tXHRmcmVlX3BlcmNwdShwZC1cdTAwM2VyZW9yZGVyX2xpc3QpO1xuLWVycl9mcmVlX3BkOlxuLVx0a2ZyZWUocGQpO1xuLWVycjpcbi1cdHJldHVybiBOVUxMO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBwYWRhdGFfZnJlZV9wZChzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQpXG4te1xuLVx0ZnJlZV9jcHVtYXNrX3ZhcihwZC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLVx0ZnJlZV9jcHVtYXNrX3ZhcihwZC1cdTAwM2VjcHVtYXNrLmNiY3B1KTtcbi1cdGZyZWVfcGVyY3B1KHBkLVx1MDAzZXJlb3JkZXJfbGlzdCk7XG4tXHRmcmVlX3BlcmNwdShwZC1cdTAwM2VzcXVldWUpO1xuLVx0a2ZyZWUocGQpO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBfX3BhZGF0YV9zdGFydChzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdClcbi17XG4tXHRwaW5zdC1cdTAwM2VmbGFncyB8PSBQQURBVEFfSU5JVDtcbi19XG4tXG4tc3RhdGljIHZvaWQgX19wYWRhdGFfc3RvcChzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdClcbi17XG4tXHRpZiAoIShwaW5zdC1cdTAwM2VmbGFncyBcdTAwMjYgUEFEQVRBX0lOSVQpKVxuLVx0XHRyZXR1cm47XG4tXG4tXHRwaW5zdC1cdTAwM2VmbGFncyBcdTAwMjY9IH5QQURBVEFfSU5JVDtcbi1cbi1cdHN5bmNocm9uaXplX3JjdSgpO1xuLX1cbi1cbi0vKiBSZXBsYWNlIHRoZSBpbnRlcm5hbCBjb250cm9sIHN0cnVjdHVyZSB3aXRoIGEgbmV3IG9uZS4gKi9cbi1zdGF0aWMgaW50IHBhZGF0YV9yZXBsYWNlX29uZShzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcywgaW50IG9mZmxpbmluZ19jcHUpXG4te1xuLVx0c3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkX25ldztcbi1cbi1cdHBkX25ldyA9IHBhZGF0YV9hbGxvY19wZChwcywgb2ZmbGluaW5nX2NwdSk7XG4tXHRpZiAoIXBkX25ldylcbi1cdFx0cmV0dXJuIC1FTk9NRU07XG4tXG4tXHRwcy1cdTAwM2VvcGQgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHBzLVx1MDAzZXBkLCAxKTtcbi1cdHJjdV9hc3NpZ25fcG9pbnRlcihwcy1cdTAwM2VwZCwgcGRfbmV3KTtcbi1cbi1cdHJldHVybiAwO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBhZGF0YV9yZXBsYWNlKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgb2ZmbGluaW5nX2NwdSlcbi17XG4tXHRzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcztcbi1cdGludCBlcnIgPSAwO1xuLVxuLVx0cGluc3QtXHUwMDNlZmxhZ3MgfD0gUEFEQVRBX1JFU0VUO1xuLVxuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShwcywgXHUwMDI2cGluc3QtXHUwMDNlcHNsaXN0LCBsaXN0KSB7XG4tXHRcdGVyciA9IHBhZGF0YV9yZXBsYWNlX29uZShwcywgb2ZmbGluaW5nX2NwdSk7XG4tXHRcdGlmIChlcnIpXG4tXHRcdFx0YnJlYWs7XG4tXHR9XG4tXG4tXHRzeW5jaHJvbml6ZV9yY3UoKTtcbi1cbi1cdGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWVfcmV2ZXJzZShwcywgXHUwMDI2cGluc3QtXHUwMDNlcHNsaXN0LCBsaXN0KVxuLVx0XHRwYWRhdGFfcHV0X3BkKHBzLVx1MDAzZW9wZCk7XG4tXG4tXHRwaW5zdC1cdTAwM2VmbGFncyBcdTAwMjY9IH5QQURBVEFfUkVTRVQ7XG4tXG4tXHRyZXR1cm4gZXJyO1xuLX1cbi1cbi0vKiBJZiBjcHVtYXNrIGNvbnRhaW5zIG5vIGFjdGl2ZSBjcHUsIHdlIG1hcmsgdGhlIGluc3RhbmNlIGFzIGludmFsaWQuICovXG4tc3RhdGljIGJvb2wgcGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2soc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsXG4tXHRcdFx0XHQgICAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2ssXG4tXHRcdFx0XHQgICAgaW50IG9mZmxpbmluZ19jcHUpXG4te1xuLVx0Y3B1bWFza19jb3B5KHBpbnN0LVx1MDAzZXZhbGlkYXRlX2NwdW1hc2ssIGNwdV9vbmxpbmVfbWFzayk7XG4tXG4tXHQvKlxuLVx0ICogQG9mZmxpbmluZ19jcHUgaXMgc3RpbGwgaW4gY3B1X29ubGluZV9tYXNrLCBzbyByZW1vdmUgaXQgaGVyZSBmb3Jcbi1cdCAqIHZhbGlkYXRpb24uICBVc2luZyBhIHN1Yi1DUFVIUF9URUFSRE9XTl9DUFUgaG90cGx1ZyBzdGF0ZSB3aGVyZVxuLVx0ICogQG9mZmxpbmluZ19jcHUgd291bGRuJ3QgYmUgaW4gdGhlIG9ubGluZSBtYXNrIGRvZXNuJ3Qgd29yayBiZWNhdXNlXG4tXHQgKiBwYWRhdGFfY3B1X29mZmxpbmUoKSBjYW4gZmFpbCBidXQgc3VjaCBhIHN0YXRlIGRvZXNuJ3QgYWxsb3cgZmFpbHVyZS5cbi1cdCAqL1xuLVx0aWYgKG9mZmxpbmluZ19jcHUgXHUwMDNlPSAwKVxuLVx0XHRfX2NwdW1hc2tfY2xlYXJfY3B1KG9mZmxpbmluZ19jcHUsIHBpbnN0LVx1MDAzZXZhbGlkYXRlX2NwdW1hc2spO1xuLVxuLVx0aWYgKCFjcHVtYXNrX2ludGVyc2VjdHMoY3B1bWFzaywgcGluc3QtXHUwMDNldmFsaWRhdGVfY3B1bWFzaykpIHtcbi1cdFx0cGluc3QtXHUwMDNlZmxhZ3MgfD0gUEFEQVRBX0lOVkFMSUQ7XG4tXHRcdHJldHVybiBmYWxzZTtcbi1cdH1cbi1cbi1cdHBpbnN0LVx1MDAzZWZsYWdzIFx1MDAyNj0gflBBREFUQV9JTlZBTElEO1xuLVx0cmV0dXJuIHRydWU7XG4tfVxuLVxuLXN0YXRpYyBpbnQgX19wYWRhdGFfc2V0X2NwdW1hc2tzKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LFxuLVx0XHRcdFx0IGNwdW1hc2tfdmFyX3QgcGNwdW1hc2ssXG4tXHRcdFx0XHQgY3B1bWFza192YXJfdCBjYmNwdW1hc2spXG4te1xuLVx0aW50IHZhbGlkO1xuLVx0aW50IGVycjtcbi1cbi1cdHZhbGlkID0gcGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2socGluc3QsIHBjcHVtYXNrLCAtMSk7XG4tXHRpZiAoIXZhbGlkKSB7XG4tXHRcdF9fcGFkYXRhX3N0b3AocGluc3QpO1xuLVx0XHRnb3RvIG91dF9yZXBsYWNlO1xuLVx0fVxuLVxuLVx0dmFsaWQgPSBwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgY2JjcHVtYXNrLCAtMSk7XG4tXHRpZiAoIXZhbGlkKVxuLVx0XHRfX3BhZGF0YV9zdG9wKHBpbnN0KTtcbi1cbi1vdXRfcmVwbGFjZTpcbi1cdGNwdW1hc2tfY29weShwaW5zdC1cdTAwM2VjcHVtYXNrLnBjcHUsIHBjcHVtYXNrKTtcbi1cdGNwdW1hc2tfY29weShwaW5zdC1cdTAwM2VjcHVtYXNrLmNiY3B1LCBjYmNwdW1hc2spO1xuLVxuLVx0ZXJyID0gcGFkYXRhX3NldHVwX2NwdW1hc2tzKHBpbnN0KSA/OiBwYWRhdGFfcmVwbGFjZShwaW5zdCwgLTEpO1xuLVxuLVx0aWYgKHZhbGlkKVxuLVx0XHRfX3BhZGF0YV9zdGFydChwaW5zdCk7XG4tXG4tXHRyZXR1cm4gZXJyO1xuLX1cbi1cbi0vKipcbi0gKiBwYWRhdGFfc2V0X2NwdW1hc2sgLSBTZXRzIHNwZWNpZmllZCBieSBAY3B1bWFza190eXBlIGNwdW1hc2sgdG8gdGhlIHZhbHVlXG4tICogICAgICAgICAgICAgICAgICAgICAgZXF1aXZhbGVudCB0byBAY3B1bWFzay5cbi0gKiBAcGluc3Q6IHBhZGF0YSBpbnN0YW5jZVxuLSAqIEBjcHVtYXNrX3R5cGU6IFBBREFUQV9DUFVfU0VSSUFMIG9yIFBBREFUQV9DUFVfUEFSQUxMRUwgY29ycmVzcG9uZGluZ1xuLSAqICAgICAgICAgICAgICAgIHRvIHBhcmFsbGVsIGFuZCBzZXJpYWwgY3B1bWFza3MgcmVzcGVjdGl2ZWx5LlxuLSAqIEBjcHVtYXNrOiB0aGUgY3B1bWFzayB0byB1c2Vcbi0gKlxuLSAqIFJldHVybjogMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGVcbi0gKi9cbi1pbnQgcGFkYXRhX3NldF9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgY3B1bWFza190eXBlLFxuLVx0XHQgICAgICAgY3B1bWFza192YXJfdCBjcHVtYXNrKVxuLXtcbi1cdHN0cnVjdCBjcHVtYXNrICpzZXJpYWxfbWFzaywgKnBhcmFsbGVsX21hc2s7XG4tXHRpbnQgZXJyID0gLUVJTlZBTDtcbi1cbi1cdGNwdXNfcmVhZF9sb2NrKCk7XG4tXHRtdXRleF9sb2NrKFx1MDAyNnBpbnN0LVx1MDAzZWxvY2spO1xuLVxuLVx0c3dpdGNoIChjcHVtYXNrX3R5cGUpIHtcbi1cdGNhc2UgUEFEQVRBX0NQVV9QQVJBTExFTDpcbi1cdFx0c2VyaWFsX21hc2sgPSBwaW5zdC1cdTAwM2VjcHVtYXNrLmNiY3B1O1xuLVx0XHRwYXJhbGxlbF9tYXNrID0gY3B1bWFzaztcbi1cdFx0YnJlYWs7XG4tXHRjYXNlIFBBREFUQV9DUFVfU0VSSUFMOlxuLVx0XHRwYXJhbGxlbF9tYXNrID0gcGluc3QtXHUwMDNlY3B1bWFzay5wY3B1O1xuLVx0XHRzZXJpYWxfbWFzayA9IGNwdW1hc2s7XG4tXHRcdGJyZWFrO1xuLVx0ZGVmYXVsdDpcbi1cdFx0IGdvdG8gb3V0O1xuLVx0fVxuLVxuLVx0ZXJyID0gIF9fcGFkYXRhX3NldF9jcHVtYXNrcyhwaW5zdCwgcGFyYWxsZWxfbWFzaywgc2VyaWFsX21hc2spO1xuLVxuLW91dDpcbi1cdG11dGV4X3VubG9jayhcdTAwMjZwaW5zdC1cdTAwM2Vsb2NrKTtcbi1cdGNwdXNfcmVhZF91bmxvY2soKTtcbi1cbi1cdHJldHVybiBlcnI7XG4tfVxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX3NldF9jcHVtYXNrKTtcbi1cbi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVXG4tXG4tc3RhdGljIGlubGluZSBpbnQgcGluc3RfaGFzX2NwdShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdSlcbi17XG4tXHRyZXR1cm4gY3B1bWFza190ZXN0X2NwdShjcHUsIHBpbnN0LVx1MDAzZWNwdW1hc2sucGNwdSkgfHxcbi1cdFx0Y3B1bWFza190ZXN0X2NwdShjcHUsIHBpbnN0LVx1MDAzZWNwdW1hc2suY2JjcHUpO1xuLX1cbi1cbi1zdGF0aWMgaW50IHBhZGF0YV9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKVxuLXtcbi1cdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0O1xuLVx0aW50IHJldDtcbi1cbi1cdHBpbnN0ID0gaGxpc3RfZW50cnlfc2FmZShub2RlLCBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlLCBjcHVocF9ub2RlKTtcbi1cdGlmICghcGluc3RfaGFzX2NwdShwaW5zdCwgY3B1KSlcbi1cdFx0cmV0dXJuIDA7XG4tXG4tXHRtdXRleF9sb2NrKFx1MDAyNnBpbnN0LVx1MDAzZWxvY2spO1xuLVxuLVx0cmV0ID0gcGFkYXRhX3JlcGxhY2UocGluc3QsIC0xKTtcbi1cbi1cdGlmIChwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGluc3QtXHUwMDNlY3B1bWFzay5wY3B1LCAtMSkgXHUwMDI2XHUwMDI2XG4tXHQgICAgcGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2socGluc3QsIHBpbnN0LVx1MDAzZWNwdW1hc2suY2JjcHUsIC0xKSlcbi1cdFx0X19wYWRhdGFfc3RhcnQocGluc3QpO1xuLVxuLVx0bXV0ZXhfdW5sb2NrKFx1MDAyNnBpbnN0LVx1MDAzZWxvY2spO1xuLVx0cmV0dXJuIHJldDtcbi19XG4tXG4tc3RhdGljIGludCBwYWRhdGFfY3B1X29mZmxpbmUodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpXG4te1xuLVx0c3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3Q7XG4tXHRpbnQgcmV0O1xuLVxuLVx0cGluc3QgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UsIGNwdWhwX25vZGUpO1xuLVx0aWYgKCFwaW5zdF9oYXNfY3B1KHBpbnN0LCBjcHUpKVxuLVx0XHRyZXR1cm4gMDtcbi1cbi1cdG11dGV4X2xvY2soXHUwMDI2cGluc3QtXHUwMDNlbG9jayk7XG4tXG4tXHRpZiAoIXBhZGF0YV92YWxpZGF0ZV9jcHVtYXNrKHBpbnN0LCBwaW5zdC1cdTAwM2VjcHVtYXNrLnBjcHUsIGNwdSkgfHxcbi1cdCAgICAhcGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2socGluc3QsIHBpbnN0LVx1MDAzZWNwdW1hc2suY2JjcHUsIGNwdSkpXG4tXHRcdF9fcGFkYXRhX3N0b3AocGluc3QpO1xuLVxuLVx0cmV0ID0gcGFkYXRhX3JlcGxhY2UocGluc3QsIGNwdSk7XG4tXG4tXHRtdXRleF91bmxvY2soXHUwMDI2cGluc3QtXHUwMDNlbG9jayk7XG4tXHRyZXR1cm4gcmV0O1xuLX1cbi1cbi1zdGF0aWMgZW51bSBjcHVocF9zdGF0ZSBocF9vbmxpbmU7XG4tI2VuZGlmXG4tXG4tc3RhdGljIHZvaWQgX19wYWRhdGFfZnJlZShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdClcbi17XG4tI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVVxuLVx0Y3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlX25vY2FsbHMoaHBfb25saW5lLCBcdTAwMjZwaW5zdC1cdTAwM2VjcHVocF9ub2RlKTtcbi0jZW5kaWZcbi1cbi1cdFdBUk5fT04oIWxpc3RfZW1wdHkoXHUwMDI2cGluc3QtXHUwMDNlcHNsaXN0KSk7XG4tXG4tXHRmcmVlX2NwdW1hc2tfdmFyKHBpbnN0LVx1MDAzZWNwdW1hc2sucGNwdSk7XG4tXHRmcmVlX2NwdW1hc2tfdmFyKHBpbnN0LVx1MDAzZWNwdW1hc2suY2JjcHUpO1xuLVx0ZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC1cdTAwM2V2YWxpZGF0ZV9jcHVtYXNrKTtcbi1cdGRlc3Ryb3lfd29ya3F1ZXVlKHBpbnN0LVx1MDAzZXNlcmlhbF93cSk7XG4tXHRkZXN0cm95X3dvcmtxdWV1ZShwaW5zdC1cdTAwM2VwYXJhbGxlbF93cSk7XG4tXHRrZnJlZShwaW5zdCk7XG4tfVxuLVxuLSNkZWZpbmUga29iajJwaW5zdChfa29iailcdFx0XHRcdFx0XFxcbi1cdGNvbnRhaW5lcl9vZihfa29iaiwgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSwga29iailcbi0jZGVmaW5lIGF0dHIycGVudHJ5KF9hdHRyKVx0XHRcdFx0XHRcXFxuLVx0Y29udGFpbmVyX29mX2NvbnN0KF9hdHRyLCBzdHJ1Y3QgcGFkYXRhX3N5c2ZzX2VudHJ5LCBhdHRyKVxuLVxuLXN0YXRpYyB2b2lkIHBhZGF0YV9zeXNmc19yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKVxuLXtcbi1cdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0ID0ga29iajJwaW5zdChrb2JqKTtcbi1cdF9fcGFkYXRhX2ZyZWUocGluc3QpO1xuLX1cbi1cbi1zdHJ1Y3QgcGFkYXRhX3N5c2ZzX2VudHJ5IHtcbi1cdHN0cnVjdCBhdHRyaWJ1dGUgYXR0cjtcbi1cdHNzaXplX3QgKCpzaG93KShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKiwgY2hhciAqKTtcbi1cdHNzaXplX3QgKCpzdG9yZSkoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICosXG4tXHRcdFx0IGNvbnN0IGNoYXIgKiwgc2l6ZV90KTtcbi19O1xuLVxuLXN0YXRpYyBzc2l6ZV90IHNob3dfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCxcbi1cdFx0XHQgICAgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgIGNoYXIgKmJ1Zilcbi17XG4tXHRzdHJ1Y3QgY3B1bWFzayAqY3B1bWFzaztcbi1cdHNzaXplX3QgbGVuO1xuLVxuLVx0bXV0ZXhfbG9jayhcdTAwMjZwaW5zdC1cdTAwM2Vsb2NrKTtcbi1cdGlmICghc3RyY21wKGF0dHItXHUwMDNlbmFtZSwgXCJzZXJpYWxfY3B1bWFza1wiKSlcbi1cdFx0Y3B1bWFzayA9IHBpbnN0LVx1MDAzZWNwdW1hc2suY2JjcHU7XG4tXHRlbHNlXG4tXHRcdGNwdW1hc2sgPSBwaW5zdC1cdTAwM2VjcHVtYXNrLnBjcHU7XG4tXG4tXHRsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgXCIlKnBiXFxuXCIsXG4tXHRcdCAgICAgICBucl9jcHVfaWRzLCBjcHVtYXNrX2JpdHMoY3B1bWFzaykpO1xuLVx0bXV0ZXhfdW5sb2NrKFx1MDAyNnBpbnN0LVx1MDAzZWxvY2spO1xuLVx0cmV0dXJuIGxlbiBcdTAwM2MgUEFHRV9TSVpFID8gbGVuIDogLUVJTlZBTDtcbi19XG4tXG4tc3RhdGljIHNzaXplX3Qgc3RvcmVfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCxcbi1cdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsXG4tXHRcdFx0ICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudClcbi17XG4tXHRjcHVtYXNrX3Zhcl90IG5ld19jcHVtYXNrO1xuLVx0c3NpemVfdCByZXQ7XG4tXHRpbnQgbWFza190eXBlO1xuLVxuLVx0aWYgKCFhbGxvY19jcHVtYXNrX3ZhcihcdTAwMjZuZXdfY3B1bWFzaywgR0ZQX0tFUk5FTCkpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuLVxuLVx0cmV0ID0gYml0bWFwX3BhcnNlKGJ1ZiwgY291bnQsIGNwdW1hc2tfYml0cyhuZXdfY3B1bWFzayksXG4tXHRcdFx0ICAgbnJfY3B1bWFza19iaXRzKTtcbi1cdGlmIChyZXQgXHUwMDNjIDApXG4tXHRcdGdvdG8gb3V0O1xuLVxuLVx0bWFza190eXBlID0gIXN0cmNtcChhdHRyLVx1MDAzZW5hbWUsIFwic2VyaWFsX2NwdW1hc2tcIikgP1xuLVx0XHRQQURBVEFfQ1BVX1NFUklBTCA6IFBBREFUQV9DUFVfUEFSQUxMRUw7XG4tXHRyZXQgPSBwYWRhdGFfc2V0X2NwdW1hc2socGluc3QsIG1hc2tfdHlwZSwgbmV3X2NwdW1hc2spO1xuLVx0aWYgKCFyZXQpXG4tXHRcdHJldCA9IGNvdW50O1xuLVxuLW91dDpcbi1cdGZyZWVfY3B1bWFza192YXIobmV3X2NwdW1hc2spO1xuLVx0cmV0dXJuIHJldDtcbi19XG4tXG4tI2RlZmluZSBQQURBVEFfQVRUUl9SVyhfbmFtZSwgX3Nob3dfbmFtZSwgX3N0b3JlX25hbWUpXHRcdFxcXG4tXHRzdGF0aWMgY29uc3Qgc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSBfbmFtZSMjX2F0dHIgPVx0XFxcbi1cdFx0X19BVFRSKF9uYW1lLCAwNjQ0LCBfc2hvd19uYW1lLCBfc3RvcmVfbmFtZSlcbi0jZGVmaW5lIFBBREFUQV9BVFRSX1JPKF9uYW1lLCBfc2hvd19uYW1lKVx0XHRcdFxcXG4tXHRzdGF0aWMgY29uc3Qgc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSBfbmFtZSMjX2F0dHIgPVx0XFxcbi1cdFx0X19BVFRSKF9uYW1lLCAwNDAwLCBfc2hvd19uYW1lLCBOVUxMKVxuLVxuLVBBREFUQV9BVFRSX1JXKHNlcmlhbF9jcHVtYXNrLCBzaG93X2NwdW1hc2ssIHN0b3JlX2NwdW1hc2spO1xuLVBBREFUQV9BVFRSX1JXKHBhcmFsbGVsX2NwdW1hc2ssIHNob3dfY3B1bWFzaywgc3RvcmVfY3B1bWFzayk7XG4tXG4tLypcbi0gKiBQYWRhdGEgc3lzZnMgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBvYmplY3RzOlxuLSAqIHNlcmlhbF9jcHVtYXNrICAgW1JXXSAtIGNwdW1hc2sgZm9yIHNlcmlhbCB3b3JrZXJzXG4tICogcGFyYWxsZWxfY3B1bWFzayBbUlddIC0gY3B1bWFzayBmb3IgcGFyYWxsZWwgd29ya2Vyc1xuLSAqL1xuLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICpjb25zdCBwYWRhdGFfZGVmYXVsdF9hdHRyc1tdID0ge1xuLVx0XHUwMDI2c2VyaWFsX2NwdW1hc2tfYXR0ci5hdHRyLFxuLVx0XHUwMDI2cGFyYWxsZWxfY3B1bWFza19hdHRyLmF0dHIsXG4tXHROVUxMLFxuLX07XG4tQVRUUklCVVRFX0dST1VQUyhwYWRhdGFfZGVmYXVsdCk7XG4tXG4tc3RhdGljIHNzaXplX3QgcGFkYXRhX3N5c2ZzX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosXG4tXHRcdFx0XHQgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVxuLXtcbi1cdGNvbnN0IHN0cnVjdCBwYWRhdGFfc3lzZnNfZW50cnkgKnBlbnRyeTtcbi1cdHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0O1xuLVx0c3NpemVfdCByZXQgPSAtRUlPO1xuLVxuLVx0cGluc3QgPSBrb2JqMnBpbnN0KGtvYmopO1xuLVx0cGVudHJ5ID0gYXR0cjJwZW50cnkoYXR0cik7XG4tXHRpZiAocGVudHJ5LVx1MDAzZXNob3cpXG4tXHRcdHJldCA9IHBlbnRyeS1cdTAwM2VzaG93KHBpbnN0LCBhdHRyLCBidWYpO1xuLVxuLVx0cmV0dXJuIHJldDtcbi19XG4tXG4tc3RhdGljIHNzaXplX3QgcGFkYXRhX3N5c2ZzX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLFxuLVx0XHRcdFx0ICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudClcbi17XG4tXHRjb25zdCBzdHJ1Y3QgcGFkYXRhX3N5c2ZzX2VudHJ5ICpwZW50cnk7XG4tXHRzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdDtcbi1cdHNzaXplX3QgcmV0ID0gLUVJTztcbi1cbi1cdHBpbnN0ID0ga29iajJwaW5zdChrb2JqKTtcbi1cdHBlbnRyeSA9IGF0dHIycGVudHJ5KGF0dHIpO1xuLVx0aWYgKHBlbnRyeS1cdTAwM2VzdG9yZSlcbi1cdFx0cmV0ID0gcGVudHJ5LVx1MDAzZXN0b3JlKHBpbnN0LCBhdHRyLCBidWYsIGNvdW50KTtcbi1cbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIHBhZGF0YV9zeXNmc19vcHMgPSB7XG4tXHQuc2hvdyA9IHBhZGF0YV9zeXNmc19zaG93LFxuLVx0LnN0b3JlID0gcGFkYXRhX3N5c2ZzX3N0b3JlLFxuLX07XG4tXG4tc3RhdGljIGNvbnN0IHN0cnVjdCBrb2JqX3R5cGUgcGFkYXRhX2F0dHJfdHlwZSA9IHtcbi1cdC5zeXNmc19vcHMgPSBcdTAwMjZwYWRhdGFfc3lzZnNfb3BzLFxuLVx0LmRlZmF1bHRfZ3JvdXBzID0gcGFkYXRhX2RlZmF1bHRfZ3JvdXBzLFxuLVx0LnJlbGVhc2UgPSBwYWRhdGFfc3lzZnNfcmVsZWFzZSxcbi19O1xuLVxuLS8qKlxuLSAqIHBhZGF0YV9hbGxvYyAtIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgcGFkYXRhIGluc3RhbmNlXG4tICogQG5hbWU6IHVzZWQgdG8gaWRlbnRpZnkgdGhlIGluc3RhbmNlXG4tICpcbi0gKiBSZXR1cm46IG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLCBOVUxMIG9uIGVycm9yXG4tICovXG4tc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGFkYXRhX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpXG4te1xuLVx0c3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3Q7XG4tXG4tXHRwaW5zdCA9IGt6YWxsb2Nfb2JqKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UpO1xuLVx0aWYgKCFwaW5zdClcbi1cdFx0Z290byBlcnI7XG4tXG4tXHRwaW5zdC1cdTAwM2VwYXJhbGxlbF93cSA9IGFsbG9jX3dvcmtxdWV1ZShcIiVzX3BhcmFsbGVsXCIsIFdRX1VOQk9VTkQsIDAsXG4tXHRcdFx0XHRcdCAgICAgbmFtZSk7XG4tXHRpZiAoIXBpbnN0LVx1MDAzZXBhcmFsbGVsX3dxKVxuLVx0XHRnb3RvIGVycl9mcmVlX2luc3Q7XG4tXG4tXHRjcHVzX3JlYWRfbG9jaygpO1xuLVxuLVx0cGluc3QtXHUwMDNlc2VyaWFsX3dxID0gYWxsb2Nfd29ya3F1ZXVlKFwiJXNfc2VyaWFsXCIsXG4tXHRcdFx0XHRcdCAgIFdRX01FTV9SRUNMQUlNIHwgV1FfQ1BVX0lOVEVOU0lWRSB8IFdRX1BFUkNQVSxcbi1cdFx0XHRcdFx0ICAgMSwgbmFtZSk7XG4tXHRpZiAoIXBpbnN0LVx1MDAzZXNlcmlhbF93cSlcbi1cdFx0Z290byBlcnJfcHV0X2NwdXM7XG4tXG4tXHRpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKFx1MDAyNnBpbnN0LVx1MDAzZWNwdW1hc2sucGNwdSwgR0ZQX0tFUk5FTCkpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfc2VyaWFsX3dxO1xuLVx0aWYgKCFhbGxvY19jcHVtYXNrX3ZhcihcdTAwMjZwaW5zdC1cdTAwM2VjcHVtYXNrLmNiY3B1LCBHRlBfS0VSTkVMKSlcbi1cdFx0Z290byBlcnJfZnJlZV9wX21hc2s7XG4tXHRpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKFx1MDAyNnBpbnN0LVx1MDAzZXZhbGlkYXRlX2NwdW1hc2ssIEdGUF9LRVJORUwpKVxuLVx0XHRnb3RvIGVycl9mcmVlX2NiX21hc2s7XG4tXG4tXHRJTklUX0xJU1RfSEVBRChcdTAwMjZwaW5zdC1cdTAwM2Vwc2xpc3QpO1xuLVxuLVx0Y3B1bWFza19jb3B5KHBpbnN0LVx1MDAzZWNwdW1hc2sucGNwdSwgY3B1X3Bvc3NpYmxlX21hc2spO1xuLVx0Y3B1bWFza19jb3B5KHBpbnN0LVx1MDAzZWNwdW1hc2suY2JjcHUsIGNwdV9wb3NzaWJsZV9tYXNrKTtcbi1cbi1cdGlmIChwYWRhdGFfc2V0dXBfY3B1bWFza3MocGluc3QpKVxuLVx0XHRnb3RvIGVycl9mcmVlX3ZfbWFzaztcbi1cbi1cdF9fcGFkYXRhX3N0YXJ0KHBpbnN0KTtcbi1cbi1cdGtvYmplY3RfaW5pdChcdTAwMjZwaW5zdC1cdTAwM2Vrb2JqLCBcdTAwMjZwYWRhdGFfYXR0cl90eXBlKTtcbi1cdG11dGV4X2luaXQoXHUwMDI2cGluc3QtXHUwMDNlbG9jayk7XG4tXG4tI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVVxuLVx0Y3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlX25vY2FsbHNfY3B1c2xvY2tlZChocF9vbmxpbmUsXG4tXHRcdFx0XHRcdFx0ICAgIFx1MDAyNnBpbnN0LVx1MDAzZWNwdWhwX25vZGUpO1xuLSNlbmRpZlxuLVxuLVx0Y3B1c19yZWFkX3VubG9jaygpO1xuLVxuLVx0cmV0dXJuIHBpbnN0O1xuLVxuLWVycl9mcmVlX3ZfbWFzazpcbi1cdGZyZWVfY3B1bWFza192YXIocGluc3QtXHUwMDNldmFsaWRhdGVfY3B1bWFzayk7XG4tZXJyX2ZyZWVfY2JfbWFzazpcbi1cdGZyZWVfY3B1bWFza192YXIocGluc3QtXHUwMDNlY3B1bWFzay5jYmNwdSk7XG4tZXJyX2ZyZWVfcF9tYXNrOlxuLVx0ZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC1cdTAwM2VjcHVtYXNrLnBjcHUpO1xuLWVycl9mcmVlX3NlcmlhbF93cTpcbi1cdGRlc3Ryb3lfd29ya3F1ZXVlKHBpbnN0LVx1MDAzZXNlcmlhbF93cSk7XG4tZXJyX3B1dF9jcHVzOlxuLVx0Y3B1c19yZWFkX3VubG9jaygpO1xuLVx0ZGVzdHJveV93b3JrcXVldWUocGluc3QtXHUwMDNlcGFyYWxsZWxfd3EpO1xuLWVycl9mcmVlX2luc3Q6XG4tXHRrZnJlZShwaW5zdCk7XG4tZXJyOlxuLVx0cmV0dXJuIE5VTEw7XG4tfVxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX2FsbG9jKTtcbi1cbi0vKipcbi0gKiBwYWRhdGFfZnJlZSAtIGZyZWUgYSBwYWRhdGEgaW5zdGFuY2Vcbi0gKlxuLSAqIEBwaW5zdDogcGFkYXRhIGluc3RhbmNlIHRvIGZyZWVcbi0gKi9cbi12b2lkIHBhZGF0YV9mcmVlKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KVxuLXtcbi1cdGtvYmplY3RfcHV0KFx1MDAyNnBpbnN0LVx1MDAzZWtvYmopO1xuLX1cbi1FWFBPUlRfU1lNQk9MKHBhZGF0YV9mcmVlKTtcbi1cbi0vKipcbi0gKiBwYWRhdGFfYWxsb2Nfc2hlbGwgLSBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBwYWRhdGEgc2hlbGwuXG4tICpcbi0gKiBAcGluc3Q6IFBhcmVudCBwYWRhdGFfaW5zdGFuY2Ugb2JqZWN0LlxuLSAqXG4tICogUmV0dXJuOiBuZXcgc2hlbGwgb24gc3VjY2VzcywgTlVMTCBvbiBlcnJvclxuLSAqL1xuLXN0cnVjdCBwYWRhdGFfc2hlbGwgKnBhZGF0YV9hbGxvY19zaGVsbChzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdClcbi17XG4tXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQ7XG4tXHRzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcztcbi1cbi1cdHBzID0ga3phbGxvY19vYmooKnBzKTtcbi1cdGlmICghcHMpXG4tXHRcdGdvdG8gb3V0O1xuLVxuLVx0cHMtXHUwMDNlcGluc3QgPSBwaW5zdDtcbi1cbi1cdGNwdXNfcmVhZF9sb2NrKCk7XG4tXHRwZCA9IHBhZGF0YV9hbGxvY19wZChwcywgLTEpO1xuLVx0Y3B1c19yZWFkX3VubG9jaygpO1xuLVxuLVx0aWYgKCFwZClcbi1cdFx0Z290byBvdXRfZnJlZV9wcztcbi1cbi1cdG11dGV4X2xvY2soXHUwMDI2cGluc3QtXHUwMDNlbG9jayk7XG4tXHRSQ1VfSU5JVF9QT0lOVEVSKHBzLVx1MDAzZXBkLCBwZCk7XG4tXHRsaXN0X2FkZChcdTAwMjZwcy1cdTAwM2VsaXN0LCBcdTAwMjZwaW5zdC1cdTAwM2Vwc2xpc3QpO1xuLVx0bXV0ZXhfdW5sb2NrKFx1MDAyNnBpbnN0LVx1MDAzZWxvY2spO1xuLVxuLVx0cmV0dXJuIHBzO1xuLVxuLW91dF9mcmVlX3BzOlxuLVx0a2ZyZWUocHMpO1xuLW91dDpcbi1cdHJldHVybiBOVUxMO1xuLX1cbi1FWFBPUlRfU1lNQk9MKHBhZGF0YV9hbGxvY19zaGVsbCk7XG4tXG4tLyoqXG4tICogcGFkYXRhX2ZyZWVfc2hlbGwgLSBmcmVlIGEgcGFkYXRhIHNoZWxsXG4tICpcbi0gKiBAcHM6IHBhZGF0YSBzaGVsbCB0byBmcmVlXG4tICovXG4tdm9pZCBwYWRhdGFfZnJlZV9zaGVsbChzdHJ1Y3QgcGFkYXRhX3NoZWxsICpwcylcbi17XG4tXHRzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQ7XG4tXG4tXHRpZiAoIXBzKVxuLVx0XHRyZXR1cm47XG4tXG4tXHRtdXRleF9sb2NrKFx1MDAyNnBzLVx1MDAzZXBpbnN0LVx1MDAzZWxvY2spO1xuLVx0bGlzdF9kZWwoXHUwMDI2cHMtXHUwMDNlbGlzdCk7XG4tXHRwZCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQocHMtXHUwMDNlcGQsIDEpO1xuLVx0cGFkYXRhX3B1dF9wZChwZCk7XG4tXHRtdXRleF91bmxvY2soXHUwMDI2cHMtXHUwMDNlcGluc3QtXHUwMDNlbG9jayk7XG4tXG4tXHRrZnJlZShwcyk7XG4tfVxuLUVYUE9SVF9TWU1CT0wocGFkYXRhX2ZyZWVfc2hlbGwpO1xuLVxuIHZvaWQgX19pbml0IHBhZGF0YV9pbml0KHZvaWQpXG4ge1xuIFx0dW5zaWduZWQgaW50IGksIHBvc3NpYmxlX2NwdXM7XG4tI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVVxuLVx0aW50IHJldDtcbi1cbi1cdHJldCA9IGNwdWhwX3NldHVwX3N0YXRlX211bHRpKENQVUhQX0FQX09OTElORV9EWU4sIFwicGFkYXRhOm9ubGluZVwiLFxuLVx0XHRcdFx0ICAgICAgcGFkYXRhX2NwdV9vbmxpbmUsIHBhZGF0YV9jcHVfb2ZmbGluZSk7XG4tXHRpZiAocmV0IFx1MDAzYyAwKVxuLVx0XHRnb3RvIGVycjtcbi1cdGhwX29ubGluZSA9IHJldDtcbi0jZW5kaWZcbiBcbiBcdHBvc3NpYmxlX2NwdXMgPSBudW1fcG9zc2libGVfY3B1cygpO1xuIFx0cGFkYXRhX3dvcmtzID0ga21hbGxvY19vYmpzKHN0cnVjdCBwYWRhdGFfd29yaywgcG9zc2libGVfY3B1cyk7XG4tXHRpZiAoIXBhZGF0YV93b3Jrcylcbi1cdFx0Z290byByZW1vdmVfb25saW5lX3N0YXRlO1xuK1x0aWYgKCFwYWRhdGFfd29ya3MpIHtcbitcdFx0cHJfd2FybihcInBhZGF0YTogaW5pdGlhbGl6YXRpb24gZmFpbGVkXFxuXCIpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4gXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBwb3NzaWJsZV9jcHVzOyArK2kpXG4gXHRcdGxpc3RfYWRkKFx1MDAyNnBhZGF0YV93b3Jrc1tpXS5wd19saXN0LCBcdTAwMjZwYWRhdGFfZnJlZV93b3Jrcyk7XG4tXG4tXHRyZXR1cm47XG4tXG4tcmVtb3ZlX29ubGluZV9zdGF0ZTpcbi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVXG4tXHRjcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUoaHBfb25saW5lKTtcbi1lcnI6XG4tI2VuZGlmXG4tXHRwcl93YXJuKFwicGFkYXRhOiBpbml0aWFsaXphdGlvbiBmYWlsZWRcXG5cIik7XG4gfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL2NyeXB0by90Y3J5cHQvdGNyeXB0X3NwZWVkX2NvbXBhcmUucHkgYi90b29scy9jcnlwdG8vdGNyeXB0L3RjcnlwdF9zcGVlZF9jb21wYXJlLnB5XG5pbmRleCBmM2Y1NzgzY2RjMDY2Yi4uMGJmMzhjMDczZGJjMDMgMTAwNzU1XG4tLS0gYS90b29scy9jcnlwdG8vdGNyeXB0L3RjcnlwdF9zcGVlZF9jb21wYXJlLnB5XG4rKysgYi90b29scy9jcnlwdG8vdGNyeXB0L3RjcnlwdF9zcGVlZF9jb21wYXJlLnB5XG5AQCAtMjgsMTkgKzI4LDE2IEBAIG51bV9tYj04XG4gbW9kZT0yMTFcbiBcbiAjIGJhc2Ugc3BlZWQgdGVzdFxuLWxzbW9kIHwgZ3JlcCBwY3J5cHQgXHUwMDI2XHUwMDI2IG1vZHByb2JlIC1yIHBjcnlwdFxuIGRtZXNnIC1DXG4tbW9kcHJvYmUgdGNyeXB0IGFsZz1cInBjcnlwdChyZmM0MTA2KGdjbShhZXMpKSlcIiB0eXBlPTNcbittb2Rwcm9iZSB0Y3J5cHQgYWxnPVwicmZjNDEwNihnY20oYWVzKSlcIiB0eXBlPTNcbiBtb2Rwcm9iZSB0Y3J5cHQgbW9kZT0ke21vZGV9IHNlYz0ke3NlY30gbnVtX21iPSR7bnVtX21ifVxuIGRtZXNnIFx1MDAzZSAke3NlcV9udW19X2Jhc2VfZG1lc2cubG9nXG4gXG4gIyBuZXcgc3BlZWQgdGVzdFxuLWxzbW9kIHwgZ3JlcCBwY3J5cHQgXHUwMDI2XHUwMDI2IG1vZHByb2JlIC1yIHBjcnlwdFxuIGRtZXNnIC1DXG4tbW9kcHJvYmUgdGNyeXB0IGFsZz1cInBjcnlwdChyZmM0MTA2KGdjbShhZXMpKSlcIiB0eXBlPTNcbittb2Rwcm9iZSB0Y3J5cHQgYWxnPVwicmZjNDEwNihnY20oYWVzKSlcIiB0eXBlPTNcbiBtb2Rwcm9iZSB0Y3J5cHQgbW9kZT0ke21vZGV9IHNlYz0ke3NlY30gbnVtX21iPSR7bnVtX21ifVxuIGRtZXNnIFx1MDAzZSAke3NlcV9udW19X25ld19kbWVzZy5sb2dcbi1sc21vZCB8IGdyZXAgcGNyeXB0IFx1MDAyNlx1MDAyNiBtb2Rwcm9iZSAtciBwY3J5cHRcbiBcbiB0b29scy9jcnlwdG8vdGNyeXB0L3RjcnlwdF9zcGVlZF9jb21wYXJlLnB5IFxcXG4gICAgICR7c2VxX251bX1fYmFzZV9kbWVzZy5sb2cgXFxcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDAzOjM1OjE1LjUxNzAxNTc0N1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEyNjczMDQzNDE1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgQXNzZXNzbWVudDogYHBjcnlwdGAgUmVtb3ZhbCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGEgcGF0Y2ggdGhhdCBlc3NlbnRpYWxseSBndXRzIHRoZSBgcGNyeXB0YCBlbmdpbmUgYW5kIGl0cyBzZXJpYWxpemVkIGpvYiBjYXBhYmlsaXRpZXMgd2l0aGluIGBwYWRhdGFgLiAgTXkgaW5pdGlhbCB0aG91Z2h0IGlzLCBcIlRoaXMgaXMgYSAqcmVtb3ZhbCogcGF0Y2gg4oCTIGdvb2QuXCIgIE5vIG5ldyBjb2RlIG1lYW5zIHBvdGVudGlhbGx5IGxlc3Mgd29yayBmb3IgbWUuXG5cbk15IGZvY3VzIGlzIHdoZXRoZXIgdGhlcmUncyBhbnl0aGluZyAqbmV3KiB0byBmdXp6LiBUaGUgcGF0Y2ggY2xlYW5zIHVwIHRoZSBgRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9wYWRhdGEucnN0YCwgYE1BSU5UQUlORVJTYCwgcmVtb3ZlcyB0aGUgYGNyeXB0by9wY3J5cHQuY2AsIGBpbmNsdWRlL2NyeXB0by9wY3J5cHQuaGAsIGFuZCBtb2RpZmllcyBgaW5jbHVkZS9saW51eC9wYWRhdGEuaGAgYW5kIGBrZXJuZWwvcGFkYXRhLmNgLiAgU3BlY2lmaWNhbGx5LCB0aGUgZGVsZXRlZCBjb2RlIGluY2x1ZGVzIGBwYWRhdGFfZG9fcGFyYWxsZWxgLCBgcGFkYXRhX2RvX3NlcmlhbGAsIGFuZCBhIGhvc3Qgb2YgYXNzb2NpYXRlZCBmdW5jdGlvbnMuICBJdCBhbHNvIHJlbW92ZXMgdGhlIGBDT05GSUdfQ1JZUFRPX1BDUllQVGAgY29uZmlnIG9wdGlvbi5cblxuU2luY2UgdGhlIGZ1bmN0aW9uYWxpdHkgcmVtb3ZlZCBpcyB0aGUgcGFyYWxsZWwgY3J5cHRvIGVuZ2luZSBhbmQgdGhlIHNlcmlhbGl6ZWQgam9iIHN1cHBvcnQgZnJvbSBwYWRhdGEsIG15IGFzc3VtcHRpb24gaXMgdGhhdCB0aGlzIGRvZXNuJ3QgbmVjZXNzaXRhdGUgZnV6emluZy4gTXkgbWFpbiBjb25jZXJuIGlzIHRoYXQgcGVyaGFwcyB0aGUgbXVsdGl0aHJlYWRlZCBqb2Igc3VwcG9ydCBoYWQgYmVlbiBhZmZlY3RlZCBpbiBhIHdheSB0aGF0IHJlcXVpcmVzIGZ1enppbmcuXG5cbkknbSBjaGVja2luZyBga2VybmVsL3BhZGF0YS5jYC4gYHBhZGF0YV9kb19tdWx0aXRocmVhZGVkYCByZW1haW5zLiBgcGFkYXRhX2luaXRgIGhhcyBiZWVuIGFkanVzdGVkLCBidXQgaXQncyAqcmVtb3ZpbmcqIENQVSBob3RwbHVnIHN0YXRlIHJlZ2lzdHJhdGlvbiAoYGNwdWhwX3NldHVwX3N0YXRlX211bHRpYCkuIFRoaXMgd2FzIGV4Y2x1c2l2ZWx5IHVzZWQgYnkgdGhlIHNlcmlhbGl6ZWQgam9iIHN1cHBvcnQsIHdoaWNoIGNvbmZpcm1zIG15IGFzc3VtcHRpb24uICBGdW5jdGlvbnMgbGlrZSBgcGFkYXRhX2FsbG9jX3BkYCwgYHBhZGF0YV9mcmVlX3BkYCwgYHBhZGF0YV9yZXBsYWNlYCwgYHBhZGF0YV9zZXRfY3B1bWFza2AgYXJlIGJlaW5nIHJlbW92ZWQgYXMgd2VsbC5cblxuSSdtIHZlcnkgY29uZmlkZW50IGF0IHRoaXMgcG9pbnQgdGhhdCB0aGlzIGlzIGEgcHVyZWx5IGFkZGl0aXZlIHJlbW92YWwgcGF0Y2guICBUaGVyZSdzIG5vIG5ldyBjb2RlIHRvIHRlc3QsIHdoaWNoIG1lYW5zIHRoZXJlJ3Mgbm8gbmV3IGF0dGFjayBzdXJmYWNlIHRvIGZ1enouXG5cbkknbSBkb3VibGUtY2hlY2tpbmcgdGhlIGBrZXJuZWwvcGFkYXRhLmNgIGRpZmYsIGFuZCBjb25maXJtIHRoYXQgdGhlIGFkZGl0aW9ucyBpbiBga2VybmVsL3BhZGF0YS5jYCBhcmUgc2ltcGx5IGAjaW5jbHVkZWBzLCB3aGljaCB3ZXJlIHByZXZpb3VzbHkgaW1wbGljaXRseSBpbmNsdWRlZCBvciByZW9yZGVyZWQsIGFzIHdlbGwgYXMgbWlub3IgYWRqdXN0bWVudHMgdG8gYHBhZGF0YV9pbml0YC5cblxuVGhlcmVmb3JlLCBJJ20gc2V0dGluZyBgV29ydGhGdXp6aW5nPWZhbHNlYC4gVGhlIHJlYXNvbmluZyBpcyB0aGF0IHRoZSBwYXRjaCAqcmVtb3ZlcyogYHBjcnlwdGAgYW5kIGl0cyByZWxhdGVkIGZ1bmN0aW9uYWxpdHkuIEl0IGRvZXMgKm5vdCogaW50cm9kdWNlIG5ldyBmdW5jdGlvbmFsaXR5IHRvIHRlc3QuXG5cbkkgd2lsbCBjYWxsIGBzZXQtcmVzdWx0c2Agd2l0aCBgV29ydGhGdXp6aW5nPWZhbHNlYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjE5MDgsIk91dHB1dFRva2VucyI6NzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDI1LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTRUMDM6MzU6MjguMTkwMDYzMDEyWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNDUwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZW1vdmVzIHRoZSBwY3J5cHQgcGFyYWxsZWwgY3J5cHRvIGVuZ2luZSBhbmQgdGhlIGFzc29jaWF0ZWQgc2VyaWFsaXplZCBqb2Igc3VwcG9ydCBmcm9tIHBhZGF0YS4gSXQgaXMgYSBwdXJlIGNsZWFudXAvcmVtb3ZhbCBwYXRjaCBhbmQgZG9lcyBub3QgaW50cm9kdWNlIGFueSBuZXcgZnVuY3Rpb25hbCBjb2RlIG9yIGxvZ2ljIHRoYXQgcmVxdWlyZXMgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlbW92ZXMgdGhlIHBjcnlwdCBwYXJhbGxlbCBjcnlwdG8gZW5naW5lIGFuZCB0aGUgYXNzb2NpYXRlZCBzZXJpYWxpemVkIGpvYiBzdXBwb3J0IGZyb20gcGFkYXRhLiBJdCBpcyBhIHB1cmUgY2xlYW51cC9yZW1vdmFsIHBhdGNoIGFuZCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IG5ldyBmdW5jdGlvbmFsIGNvZGUgb3IgbG9naWMgdGhhdCByZXF1aXJlcyBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowmrqln[1] Phase: Running StartedAt: 2026-07-14 03:35:40 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmrqln[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-07-14 03:35:40 +0000 UTC FinishedAt: 2026-07-14 03:35:47 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:code,Default:nil,Value:*1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*1,}