Name: series-workflowwfh8c Phase: Failed StartedAt: 2026-09-07 01:25:11 +0000 UTC FinishedAt: 2026-09-07 02:10:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwfh8c[0] Phase: Succeeded StartedAt: 2026-09-07 01:25:11 +0000 UTC FinishedAt: 2026-09-07 02:10:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwfh8c[0].run-triage Phase: Succeeded StartedAt: 2026-09-07 01:25:11 +0000 UTC FinishedAt: 2026-09-07 02:10:01 +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+CgkJCTx0ZD4yMDI2LzA5LzA3IDAyOjA5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xpbmcgYW5kIHNlbGZ0ZXN0cyB1bmRlciB0b29scy8gKGJwZnRvb2wgYW5kIEJQRiBzZWxmdGVzdHMpIGFuZCBkb2VzIG5vdCBtYWtlIGFueSBjaGFuZ2VzIHRvIHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMjowOTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDVhMGEzZTUxNWViNGE2ZDhmYzA4OTQ2NTgxOTU0MGU4ZmI0M2I2ODBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCA3IDAyOjA5OjM3IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbmluZGV4IDY4NGE4ZmI3MjQxNDYuLjFlY2NkYzBkMWU5NjMgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbkBAIC03NDAsMTUgJiM0Mzs3NDAsMTAgQEAgc3RhdGljIGludCBkb19zaG93KGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdHJldHVybiBlcnJubyA9PSBFTk9FTlQgPyAwIDogLTE7XG4gfVxuIFxuLXN0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4tXHRcdFx0IHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsXG4tXHRcdFx0IGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXG4mIzQzO3N0YXRpYyB2b2lkIHByaW50X21hcF9lbGVtKHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4mIzQzO1x0XHRcdCAgIHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsXG4mIzQzO1x0XHRcdCAgIGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXG4ge1xuLVx0aWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7XG4tXHRcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGVycm5vKTtcbi1cdFx0cmV0dXJuIC0xO1xuLVx0fVxuLVxuIFx0aWYgKGpzb25fb3V0cHV0KSB7XG4gXHRcdHByaW50X2VudHJ5X2pzb24obWFwX2luZm8sIGtleSwgdmFsdWUsIGJ0Zik7XG4gXHR9IGVsc2UgaWYgKGJ0Zikge1xuQEAgLTc2MiwxMCAmIzQzOzc1NywxMDggQEAgc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbiBcdH0gZWxzZSB7XG4gXHRcdHByaW50X2VudHJ5X3BsYWluKG1hcF9pbmZvLCBrZXksIHZhbHVlKTtcbiBcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbiYjNDM7XHRcdFx0IHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsXG4mIzQzO1x0XHRcdCBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7XG4mIzQzO1x0XHRwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuIFxuJiM0MztcdHByaW50X21hcF9lbGVtKGtleSwgdmFsdWUsIG1hcF9pbmZvLCBidGYsIGJ0Zl93dHIpO1xuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0MzsjZGVmaW5lIE1BUF9EVU1QX0JBVENIX1NJWkUgMjU2VVxuJiM0MzsjZGVmaW5lIE1BUF9EVU1QX0JBVENIX01BWF9CWVRFUyAoNCAqIDEwMjQgKiAxMDI0KVxuJiM0MztcbiYjNDM7LyogUmV0dXJuIDEgdG8gdXNlIGluZGl2aWR1YWwgbG9va3VwcywgYnV0IG9ubHkgYmVmb3JlIGJhdGNoIHRyYXZlcnNhbCBzdGFydHMuICovXG4mIzQzO3N0YXRpYyBpbnQgZHVtcF9tYXBfYmF0Y2goaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuJiM0MztcdFx0XHQgIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHN0cnVjdCBidGYgKmJ0ZixcbiYjNDM7XHRcdFx0ICBqc29uX3dyaXRlcl90ICp3dHIsIHVuc2lnbmVkIGludCAqbnVtX2VsZW1zKVxuJiM0Mzt7XG4mIzQzO1x0X191MzIgY2FwYWNpdHksIGNvdW50LCBiYXRjaCA9IDAsIG5leHRfYmF0Y2ggPSAwLCBpO1xuJiM0MztcdHZvaWQgKmtleXMgPSBOVUxMLCAqdmFsdWVzID0gTlVMTCwgKmJ1ZjtcbiYjNDM7XHRib29sIGZpcnN0ID0gdHJ1ZSwgY2FuX2ZhbGxiYWNrID0gdHJ1ZTtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHQvKiBIYXNoIGxvb2t1cCBiYXRjaGVzIG11c3QgYWNjb21tb2RhdGUgYSB3aG9sZSBidWNrZXQuIFJlc3RyaWN0IHRoZVxuJiM0MztcdCAqIG9wdGltaXphdGlvbiB0byBtYXBzIHdob3NlIHdvcnN0LWNhc2UgYnVja2V0IGZpdHMgdGhlIG1lbW9yeSBidWRnZXQsXG4mIzQzO1x0ICogc28gYSBsYXRlciBFTk9TUEMgbmV2ZXIgZm9yY2VzIGEgcmVzdGFydCBhZnRlciBwcmludGluZyBzb21lIGVudHJpZXMuXG4mIzQzO1x0ICogRGl2aXNpb24gYWxzbyBib3VuZHMgdGhlIGFsbG9jYXRpb24gbXVsdGlwbGljYXRpb25zIG9uIDMyLWJpdCBob3N0cy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoaW5mby1cdTAwM2V0eXBlICE9IEJQRl9NQVBfVFlQRV9IQVNIIHx8ICFpbmZvLVx1MDAzZW1heF9lbnRyaWVzIHx8XG4mIzQzO1x0ICAgIChfX3U2NClpbmZvLVx1MDAzZWtleV9zaXplICYjNDM7IGluZm8tXHUwMDNldmFsdWVfc2l6ZSBcdTAwM2VcbiYjNDM7XHQgICAgTUFQX0RVTVBfQkFUQ0hfTUFYX0JZVEVTIC8gaW5mby1cdTAwM2VtYXhfZW50cmllcylcbiYjNDM7XHRcdHJldHVybiAxO1xuJiM0MztcbiYjNDM7XHRjYXBhY2l0eSA9IG1pbihpbmZvLVx1MDAzZW1heF9lbnRyaWVzLCBNQVBfRFVNUF9CQVRDSF9TSVpFKTtcbiYjNDM7cmVzaXplOlxuJiM0MztcdGJ1ZiA9IHJlYWxsb2Moa2V5cywgKHNpemVfdCljYXBhY2l0eSAqIGluZm8tXHUwMDNla2V5X3NpemUpO1xuJiM0MztcdGlmICghYnVmKSB7XG4mIzQzO1x0XHRlcnIgPSBFTk9NRU07XG4mIzQzO1x0XHRnb3RvIGVycm9yO1xuJiM0MztcdH1cbiYjNDM7XHRrZXlzID0gYnVmO1xuJiM0MztcdGJ1ZiA9IHJlYWxsb2ModmFsdWVzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby1cdTAwM2V2YWx1ZV9zaXplKTtcbiYjNDM7XHRpZiAoIWJ1Zikge1xuJiM0MztcdFx0ZXJyID0gRU5PTUVNO1xuJiM0MztcdFx0Z290byBlcnJvcjtcbiYjNDM7XHR9XG4mIzQzO1x0dmFsdWVzID0gYnVmO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAodHJ1ZSkge1xuJiM0MztcdFx0Y291bnQgPSBjYXBhY2l0eTtcbiYjNDM7XHRcdGVyciA9IGJwZl9tYXBfbG9va3VwX2JhdGNoKGZkLCBmaXJzdCA/IE5VTEwgOiBcdTAwMjZiYXRjaCxcbiYjNDM7XHRcdFx0XHRcdCAgIFx1MDAyNm5leHRfYmF0Y2gsIGtleXMsIHZhbHVlcywgXHUwMDI2Y291bnQsIE5VTEwpO1xuJiM0MztcdFx0ZXJyID0gZXJyID8gZXJybm8gOiAwO1xuJiM0MztcdFx0LyogT2xkZXIga2VybmVscyByZWplY3QgdGhlIGNvbW1hbmQgYmVmb3JlIHVwZGF0aW5nIGNvdW50LiBEbyBub3RcbiYjNDM7XHRcdCAqIGluc3BlY3QgdGhlIGJ1ZmZlcnMgb24gdGhlc2UgZXJyb3JzLCBvciBmYWxsIGJhY2sgYWZ0ZXIgcHJvZ3Jlc3MuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmIChjYW5fZmFsbGJhY2sgXHUwMDI2XHUwMDI2IChlcnIgPT0gRUlOVkFMIHx8IGVyciA9PSBFT1BOT1RTVVBQIHx8XG4mIzQzO1x0XHRcdFx0ICAgICBlcnIgPT0gNTI0IC8qIEVOT1RTVVBQICovKSkge1xuJiM0MztcdFx0XHRlcnIgPSAxO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGNhbl9mYWxsYmFjayA9IGZhbHNlO1xuJiM0MztcdFx0aWYgKGVyciA9PSBFTk9TUEMpIHtcbiYjNDM7XHRcdFx0aWYgKGNhcGFjaXR5ID09IGluZm8tXHUwMDNlbWF4X2VudHJpZXMpXG4mIzQzO1x0XHRcdFx0Z290byBlcnJvcjtcbiYjNDM7XHRcdFx0Y2FwYWNpdHkgJiM0Mzs9IG1pbihjYXBhY2l0eSwgaW5mby1cdTAwM2VtYXhfZW50cmllcyAtIGNhcGFjaXR5KTtcbiYjNDM7XHRcdFx0LyogUHJlc2VydmUgdGhlIGlucHV0IGN1cnNvcjogdGhlIG92ZXJzaXplZCBidWNrZXQgd2FzIG5vdCByZWFkLiAqL1xuJiM0MztcdFx0XHRnb3RvIHJlc2l6ZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdC8qIEluIHBhcnRpY3VsYXIsIEVGQVVMVCBjYW4gbGVhdmUgY291bnQgYW5kIHRoZSBidWZmZXJzIGludmFsaWQuICovXG4mIzQzO1x0XHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBlcnIgIT0gRU5PRU5UKVxuJiM0MztcdFx0XHRnb3RvIGVycm9yO1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgY291bnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdC8qIEtlZXAgdGhlIGFsaWdubWVudCBwcm92aWRlZCBieSBpbmRpdmlkdWFsIGxvb2t1cHMsIGluY2x1ZGluZ1xuJiM0MztcdFx0XHQgKiBmb3IgQlRGIHR5cGVzIHdob3NlIG1hcCBrZXkvdmFsdWUgc2l6ZSBpcyBub3QgYWxpZ25lZC5cbiYjNDM7XHRcdFx0ICovXG4mIzQzO1x0XHRcdG1lbWNweShrZXksIGtleXMgJiM0MzsgKHNpemVfdClpICogaW5mby1cdTAwM2VrZXlfc2l6ZSwgaW5mby1cdTAwM2VrZXlfc2l6ZSk7XG4mIzQzO1x0XHRcdG1lbWNweSh2YWx1ZSwgdmFsdWVzICYjNDM7IChzaXplX3QpaSAqIGluZm8tXHUwMDNldmFsdWVfc2l6ZSwgaW5mby1cdTAwM2V2YWx1ZV9zaXplKTtcbiYjNDM7XHRcdFx0cHJpbnRfbWFwX2VsZW0oa2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpO1xuJiM0MztcdFx0XHQoKm51bV9lbGVtcykmIzQzOyYjNDM7O1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKGVyciA9PSBFTk9FTlQpIHtcbiYjNDM7XHRcdFx0ZXJyID0gMDtcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRmaXJzdCA9IGZhbHNlO1xuJiM0MztcdFx0YmF0Y2ggPSBuZXh0X2JhdGNoO1xuJiM0MztcdH1cbiYjNDM7ZXJyb3I6XG4mIzQzO1x0cF9lcnIoXCYjMzQ7Y2FuJiMzOTt0IGxvb2t1cCBtYXAgYmF0Y2g6ICVzXCYjMzQ7LCBzdHJlcnJvcihlcnIpKTtcbiYjNDM7XHRlcnIgPSAtMTtcbiYjNDM7b3V0OlxuJiM0MztcdGZyZWUoa2V5cyk7XG4mIzQzO1x0ZnJlZSh2YWx1ZXMpO1xuJiM0MztcdHJldHVybiBlcnI7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIGludCBtYXBzX2hhdmVfYnRmKGludCAqZmRzLCBpbnQgbmJfZmRzKVxuIHtcbiBcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuQEAgLTg2OSw2ICYjNDM7OTYyLDkgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXHRcdHBfaW5mbyhcJiMzNDtXYXJuaW5nOiBjYW5ub3QgcmVhZCB2YWx1ZXMgZnJvbSAlcyBtYXAgd2l0aCB2YWx1ZV9zaXplICE9IDhcJiMzNDssXG4gXHRcdCAgICAgICBtYXBfdHlwZV9zdHIpO1xuIFx0fVxuJiM0MztcdGVyciA9IGR1bXBfbWFwX2JhdGNoKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0ciwgXHUwMDI2bnVtX2VsZW1zKTtcbiYjNDM7XHRpZiAoZXJyICE9IDEpXG4mIzQzO1x0XHRnb3RvIGVuZF9kdW1wO1xuIFx0d2hpbGUgKHRydWUpIHtcbiBcdFx0ZXJyID0gYnBmX21hcF9nZXRfbmV4dF9rZXkoZmQsIHByZXZfa2V5LCBrZXkpO1xuIFx0XHRpZiAoZXJyKSB7XG5AQCAtODgxLDYgJiM0Mzs5NzcsNyBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdFx0cHJldl9rZXkgPSBrZXk7XG4gXHR9XG4gXG4mIzQzO2VuZF9kdW1wOlxuIFx0aWYgKHd0cikge1xuIFx0XHRqc29ud19lbmRfYXJyYXkod3RyKTtcdC8qIGVsZW1lbnRzICovXG4gXHRcdGlmIChzaG93X2hlYWRlcilcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjEzOWQxM2E0OWRjZWZcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmNcbkBAIC0wLDAgJiM0MzsxLDE4NiBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmdG9vbF9oZWxwZXJzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2J0Zi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2N0eXBlLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNkZWZpbmUgTUFYX0VOVFJJRVMgMTAyNVxuJiM0MzsjZGVmaW5lIFJFQ09SRF9TSVpFIDI1NlxuJiM0MzsjZGVmaW5lIE9VVFBVVF9TSVpFIChNQVhfRU5UUklFUyAqIFJFQ09SRF9TSVpFICYjNDM7IDEwMjQpXG4mIzQzO1xuJiM0MztzdHJ1Y3QgZHVtcF9jYXNlIHtcbiYjNDM7XHRjb25zdCBjaGFyICpuYW1lO1xuJiM0MztcdHVuc2lnbmVkIGludCBjb3VudDtcbiYjNDM7XHR1bnNpZ25lZCBpbnQga2V5X3NpemU7XG4mIzQzO1x0dW5zaWduZWQgaW50IHZhbHVlX3NpemU7XG4mIzQzO1x0Ym9vbCBidGY7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBoZXhfYnl0ZXMoY2hhciAqb3V0LCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSwgYm9vbCBqc29uKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSBkYXRhO1xuJiM0MztcdHVuc2lnbmVkIGludCBpO1xuJiM0MztcbiYjNDM7XHRpZiAoanNvbilcbiYjNDM7XHRcdCpvdXQmIzQzOyYjNDM7ID0gJiMzOTtbJiMzOTs7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc2l6ZTsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChqc29uIFx1MDAyNlx1MDAyNiBpKVxuJiM0MztcdFx0XHQqb3V0JiM0MzsmIzQzOyA9ICYjMzk7LCYjMzk7O1xuJiM0MztcdFx0b3V0ICYjNDM7PSBzcHJpbnRmKG91dCwganNvbiA/IFwmIzM0O1xcXCYjMzQ7MHglMDJ4XFxcJiMzNDtcJiMzNDsgOiBcJiMzNDslMDJ4XCYjMzQ7LCBieXRlc1tpXSk7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChqc29uKVxuJiM0MztcdFx0Km91dCYjNDM7JiM0MzsgPSAmIzM5O10mIzM5OztcbiYjNDM7XHQqb3V0ID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgZXhwZWN0ZWRfcmVjb3JkKGNoYXIgKnJlY29yZCwgY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdCxcbiYjNDM7XHRcdFx0ICAgIHVuc2lnbmVkIGludCBpbmRleCwgYm9vbCBqc29uKVxuJiM0Mzt7XG4mIzQzO1x0X191MzIga2V5ID0gaW5kZXgsIHZhbHVlID0gaW5kZXggKiAzNyAmIzQzOyAxMTtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyIHNob3J0X2tleSA9IGluZGV4O1xuJiM0MztcdGNoYXIga2V5X2hleFs2NF0sIHZhbHVlX2hleFs2NF0sIGZvcm1hdHRlZFs5Nl07XG4mIzQzO1xuJiM0MztcdGhleF9ieXRlcyhrZXlfaGV4LCB0ZXN0LVx1MDAzZWtleV9zaXplID09IDEgPyAodm9pZCAqKVx1MDAyNnNob3J0X2tleSA6IFx1MDAyNmtleSxcbiYjNDM7XHRcdCAgdGVzdC1cdTAwM2VrZXlfc2l6ZSwganNvbik7XG4mIzQzO1x0aGV4X2J5dGVzKHZhbHVlX2hleCwgXHUwMDI2dmFsdWUsIHRlc3QtXHUwMDNldmFsdWVfc2l6ZSwganNvbik7XG4mIzQzO1x0c25wcmludGYoZm9ybWF0dGVkLCBzaXplb2YoZm9ybWF0dGVkKSwgXCYjMzQ7e1xcXCYjMzQ7a2V5XFxcJiMzNDs6JXUsXFxcJiMzNDt2YWx1ZVxcXCYjMzQ7OiV1fVwmIzM0OyxcbiYjNDM7XHRcdCBrZXksIHZhbHVlKTtcbiYjNDM7XHRpZiAoanNvbiBcdTAwMjZcdTAwMjYgdGVzdC1cdTAwM2VidGYpXG4mIzQzO1x0XHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLFxuJiM0MztcdFx0XHQgXCYjMzQ7e1xcXCYjMzQ7a2V5XFxcJiMzNDs6JXMsXFxcJiMzNDt2YWx1ZVxcXCYjMzQ7OiVzLFxcXCYjMzQ7Zm9ybWF0dGVkXFxcJiMzNDs6JXN9XCYjMzQ7LFxuJiM0MztcdFx0XHQga2V5X2hleCwgdmFsdWVfaGV4LCBmb3JtYXR0ZWQpO1xuJiM0MztcdGVsc2UgaWYgKGpzb24pXG4mIzQzO1x0XHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCBcJiMzNDt7XFxcJiMzNDtrZXlcXFwmIzM0OzolcyxcXFwmIzM0O3ZhbHVlXFxcJiMzNDs6JXN9XCYjMzQ7LFxuJiM0MztcdFx0XHQga2V5X2hleCwgdmFsdWVfaGV4KTtcbiYjNDM7XHRlbHNlIGlmICh0ZXN0LVx1MDAzZWJ0ZilcbiYjNDM7XHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFwmIzM0OyVzXCYjMzQ7LCBmb3JtYXR0ZWQpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFwmIzM0O2tleTolc3ZhbHVlOiVzXCYjMzQ7LCBrZXlfaGV4LCB2YWx1ZV9oZXgpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjaGVja19kdW1wKGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QsIF9fdTMyIGlkLCBib29sIGpzb24sIGJvb2wgcHJldHR5KVxuJiM0Mzt7XG4mIzQzO1x0Ym9vbCBhcnJheSA9IGpzb24gfHwgdGVzdC1cdTAwM2VidGY7XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBleHBlY3RlZFtSRUNPUkRfU0laRV0sIGZvb3Rlcls2NF07XG4mIzQzO1x0Ym9vbCBzZWVuW01BWF9FTlRSSUVTXSA9IHt9O1xuJiM0MztcdGNoYXIgKm91dHB1dCwgKnNyYywgKmRzdCwgKmN1cnNvcjtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgaSwgbjtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRvdXRwdXQgPSBjYWxsb2MoMSwgT1VUUFVUX1NJWkUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihvdXRwdXQsIFwmIzM0O2FsbG9jX291dHB1dFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDslc21hcCBkdW1wIGlkICV1XCYjMzQ7LFxuJiM0MztcdFx0IHByZXR0eSA/IFwmIzM0Oy1wIFwmIzM0OyA6IGpzb24gPyBcJiMzNDstaiBcJiMzNDsgOiBcJiMzNDtcJiMzNDssIGlkKTtcbiYjNDM7XHRlcnIgPSBnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O21hcF9kdW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdC8qIElnbm9yZSBwcmVzZW50YXRpb24gd2hpdGVzcGFjZSwgYnV0IGNvbXBhcmUgY29tcGxldGUgcmVjb3JkcyBhbmQgYWxsXG4mIzQzO1x0ICogcHVuY3R1YXRpb24uIEV4cGVjdGVkIGNvbnRlbnRzIGNvbWUgb25seSBmcm9tIHRoZSBpbnB1dCBkYXRhLCBuZXZlclxuJiM0MztcdCAqIGZyb20gYW5vdGhlciBtYXAgd2FsayBvciBicGZ0b29sIGludm9jYXRpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0Zm9yIChzcmMgPSBvdXRwdXQsIGRzdCA9IG91dHB1dDsgKnNyYzsgc3JjJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmICghaXNzcGFjZSgodW5zaWduZWQgY2hhcikqc3JjKSlcbiYjNDM7XHRcdFx0KmRzdCYjNDM7JiM0MzsgPSAqc3JjO1xuJiM0MztcdCpkc3QgPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcdGN1cnNvciA9IG91dHB1dDtcbiYjNDM7XHRpZiAoYXJyYXkpIHtcbiYjNDM7XHRcdGlmICghQVNTRVJUX0VRKCpjdXJzb3IsICYjMzk7WyYjMzk7LCBcJiMzNDthcnJheV9zdGFydFwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0Y3Vyc29yJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1x0Zm9yIChuID0gMDsgbiBcdTAwM2MgdGVzdC1cdTAwM2Vjb3VudDsgbiYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChhcnJheSBcdTAwMjZcdTAwMjYgbikge1xuJiM0MztcdFx0XHRpZiAoIUFTU0VSVF9FUSgqY3Vyc29yLCAmIzM5OywmIzM5OywgXCYjMzQ7cmVjb3JkX3NlcGFyYXRvclwmIzM0OykpXG4mIzQzO1x0XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRcdGN1cnNvciYjNDM7JiM0Mzs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0ZXN0LVx1MDAzZWNvdW50OyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAoc2VlbltpXSlcbiYjNDM7XHRcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdFx0ZXhwZWN0ZWRfcmVjb3JkKGV4cGVjdGVkLCB0ZXN0LCBpLCBqc29uKTtcbiYjNDM7XHRcdFx0aWYgKCFzdHJuY21wKGN1cnNvciwgZXhwZWN0ZWQsIHN0cmxlbihleHBlY3RlZCkpKVxuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKCFBU1NFUlRfTFQoaSwgdGVzdC1cdTAwM2Vjb3VudCwgXCYjMzQ7dW5pcXVlX2V4cGVjdGVkX3JlY29yZFwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0c2VlbltpXSA9IHRydWU7XG4mIzQzO1x0XHRjdXJzb3IgJiM0Mzs9IHN0cmxlbihleHBlY3RlZCk7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChhcnJheSkge1xuJiM0MztcdFx0QVNTRVJUX1NUUkVRKGN1cnNvciwgXCYjMzQ7XVwmIzM0OywgXCYjMzQ7YXJyYXlfZW5kX2FuZF9jb3VudFwmIzM0Oyk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHNucHJpbnRmKGZvb3Rlciwgc2l6ZW9mKGZvb3RlciksIFwmIzM0O0ZvdW5kJXVlbGVtZW50JXNcJiMzNDssIHRlc3QtXHUwMDNlY291bnQsXG4mIzQzO1x0XHRcdCB0ZXN0LVx1MDAzZWNvdW50ID09IDEgPyBcJiMzNDtcJiMzNDsgOiBcJiMzNDtzXCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShjdXJzb3IsIGZvb3RlciwgXCYjMzQ7cGxhaW5fY291bnRcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7b3V0OlxuJiM0MztcdGZyZWUob3V0cHV0KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgcnVuX2R1bXBfY2FzZShjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0KVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4mIzQzO1x0c3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307XG4mIzQzO1x0X191MzIgaW5mb19sZW4gPSBzaXplb2YoaW5mbyk7XG4mIzQzO1x0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgaTtcbiYjNDM7XHRpbnQgZmQgPSAtMTtcbiYjNDM7XG4mIzQzO1x0aWYgKHRlc3QtXHUwMDNlYnRmKSB7XG4mIzQzO1x0XHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCYjMzQ7YnRmX25ld1wmIzM0OykpXG4mIzQzO1x0XHRcdHJldHVybjtcbiYjNDM7XHRcdGlmICghQVNTRVJUX0VRKGJ0Zl9fYWRkX2ludChidGYsIFwmIzM0O3Vuc2lnbmVkIGludFwmIzM0OywgNCwgMCksIDEsXG4mIzQzO1x0XHRcdCAgICAgICBcJiMzNDtidGZfaW50XCYjMzQ7KSB8fFxuJiM0MztcdFx0ICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksIFwmIzM0O2J0Zl9sb2FkXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRvcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTtcbiYjNDM7XHRcdG9wdHMuYnRmX2tleV90eXBlX2lkID0gMTtcbiYjNDM7XHRcdG9wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxO1xuJiM0MztcdH1cbiYjNDM7XHRmZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcJiMzNDtkdW1wX2JhdGNoXCYjMzQ7LCB0ZXN0LVx1MDAzZWtleV9zaXplLFxuJiM0MztcdFx0XHQgICAgdGVzdC1cdTAwM2V2YWx1ZV9zaXplLCB0ZXN0LVx1MDAzZWNvdW50ID86IDEsIFx1MDAyNm9wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGZkLCBcJiMzNDttYXBfY3JlYXRlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRlc3QtXHUwMDNlY291bnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRfX3UzMiBrZXkgPSBpLCB2YWx1ZSA9IGkgKiAzNyAmIzQzOyAxMTtcbiYjNDM7XHRcdHVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaTtcbiYjNDM7XHRcdHZvaWQgKmtleV9wdHIgPSB0ZXN0LVx1MDAzZWtleV9zaXplID09IDEgPyAodm9pZCAqKVx1MDAyNnNob3J0X2tleSA6IFx1MDAyNmtleTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkLCBrZXlfcHRyLCBcdTAwMjZ2YWx1ZSwgQlBGX0FOWSksXG4mIzQzO1x0XHRcdCAgICAgICBcJiMzNDttYXBfdXBkYXRlXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsIFx1MDAyNmluZm8sIFx1MDAyNmluZm9fbGVuKSwgXCYjMzQ7bWFwX2luZm9cJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgdHJ1ZSwgZmFsc2UpO1xuJiM0MztcdGNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgdHJ1ZSwgdHJ1ZSk7XG4mIzQzO291dDpcbiYjNDM7XHRpZiAoZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UoZmQpO1xuJiM0MztcdGJ0Zl9fZnJlZShidGYpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIHRlc3RfYnBmdG9vbF9tYXBfYmF0Y2godm9pZClcbiYjNDM7e1xuJiM0MztcdHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlIGNhc2VzW10gPSB7XG4mIzQzO1x0XHR7IFwmIzM0O2VtcHR5XCYjMzQ7LCAwLCA0LCA0IH0sXG4mIzQzO1x0XHR7IFwmIzM0O3NpbmdsZVwmIzM0OywgMSwgNCwgNCB9LFxuJiM0MztcdFx0eyBcJiMzNDtiZWxvd19iYXRjaFwmIzM0OywgMjU1LCA0LCA0IH0sXG4mIzQzO1x0XHR7IFwmIzM0O2V4YWN0X2JhdGNoXCYjMzQ7LCAyNTYsIDQsIDQgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7YWJvdmVfYmF0Y2hcJiMzNDssIDI1NywgNCwgNCB9LFxuJiM0MztcdFx0eyBcJiMzNDttdWx0aXBsZV9iYXRjaGVzXCYjMzQ7LCAxMDI1LCA0LCA0IH0sXG4mIzQzO1x0XHR7IFwmIzM0O29uZV9ieXRlX2tleVwmIzM0OywgMjU2LCAxLCA0IH0sXG4mIzQzO1x0XHR7IFwmIzM0O29kZF92YWx1ZV9zaXplXCYjMzQ7LCAyNTcsIDQsIDMgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7YnRmX2VtcHR5XCYjMzQ7LCAwLCA0LCA0LCB0cnVlIH0sXG4mIzQzO1x0XHR7IFwmIzM0O2J0Zl9zaW5nbGVcJiMzNDssIDEsIDQsIDQsIHRydWUgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7YnRmX211bHRpcGxlX2JhdGNoZXNcJiMzNDssIDEwMjUsIDQsIDQsIHRydWUgfSxcbiYjNDM7XHR9O1xuJiM0MztcdHVuc2lnbmVkIGludCBpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGNhc2VzKTsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChjYXNlc1tpXS5uYW1lKSlcbiYjNDM7XHRcdFx0cnVuX2R1bXBfY2FzZShcdTAwMjZjYXNlc1tpXSk7XG4mIzQzO31cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMjowOTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBvbmx5IHVzZXItc3BhY2UgdG9vbGluZyBhbmQgc2VsZnRlc3RzIHVuZGVyIHRvb2xzLyAoYnBmdG9vbCBhbmQgQlBGIHNlbGZ0ZXN0cykgYW5kIGRvZXMgbm90IG1ha2UgYW55IGNoYW5nZXMgdG8gdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNWEwYTNlNTE1ZWI0YTZkOGZjMDg5NDY1ODE5NTQwZThmYjQzYjY4MApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDcgMDI6MDk6MzcgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXAuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCmluZGV4IDY4NGE4ZmI3MjQxNDYuLjFlY2NkYzBkMWU5NjMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCkBAIC03NDAsMTUgJiM0Mzs3NDAsMTAgQEAgc3RhdGljIGludCBkb19zaG93KGludCBhcmdjLCBjaGFyICoqYXJndikKIAlyZXR1cm4gZXJybm8gPT0gRU5PRU5UID8gMCA6IC0xOwogfQogCi1zdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAotCQkJIHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsCi0JCQkganNvbl93cml0ZXJfdCAqYnRmX3d0cikKJiM0MztzdGF0aWMgdm9pZCBwcmludF9tYXBfZWxlbSh2b2lkICprZXksIHZvaWQgKnZhbHVlLAomIzQzOwkJCSAgIHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsCiYjNDM7CQkJICAganNvbl93cml0ZXJfdCAqYnRmX3d0cikKIHsKLQlpZiAoYnBmX21hcF9sb29rdXBfZWxlbShmZCwga2V5LCB2YWx1ZSkpIHsKLQkJcHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgZXJybm8pOwotCQlyZXR1cm4gLTE7Ci0JfQotCiAJaWYgKGpzb25fb3V0cHV0KSB7CiAJCXByaW50X2VudHJ5X2pzb24obWFwX2luZm8sIGtleSwgdmFsdWUsIGJ0Zik7CiAJfSBlbHNlIGlmIChidGYpIHsKQEAgLTc2MiwxMCAmIzQzOzc1NywxMDggQEAgc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwKIAl9IGVsc2UgewogCQlwcmludF9lbnRyeV9wbGFpbihtYXBfaW5mbywga2V5LCB2YWx1ZSk7CiAJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAomIzQzOwkJCSBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLAomIzQzOwkJCSBqc29uX3dyaXRlcl90ICpidGZfd3RyKQomIzQzO3sKJiM0MzsJaWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7CiYjNDM7CQlwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KIAomIzQzOwlwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBtYXBfaW5mbywgYnRmLCBidGZfd3RyKTsKIAlyZXR1cm4gMDsKIH0KIAomIzQzOyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfU0laRSAyNTZVCiYjNDM7I2RlZmluZSBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgKDQgKiAxMDI0ICogMTAyNCkKJiM0MzsKJiM0MzsvKiBSZXR1cm4gMSB0byB1c2UgaW5kaXZpZHVhbCBsb29rdXBzLCBidXQgb25seSBiZWZvcmUgYmF0Y2ggdHJhdmVyc2FsIHN0YXJ0cy4gKi8KJiM0MztzdGF0aWMgaW50IGR1bXBfbWFwX2JhdGNoKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwKJiM0MzsJCQkgIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHN0cnVjdCBidGYgKmJ0ZiwKJiM0MzsJCQkgIGpzb25fd3JpdGVyX3QgKnd0ciwgdW5zaWduZWQgaW50ICpudW1fZWxlbXMpCiYjNDM7ewomIzQzOwlfX3UzMiBjYXBhY2l0eSwgY291bnQsIGJhdGNoID0gMCwgbmV4dF9iYXRjaCA9IDAsIGk7CiYjNDM7CXZvaWQgKmtleXMgPSBOVUxMLCAqdmFsdWVzID0gTlVMTCwgKmJ1ZjsKJiM0MzsJYm9vbCBmaXJzdCA9IHRydWUsIGNhbl9mYWxsYmFjayA9IHRydWU7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CS8qIEhhc2ggbG9va3VwIGJhdGNoZXMgbXVzdCBhY2NvbW1vZGF0ZSBhIHdob2xlIGJ1Y2tldC4gUmVzdHJpY3QgdGhlCiYjNDM7CSAqIG9wdGltaXphdGlvbiB0byBtYXBzIHdob3NlIHdvcnN0LWNhc2UgYnVja2V0IGZpdHMgdGhlIG1lbW9yeSBidWRnZXQsCiYjNDM7CSAqIHNvIGEgbGF0ZXIgRU5PU1BDIG5ldmVyIGZvcmNlcyBhIHJlc3RhcnQgYWZ0ZXIgcHJpbnRpbmcgc29tZSBlbnRyaWVzLgomIzQzOwkgKiBEaXZpc2lvbiBhbHNvIGJvdW5kcyB0aGUgYWxsb2NhdGlvbiBtdWx0aXBsaWNhdGlvbnMgb24gMzItYml0IGhvc3RzLgomIzQzOwkgKi8KJiM0MzsJaWYgKGluZm8tJmd0O3R5cGUgIT0gQlBGX01BUF9UWVBFX0hBU0ggfHwgIWluZm8tJmd0O21heF9lbnRyaWVzIHx8CiYjNDM7CSAgICAoX191NjQpaW5mby0mZ3Q7a2V5X3NpemUgJiM0MzsgaW5mby0mZ3Q7dmFsdWVfc2l6ZSAmZ3Q7CiYjNDM7CSAgICBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgLyBpbmZvLSZndDttYXhfZW50cmllcykKJiM0MzsJCXJldHVybiAxOwomIzQzOwomIzQzOwljYXBhY2l0eSA9IG1pbihpbmZvLSZndDttYXhfZW50cmllcywgTUFQX0RVTVBfQkFUQ0hfU0laRSk7CiYjNDM7cmVzaXplOgomIzQzOwlidWYgPSByZWFsbG9jKGtleXMsIChzaXplX3QpY2FwYWNpdHkgKiBpbmZvLSZndDtrZXlfc2l6ZSk7CiYjNDM7CWlmICghYnVmKSB7CiYjNDM7CQllcnIgPSBFTk9NRU07CiYjNDM7CQlnb3RvIGVycm9yOwomIzQzOwl9CiYjNDM7CWtleXMgPSBidWY7CiYjNDM7CWJ1ZiA9IHJlYWxsb2ModmFsdWVzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby0mZ3Q7dmFsdWVfc2l6ZSk7CiYjNDM7CWlmICghYnVmKSB7CiYjNDM7CQllcnIgPSBFTk9NRU07CiYjNDM7CQlnb3RvIGVycm9yOwomIzQzOwl9CiYjNDM7CXZhbHVlcyA9IGJ1ZjsKJiM0MzsKJiM0MzsJd2hpbGUgKHRydWUpIHsKJiM0MzsJCWNvdW50ID0gY2FwYWNpdHk7CiYjNDM7CQllcnIgPSBicGZfbWFwX2xvb2t1cF9iYXRjaChmZCwgZmlyc3QgPyBOVUxMIDogJmFtcDtiYXRjaCwKJiM0MzsJCQkJCSAgICZhbXA7bmV4dF9iYXRjaCwga2V5cywgdmFsdWVzLCAmYW1wO2NvdW50LCBOVUxMKTsKJiM0MzsJCWVyciA9IGVyciA/IGVycm5vIDogMDsKJiM0MzsJCS8qIE9sZGVyIGtlcm5lbHMgcmVqZWN0IHRoZSBjb21tYW5kIGJlZm9yZSB1cGRhdGluZyBjb3VudC4gRG8gbm90CiYjNDM7CQkgKiBpbnNwZWN0IHRoZSBidWZmZXJzIG9uIHRoZXNlIGVycm9ycywgb3IgZmFsbCBiYWNrIGFmdGVyIHByb2dyZXNzLgomIzQzOwkJICovCiYjNDM7CQlpZiAoY2FuX2ZhbGxiYWNrICZhbXA7JmFtcDsgKGVyciA9PSBFSU5WQUwgfHwgZXJyID09IEVPUE5PVFNVUFAgfHwKJiM0MzsJCQkJICAgICBlcnIgPT0gNTI0IC8qIEVOT1RTVVBQICovKSkgewomIzQzOwkJCWVyciA9IDE7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CQljYW5fZmFsbGJhY2sgPSBmYWxzZTsKJiM0MzsJCWlmIChlcnIgPT0gRU5PU1BDKSB7CiYjNDM7CQkJaWYgKGNhcGFjaXR5ID09IGluZm8tJmd0O21heF9lbnRyaWVzKQomIzQzOwkJCQlnb3RvIGVycm9yOwomIzQzOwkJCWNhcGFjaXR5ICYjNDM7PSBtaW4oY2FwYWNpdHksIGluZm8tJmd0O21heF9lbnRyaWVzIC0gY2FwYWNpdHkpOwomIzQzOwkJCS8qIFByZXNlcnZlIHRoZSBpbnB1dCBjdXJzb3I6IHRoZSBvdmVyc2l6ZWQgYnVja2V0IHdhcyBub3QgcmVhZC4gKi8KJiM0MzsJCQlnb3RvIHJlc2l6ZTsKJiM0MzsJCX0KJiM0MzsJCS8qIEluIHBhcnRpY3VsYXIsIEVGQVVMVCBjYW4gbGVhdmUgY291bnQgYW5kIHRoZSBidWZmZXJzIGludmFsaWQuICovCiYjNDM7CQlpZiAoZXJyICZhbXA7JmFtcDsgZXJyICE9IEVOT0VOVCkKJiM0MzsJCQlnb3RvIGVycm9yOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IGNvdW50OyBpJiM0MzsmIzQzOykgewomIzQzOwkJCS8qIEtlZXAgdGhlIGFsaWdubWVudCBwcm92aWRlZCBieSBpbmRpdmlkdWFsIGxvb2t1cHMsIGluY2x1ZGluZwomIzQzOwkJCSAqIGZvciBCVEYgdHlwZXMgd2hvc2UgbWFwIGtleS92YWx1ZSBzaXplIGlzIG5vdCBhbGlnbmVkLgomIzQzOwkJCSAqLwomIzQzOwkJCW1lbWNweShrZXksIGtleXMgJiM0MzsgKHNpemVfdClpICogaW5mby0mZ3Q7a2V5X3NpemUsIGluZm8tJmd0O2tleV9zaXplKTsKJiM0MzsJCQltZW1jcHkodmFsdWUsIHZhbHVlcyAmIzQzOyAoc2l6ZV90KWkgKiBpbmZvLSZndDt2YWx1ZV9zaXplLCBpbmZvLSZndDt2YWx1ZV9zaXplKTsKJiM0MzsJCQlwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cik7CiYjNDM7CQkJKCpudW1fZWxlbXMpJiM0MzsmIzQzOzsKJiM0MzsJCX0KJiM0MzsJCWlmIChlcnIgPT0gRU5PRU5UKSB7CiYjNDM7CQkJZXJyID0gMDsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsJCWZpcnN0ID0gZmFsc2U7CiYjNDM7CQliYXRjaCA9IG5leHRfYmF0Y2g7CiYjNDM7CX0KJiM0MztlcnJvcjoKJiM0MzsJcF9lcnIoJiMzNDtjYW4mIzM5O3QgbG9va3VwIG1hcCBiYXRjaDogJXMmIzM0Oywgc3RyZXJyb3IoZXJyKSk7CiYjNDM7CWVyciA9IC0xOwomIzQzO291dDoKJiM0MzsJZnJlZShrZXlzKTsKJiM0MzsJZnJlZSh2YWx1ZXMpOwomIzQzOwlyZXR1cm4gZXJyOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQgbWFwc19oYXZlX2J0ZihpbnQgKmZkcywgaW50IG5iX2ZkcykKIHsKIAlzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTsKQEAgLTg2OSw2ICYjNDM7OTYyLDkgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCiAJCXBfaW5mbygmIzM0O1dhcm5pbmc6IGNhbm5vdCByZWFkIHZhbHVlcyBmcm9tICVzIG1hcCB3aXRoIHZhbHVlX3NpemUgIT0gOCYjMzQ7LAogCQkgICAgICAgbWFwX3R5cGVfc3RyKTsKIAl9CiYjNDM7CWVyciA9IGR1bXBfbWFwX2JhdGNoKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0ciwgJmFtcDtudW1fZWxlbXMpOwomIzQzOwlpZiAoZXJyICE9IDEpCiYjNDM7CQlnb3RvIGVuZF9kdW1wOwogCXdoaWxlICh0cnVlKSB7CiAJCWVyciA9IGJwZl9tYXBfZ2V0X25leHRfa2V5KGZkLCBwcmV2X2tleSwga2V5KTsKIAkJaWYgKGVycikgewpAQCAtODgxLDYgJiM0Mzs5NzcsNyBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0ciwKIAkJcHJldl9rZXkgPSBrZXk7CiAJfQogCiYjNDM7ZW5kX2R1bXA6CiAJaWYgKHd0cikgewogCQlqc29ud19lbmRfYXJyYXkod3RyKTsJLyogZWxlbWVudHMgKi8KIAkJaWYgKHNob3dfaGVhZGVyKQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uMTM5ZDEzYTQ5ZGNlZgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmMKQEAgLTAsMCAmIzQzOzEsMTg2IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGZ0b29sX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2J0Zi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtjdHlwZS5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgTUFYX0VOVFJJRVMgMTAyNQomIzQzOyNkZWZpbmUgUkVDT1JEX1NJWkUgMjU2CiYjNDM7I2RlZmluZSBPVVRQVVRfU0laRSAoTUFYX0VOVFJJRVMgKiBSRUNPUkRfU0laRSAmIzQzOyAxMDI0KQomIzQzOwomIzQzO3N0cnVjdCBkdW1wX2Nhc2UgewomIzQzOwljb25zdCBjaGFyICpuYW1lOwomIzQzOwl1bnNpZ25lZCBpbnQgY291bnQ7CiYjNDM7CXVuc2lnbmVkIGludCBrZXlfc2l6ZTsKJiM0MzsJdW5zaWduZWQgaW50IHZhbHVlX3NpemU7CiYjNDM7CWJvb2wgYnRmOwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgaGV4X2J5dGVzKGNoYXIgKm91dCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUsIGJvb2wganNvbikKJiM0Mzt7CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gZGF0YTsKJiM0MzsJdW5zaWduZWQgaW50IGk7CiYjNDM7CiYjNDM7CWlmIChqc29uKQomIzQzOwkJKm91dCYjNDM7JiM0MzsgPSAmIzM5O1smIzM5OzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IHNpemU7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoanNvbiAmYW1wOyZhbXA7IGkpCiYjNDM7CQkJKm91dCYjNDM7JiM0MzsgPSAmIzM5OywmIzM5OzsKJiM0MzsJCW91dCAmIzQzOz0gc3ByaW50ZihvdXQsIGpzb24gPyAmIzM0O1wmIzM0OzB4JTAyeFwmIzM0OyYjMzQ7IDogJiMzNDslMDJ4JiMzNDssIGJ5dGVzW2ldKTsKJiM0MzsJfQomIzQzOwlpZiAoanNvbikKJiM0MzsJCSpvdXQmIzQzOyYjNDM7ID0gJiMzOTtdJiMzOTs7CiYjNDM7CSpvdXQgPSAmIzM5O1wwJiMzOTs7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGV4cGVjdGVkX3JlY29yZChjaGFyICpyZWNvcmQsIGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QsCiYjNDM7CQkJICAgIHVuc2lnbmVkIGludCBpbmRleCwgYm9vbCBqc29uKQomIzQzO3sKJiM0MzsJX191MzIga2V5ID0gaW5kZXgsIHZhbHVlID0gaW5kZXggKiAzNyAmIzQzOyAxMTsKJiM0MzsJdW5zaWduZWQgY2hhciBzaG9ydF9rZXkgPSBpbmRleDsKJiM0MzsJY2hhciBrZXlfaGV4WzY0XSwgdmFsdWVfaGV4WzY0XSwgZm9ybWF0dGVkWzk2XTsKJiM0MzsKJiM0MzsJaGV4X2J5dGVzKGtleV9oZXgsIHRlc3QtJmd0O2tleV9zaXplID09IDEgPyAodm9pZCAqKSZhbXA7c2hvcnRfa2V5IDogJmFtcDtrZXksCiYjNDM7CQkgIHRlc3QtJmd0O2tleV9zaXplLCBqc29uKTsKJiM0MzsJaGV4X2J5dGVzKHZhbHVlX2hleCwgJmFtcDt2YWx1ZSwgdGVzdC0mZ3Q7dmFsdWVfc2l6ZSwganNvbik7CiYjNDM7CXNucHJpbnRmKGZvcm1hdHRlZCwgc2l6ZW9mKGZvcm1hdHRlZCksICYjMzQ7e1wmIzM0O2tleVwmIzM0OzoldSxcJiMzNDt2YWx1ZVwmIzM0OzoldX0mIzM0OywKJiM0MzsJCSBrZXksIHZhbHVlKTsKJiM0MzsJaWYgKGpzb24gJmFtcDsmYW1wOyB0ZXN0LSZndDtidGYpCiYjNDM7CQlzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLAomIzQzOwkJCSAmIzM0O3tcJiMzNDtrZXlcJiMzNDs6JXMsXCYjMzQ7dmFsdWVcJiMzNDs6JXMsXCYjMzQ7Zm9ybWF0dGVkXCYjMzQ7OiVzfSYjMzQ7LAomIzQzOwkJCSBrZXlfaGV4LCB2YWx1ZV9oZXgsIGZvcm1hdHRlZCk7CiYjNDM7CWVsc2UgaWYgKGpzb24pCiYjNDM7CQlzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCAmIzM0O3tcJiMzNDtrZXlcJiMzNDs6JXMsXCYjMzQ7dmFsdWVcJiMzNDs6JXN9JiMzNDssCiYjNDM7CQkJIGtleV9oZXgsIHZhbHVlX2hleCk7CiYjNDM7CWVsc2UgaWYgKHRlc3QtJmd0O2J0ZikKJiM0MzsJCXNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsICYjMzQ7JXMmIzM0OywgZm9ybWF0dGVkKTsKJiM0MzsJZWxzZQomIzQzOwkJc25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgJiMzNDtrZXk6JXN2YWx1ZTolcyYjMzQ7LCBrZXlfaGV4LCB2YWx1ZV9oZXgpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBjaGVja19kdW1wKGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QsIF9fdTMyIGlkLCBib29sIGpzb24sIGJvb2wgcHJldHR5KQomIzQzO3sKJiM0MzsJYm9vbCBhcnJheSA9IGpzb24gfHwgdGVzdC0mZ3Q7YnRmOwomIzQzOwljaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIGV4cGVjdGVkW1JFQ09SRF9TSVpFXSwgZm9vdGVyWzY0XTsKJiM0MzsJYm9vbCBzZWVuW01BWF9FTlRSSUVTXSA9IHt9OwomIzQzOwljaGFyICpvdXRwdXQsICpzcmMsICpkc3QsICpjdXJzb3I7CiYjNDM7CXVuc2lnbmVkIGludCBpLCBuOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlvdXRwdXQgPSBjYWxsb2MoMSwgT1VUUFVUX1NJWkUpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIob3V0cHV0LCAmIzM0O2FsbG9jX291dHB1dCYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAmIzM0OyVzbWFwIGR1bXAgaWQgJXUmIzM0OywKJiM0MzsJCSBwcmV0dHkgPyAmIzM0Oy1wICYjMzQ7IDoganNvbiA/ICYjMzQ7LWogJiMzNDsgOiAmIzM0OyYjMzQ7LCBpZCk7CiYjNDM7CWVyciA9IGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7bWFwX2R1bXAmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJLyogSWdub3JlIHByZXNlbnRhdGlvbiB3aGl0ZXNwYWNlLCBidXQgY29tcGFyZSBjb21wbGV0ZSByZWNvcmRzIGFuZCBhbGwKJiM0MzsJICogcHVuY3R1YXRpb24uIEV4cGVjdGVkIGNvbnRlbnRzIGNvbWUgb25seSBmcm9tIHRoZSBpbnB1dCBkYXRhLCBuZXZlcgomIzQzOwkgKiBmcm9tIGFub3RoZXIgbWFwIHdhbGsgb3IgYnBmdG9vbCBpbnZvY2F0aW9uLgomIzQzOwkgKi8KJiM0MzsJZm9yIChzcmMgPSBvdXRwdXQsIGRzdCA9IG91dHB1dDsgKnNyYzsgc3JjJiM0MzsmIzQzOykKJiM0MzsJCWlmICghaXNzcGFjZSgodW5zaWduZWQgY2hhcikqc3JjKSkKJiM0MzsJCQkqZHN0JiM0MzsmIzQzOyA9ICpzcmM7CiYjNDM7CSpkc3QgPSAmIzM5O1wwJiMzOTs7CiYjNDM7CWN1cnNvciA9IG91dHB1dDsKJiM0MzsJaWYgKGFycmF5KSB7CiYjNDM7CQlpZiAoIUFTU0VSVF9FUSgqY3Vyc29yLCAmIzM5O1smIzM5OywgJiMzNDthcnJheV9zdGFydCYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWN1cnNvciYjNDM7JiM0Mzs7CiYjNDM7CX0KJiM0MzsJZm9yIChuID0gMDsgbiAmbHQ7IHRlc3QtJmd0O2NvdW50OyBuJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKGFycmF5ICZhbXA7JmFtcDsgbikgewomIzQzOwkJCWlmICghQVNTRVJUX0VRKCpjdXJzb3IsICYjMzk7LCYjMzk7LCAmIzM0O3JlY29yZF9zZXBhcmF0b3ImIzM0OykpCiYjNDM7CQkJCWdvdG8gb3V0OwomIzQzOwkJCWN1cnNvciYjNDM7JiM0Mzs7CiYjNDM7CQl9CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgdGVzdC0mZ3Q7Y291bnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJaWYgKHNlZW5baV0pCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCWV4cGVjdGVkX3JlY29yZChleHBlY3RlZCwgdGVzdCwgaSwganNvbik7CiYjNDM7CQkJaWYgKCFzdHJuY21wKGN1cnNvciwgZXhwZWN0ZWQsIHN0cmxlbihleHBlY3RlZCkpKQomIzQzOwkJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsJCWlmICghQVNTRVJUX0xUKGksIHRlc3QtJmd0O2NvdW50LCAmIzM0O3VuaXF1ZV9leHBlY3RlZF9yZWNvcmQmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlzZWVuW2ldID0gdHJ1ZTsKJiM0MzsJCWN1cnNvciAmIzQzOz0gc3RybGVuKGV4cGVjdGVkKTsKJiM0MzsJfQomIzQzOwlpZiAoYXJyYXkpIHsKJiM0MzsJCUFTU0VSVF9TVFJFUShjdXJzb3IsICYjMzQ7XSYjMzQ7LCAmIzM0O2FycmF5X2VuZF9hbmRfY291bnQmIzM0Oyk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlzbnByaW50Zihmb290ZXIsIHNpemVvZihmb290ZXIpLCAmIzM0O0ZvdW5kJXVlbGVtZW50JXMmIzM0OywgdGVzdC0mZ3Q7Y291bnQsCiYjNDM7CQkJIHRlc3QtJmd0O2NvdW50ID09IDEgPyAmIzM0OyYjMzQ7IDogJiMzNDtzJiMzNDspOwomIzQzOwkJQVNTRVJUX1NUUkVRKGN1cnNvciwgZm9vdGVyLCAmIzM0O3BsYWluX2NvdW50JiMzNDspOwomIzQzOwl9CiYjNDM7b3V0OgomIzQzOwlmcmVlKG91dHB1dCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJ1bl9kdW1wX2Nhc2UoY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdCkKJiM0Mzt7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpOwomIzQzOwlzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTsKJiM0MzsJX191MzIgaW5mb19sZW4gPSBzaXplb2YoaW5mbyk7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7CiYjNDM7CXVuc2lnbmVkIGludCBpOwomIzQzOwlpbnQgZmQgPSAtMTsKJiM0MzsKJiM0MzsJaWYgKHRlc3QtJmd0O2J0ZikgewomIzQzOwkJYnRmID0gYnRmX19uZXdfZW1wdHkoKTsKJiM0MzsJCWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7YnRmX25ldyYjMzQ7KSkKJiM0MzsJCQlyZXR1cm47CiYjNDM7CQlpZiAoIUFTU0VSVF9FUShidGZfX2FkZF9pbnQoYnRmLCAmIzM0O3Vuc2lnbmVkIGludCYjMzQ7LCA0LCAwKSwgMSwKJiM0MzsJCQkgICAgICAgJiMzNDtidGZfaW50JiMzNDspIHx8CiYjNDM7CQkgICAgIUFTU0VSVF9PSyhidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKSwgJiMzNDtidGZfbG9hZCYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCW9wdHMuYnRmX2ZkID0gYnRmX19mZChidGYpOwomIzQzOwkJb3B0cy5idGZfa2V5X3R5cGVfaWQgPSAxOwomIzQzOwkJb3B0cy5idGZfdmFsdWVfdHlwZV9pZCA9IDE7CiYjNDM7CX0KJiM0MzsJZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgJiMzNDtkdW1wX2JhdGNoJiMzNDssIHRlc3QtJmd0O2tleV9zaXplLAomIzQzOwkJCSAgICB0ZXN0LSZndDt2YWx1ZV9zaXplLCB0ZXN0LSZndDtjb3VudCA/OiAxLCAmYW1wO29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChmZCwgJiMzNDttYXBfY3JlYXRlJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyB0ZXN0LSZndDtjb3VudDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCV9fdTMyIGtleSA9IGksIHZhbHVlID0gaSAqIDM3ICYjNDM7IDExOwomIzQzOwkJdW5zaWduZWQgY2hhciBzaG9ydF9rZXkgPSBpOwomIzQzOwkJdm9pZCAqa2V5X3B0ciA9IHRlc3QtJmd0O2tleV9zaXplID09IDEgPyAodm9pZCAqKSZhbXA7c2hvcnRfa2V5IDogJmFtcDtrZXk7CiYjNDM7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkLCBrZXlfcHRyLCAmYW1wO3ZhbHVlLCBCUEZfQU5ZKSwKJiM0MzsJCQkgICAgICAgJiMzNDttYXBfdXBkYXRlJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CWlmICghQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsICZhbXA7aW5mbywgJmFtcDtpbmZvX2xlbiksICYjMzQ7bWFwX2luZm8mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJY2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCBmYWxzZSwgZmFsc2UpOwomIzQzOwljaGVja19kdW1wKHRlc3QsIGluZm8uaWQsIHRydWUsIGZhbHNlKTsKJiM0MzsJY2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCB0cnVlKTsKJiM0MztvdXQ6CiYjNDM7CWlmIChmZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoZmQpOwomIzQzOwlidGZfX2ZyZWUoYnRmKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2JhdGNoKHZvaWQpCiYjNDM7ewomIzQzOwlzdGF0aWMgY29uc3Qgc3RydWN0IGR1bXBfY2FzZSBjYXNlc1tdID0gewomIzQzOwkJeyAmIzM0O2VtcHR5JiMzNDssIDAsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDtzaW5nbGUmIzM0OywgMSwgNCwgNCB9LAomIzQzOwkJeyAmIzM0O2JlbG93X2JhdGNoJiMzNDssIDI1NSwgNCwgNCB9LAomIzQzOwkJeyAmIzM0O2V4YWN0X2JhdGNoJiMzNDssIDI1NiwgNCwgNCB9LAomIzQzOwkJeyAmIzM0O2Fib3ZlX2JhdGNoJiMzNDssIDI1NywgNCwgNCB9LAomIzQzOwkJeyAmIzM0O211bHRpcGxlX2JhdGNoZXMmIzM0OywgMTAyNSwgNCwgNCB9LAomIzQzOwkJeyAmIzM0O29uZV9ieXRlX2tleSYjMzQ7LCAyNTYsIDEsIDQgfSwKJiM0MzsJCXsgJiMzNDtvZGRfdmFsdWVfc2l6ZSYjMzQ7LCAyNTcsIDQsIDMgfSwKJiM0MzsJCXsgJiMzNDtidGZfZW1wdHkmIzM0OywgMCwgNCwgNCwgdHJ1ZSB9LAomIzQzOwkJeyAmIzM0O2J0Zl9zaW5nbGUmIzM0OywgMSwgNCwgNCwgdHJ1ZSB9LAomIzQzOwkJeyAmIzM0O2J0Zl9tdWx0aXBsZV9iYXRjaGVzJiMzNDssIDEwMjUsIDQsIDQsIHRydWUgfSwKJiM0MzsJfTsKJiM0MzsJdW5zaWduZWQgaW50IGk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBBUlJBWV9TSVpFKGNhc2VzKTsgaSYjNDM7JiM0MzspCiYjNDM7CQlpZiAodGVzdF9fc3RhcnRfc3VidGVzdChjYXNlc1tpXS5uYW1lKSkKJiM0MzsJCQlydW5fZHVtcF9jYXNlKCZhbXA7Y2FzZXNbaV0pOwomIzQzO30KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDI6MDk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjk3OQoJCQkJCQkJb3V0cHV0OiA3NwoJCQkJCQkJdGhvdWdodHM6IDQzNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipQYXRjaCBBbmFseXNpczogV29ydGhGdXp6aW5nIERldGVybWluYXRpb24qKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gVGhlIGRpZmYgYWZmZWN0cyBgdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNgIGFuZCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY2AuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBydW4gdGhyb3VnaCB0aGUgbmVnYXRpdmUgY3JpdGVyaWEgY2hlY2tsaXN0LiBJIG5lZWQgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgY2hhbmdlIHdhcnJhbnRzIGZ1enppbmcuCgpUaGUgY3JpdGVyaWEgc2F5cyBgV29ydGhGdXp6aW5nPWZhbHNlYCBpZiAqYWxsKiBtb2RpZmllZCBjb2RlIGZhbGxzIHVuZGVyIHNwZWNpZmljIGNhdGVnb3JpZXMuIFNwZWNpZmljYWxseSwgSSBuZWVkIHRvIGNoZWNrIGZvciBub24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzLCBsaWtlIGRvY3VtZW50YXRpb24sIGNvbW1lbnRzLCBzcGVsbGluZyBmaXhlcywgb3IgdXNlci1zcGFjZSBjb2RlIHRoYXQgZG9lc24mIzM5O3QgaW1wYWN0IHRoZSBrZXJuZWwgaW1hZ2Ugb3IgbW9kdWxlcy4KCkEgcXVpY2sgZ2xhbmNlIHRlbGxzIG1lIGJvdGggZmlsZXMgYXJlIHVuZGVyIGB0b29scy9gLCBzbyB0aGV5JiMzOTtyZSB1c2VyLXNwYWNlLiBJIG5lZWQgdG8gYmUgYWJzb2x1dGVseSBzdXJlIHRob3VnaCwgc28gbGV0JiMzOTtzIGRvdWJsZS1jaGVjayBieSBsb29raW5nIGRpcmVjdGx5IGF0IHRoZSBkaWZmLCBubyBuZWVkIHRvIGludm9sdmUgZ2l0IGNvbW1hbmRzIGZvciBzdWNoIGEgc21hbGwgY2hhbmdlLiBUaGUgZGlmZiBjb25maXJtcyBteSBpbml0aWFsIGFzc2Vzc21lbnQ6IG9ubHkgdGhvc2UgdHdvIGZpbGVzLgoKR2l2ZW4gdGhhdCB0aGVzZSBhcmUgc3RyaWN0bHkgd2l0aGluIHRoZSBgdG9vbHMvYCBkaXJlY3RvcnksIGFuZCBpdCYjMzk7cyBhbGwgdXNlci1zcGFjZSwgKndpdGhvdXQqIGFmZmVjdGluZyB0aGUga2VybmVsIGltYWdlIG9yIG1vZHVsZXMsIEkmIzM5O20gY29uZmlkZW50IGluIHNheWluZyB0aGlzIHBhdGNoIGRvZXNuJiMzOTt0IHdhcnJhbnQgZnV6emluZy4KClNvLCBJJiMzOTttIGdvaW5nIHdpdGg6CgoqICAgYFdvcnRoRnV6emluZzogZmFsc2VgCiogICBgRm9jdXNTeW1ib2xzOiBbXWAgKG5vdGhpbmcgdG8gc3BlY2lmaWNhbGx5IHRhcmdldCkKKiAgIGBFbmFibGVDb25maWdzOiBbXWAgKG5vIHNwZWNpZmljIGNvbmZpZyBvcHRpb25zIG5lZWRlZCkKKiAgIGBSZWFzb25pbmc6IFRoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXItc3BhY2UgY29kZSB3aXRoaW4gdG9vbHMvICh0b29scy9icGYvYnBmdG9vbC9tYXAuYyBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guYyksIHdoaWNoIGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlIG9yIGtlcm5lbCBtb2R1bGVzLmAKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMjowOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFtdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlci1zcGFjZSB0b29saW5nIGFuZCBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvIChicGZ0b29sIGFuZCBCUEYgc2VsZnRlc3RzKSBhbmQgZG9lcyBub3QgbWFrZSBhbnkgY2hhbmdlcyB0byB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlci1zcGFjZSB0b29saW5nIGFuZCBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvIChicGZ0b29sIGFuZCBCUEYgc2VsZnRlc3RzKSBhbmQgZG9lcyBub3QgbWFrZSBhbnkgY2hhbmdlcyB0byB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDI6MDk8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDAyOjA5OjM5LjI0MjQxODM5MloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwMzE3NjYxMjc1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xpbmcgYW5kIHNlbGZ0ZXN0cyB1bmRlciB0b29scy8gKGJwZnRvb2wgYW5kIEJQRiBzZWxmdGVzdHMpIGFuZCBkb2VzIG5vdCBtYWtlIGFueSBjaGFuZ2VzIHRvIHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDI6MDk6MzkuMjQyNDIyMTkyWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTk4NzgwNTYyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgNWEwYTNlNTE1ZWI0YTZkOGZjMDg5NDY1ODE5NTQwZThmYjQzYjY4MFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgTW9uIFNlcCA3IDAyOjA5OjM3IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcXG5pbmRleCA2ODRhOGZiNzI0MTQ2Li4xZWNjZGMwZDFlOTYzIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcXG5AQCAtNzQwLDE1ICs3NDAsMTAgQEAgc3RhdGljIGludCBkb19zaG93KGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0cmV0dXJuIGVycm5vID09IEVOT0VOVCA/IDAgOiAtMTtcXG4gfVxcbiBcXG4tc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcXG4tXFx0XFx0XFx0IHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsXFxuLVxcdFxcdFxcdCBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxcbitzdGF0aWMgdm9pZCBwcmludF9tYXBfZWxlbSh2b2lkICprZXksIHZvaWQgKnZhbHVlLFxcbitcXHRcXHRcXHQgICBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxcbitcXHRcXHRcXHQgICBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxcbiB7XFxuLVxcdGlmIChicGZfbWFwX2xvb2t1cF9lbGVtKGZkLCBrZXksIHZhbHVlKSkge1xcbi1cXHRcXHRwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7XFxuLVxcdFxcdHJldHVybiAtMTtcXG4tXFx0fVxcbi1cXG4gXFx0aWYgKGpzb25fb3V0cHV0KSB7XFxuIFxcdFxcdHByaW50X2VudHJ5X2pzb24obWFwX2luZm8sIGtleSwgdmFsdWUsIGJ0Zik7XFxuIFxcdH0gZWxzZSBpZiAoYnRmKSB7XFxuQEAgLTc2MiwxMCArNzU3LDEwOCBAQCBzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxcbiBcXHR9IGVsc2Uge1xcbiBcXHRcXHRwcmludF9lbnRyeV9wbGFpbihtYXBfaW5mbywga2V5LCB2YWx1ZSk7XFxuIFxcdH1cXG4rfVxcbitcXG4rc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcXG4rXFx0XFx0XFx0IHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsXFxuK1xcdFxcdFxcdCBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxcbit7XFxuK1xcdGlmIChicGZfbWFwX2xvb2t1cF9lbGVtKGZkLCBrZXksIHZhbHVlKSkge1xcbitcXHRcXHRwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7XFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0fVxcbiBcXG4rXFx0cHJpbnRfbWFwX2VsZW0oa2V5LCB2YWx1ZSwgbWFwX2luZm8sIGJ0ZiwgYnRmX3d0cik7XFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbisjZGVmaW5lIE1BUF9EVU1QX0JBVENIX1NJWkUgMjU2VVxcbisjZGVmaW5lIE1BUF9EVU1QX0JBVENIX01BWF9CWVRFUyAoNCAqIDEwMjQgKiAxMDI0KVxcbitcXG4rLyogUmV0dXJuIDEgdG8gdXNlIGluZGl2aWR1YWwgbG9va3VwcywgYnV0IG9ubHkgYmVmb3JlIGJhdGNoIHRyYXZlcnNhbCBzdGFydHMuICovXFxuK3N0YXRpYyBpbnQgZHVtcF9tYXBfYmF0Y2goaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxcbitcXHRcXHRcXHQgIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHN0cnVjdCBidGYgKmJ0ZixcXG4rXFx0XFx0XFx0ICBqc29uX3dyaXRlcl90ICp3dHIsIHVuc2lnbmVkIGludCAqbnVtX2VsZW1zKVxcbit7XFxuK1xcdF9fdTMyIGNhcGFjaXR5LCBjb3VudCwgYmF0Y2ggPSAwLCBuZXh0X2JhdGNoID0gMCwgaTtcXG4rXFx0dm9pZCAqa2V5cyA9IE5VTEwsICp2YWx1ZXMgPSBOVUxMLCAqYnVmO1xcbitcXHRib29sIGZpcnN0ID0gdHJ1ZSwgY2FuX2ZhbGxiYWNrID0gdHJ1ZTtcXG4rXFx0aW50IGVycjtcXG4rXFxuK1xcdC8qIEhhc2ggbG9va3VwIGJhdGNoZXMgbXVzdCBhY2NvbW1vZGF0ZSBhIHdob2xlIGJ1Y2tldC4gUmVzdHJpY3QgdGhlXFxuK1xcdCAqIG9wdGltaXphdGlvbiB0byBtYXBzIHdob3NlIHdvcnN0LWNhc2UgYnVja2V0IGZpdHMgdGhlIG1lbW9yeSBidWRnZXQsXFxuK1xcdCAqIHNvIGEgbGF0ZXIgRU5PU1BDIG5ldmVyIGZvcmNlcyBhIHJlc3RhcnQgYWZ0ZXIgcHJpbnRpbmcgc29tZSBlbnRyaWVzLlxcbitcXHQgKiBEaXZpc2lvbiBhbHNvIGJvdW5kcyB0aGUgYWxsb2NhdGlvbiBtdWx0aXBsaWNhdGlvbnMgb24gMzItYml0IGhvc3RzLlxcbitcXHQgKi9cXG4rXFx0aWYgKGluZm8tXFx1MDAzZXR5cGUgIT0gQlBGX01BUF9UWVBFX0hBU0ggfHwgIWluZm8tXFx1MDAzZW1heF9lbnRyaWVzIHx8XFxuK1xcdCAgICAoX191NjQpaW5mby1cXHUwMDNla2V5X3NpemUgKyBpbmZvLVxcdTAwM2V2YWx1ZV9zaXplIFxcdTAwM2VcXG4rXFx0ICAgIE1BUF9EVU1QX0JBVENIX01BWF9CWVRFUyAvIGluZm8tXFx1MDAzZW1heF9lbnRyaWVzKVxcbitcXHRcXHRyZXR1cm4gMTtcXG4rXFxuK1xcdGNhcGFjaXR5ID0gbWluKGluZm8tXFx1MDAzZW1heF9lbnRyaWVzLCBNQVBfRFVNUF9CQVRDSF9TSVpFKTtcXG4rcmVzaXplOlxcbitcXHRidWYgPSByZWFsbG9jKGtleXMsIChzaXplX3QpY2FwYWNpdHkgKiBpbmZvLVxcdTAwM2VrZXlfc2l6ZSk7XFxuK1xcdGlmICghYnVmKSB7XFxuK1xcdFxcdGVyciA9IEVOT01FTTtcXG4rXFx0XFx0Z290byBlcnJvcjtcXG4rXFx0fVxcbitcXHRrZXlzID0gYnVmO1xcbitcXHRidWYgPSByZWFsbG9jKHZhbHVlcywgKHNpemVfdCljYXBhY2l0eSAqIGluZm8tXFx1MDAzZXZhbHVlX3NpemUpO1xcbitcXHRpZiAoIWJ1Zikge1xcbitcXHRcXHRlcnIgPSBFTk9NRU07XFxuK1xcdFxcdGdvdG8gZXJyb3I7XFxuK1xcdH1cXG4rXFx0dmFsdWVzID0gYnVmO1xcbitcXG4rXFx0d2hpbGUgKHRydWUpIHtcXG4rXFx0XFx0Y291bnQgPSBjYXBhY2l0eTtcXG4rXFx0XFx0ZXJyID0gYnBmX21hcF9sb29rdXBfYmF0Y2goZmQsIGZpcnN0ID8gTlVMTCA6IFxcdTAwMjZiYXRjaCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgXFx1MDAyNm5leHRfYmF0Y2gsIGtleXMsIHZhbHVlcywgXFx1MDAyNmNvdW50LCBOVUxMKTtcXG4rXFx0XFx0ZXJyID0gZXJyID8gZXJybm8gOiAwO1xcbitcXHRcXHQvKiBPbGRlciBrZXJuZWxzIHJlamVjdCB0aGUgY29tbWFuZCBiZWZvcmUgdXBkYXRpbmcgY291bnQuIERvIG5vdFxcbitcXHRcXHQgKiBpbnNwZWN0IHRoZSBidWZmZXJzIG9uIHRoZXNlIGVycm9ycywgb3IgZmFsbCBiYWNrIGFmdGVyIHByb2dyZXNzLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKGNhbl9mYWxsYmFjayBcXHUwMDI2XFx1MDAyNiAoZXJyID09IEVJTlZBTCB8fCBlcnIgPT0gRU9QTk9UU1VQUCB8fFxcbitcXHRcXHRcXHRcXHQgICAgIGVyciA9PSA1MjQgLyogRU5PVFNVUFAgKi8pKSB7XFxuK1xcdFxcdFxcdGVyciA9IDE7XFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcdFxcdGNhbl9mYWxsYmFjayA9IGZhbHNlO1xcbitcXHRcXHRpZiAoZXJyID09IEVOT1NQQykge1xcbitcXHRcXHRcXHRpZiAoY2FwYWNpdHkgPT0gaW5mby1cXHUwMDNlbWF4X2VudHJpZXMpXFxuK1xcdFxcdFxcdFxcdGdvdG8gZXJyb3I7XFxuK1xcdFxcdFxcdGNhcGFjaXR5ICs9IG1pbihjYXBhY2l0eSwgaW5mby1cXHUwMDNlbWF4X2VudHJpZXMgLSBjYXBhY2l0eSk7XFxuK1xcdFxcdFxcdC8qIFByZXNlcnZlIHRoZSBpbnB1dCBjdXJzb3I6IHRoZSBvdmVyc2l6ZWQgYnVja2V0IHdhcyBub3QgcmVhZC4gKi9cXG4rXFx0XFx0XFx0Z290byByZXNpemU7XFxuK1xcdFxcdH1cXG4rXFx0XFx0LyogSW4gcGFydGljdWxhciwgRUZBVUxUIGNhbiBsZWF2ZSBjb3VudCBhbmQgdGhlIGJ1ZmZlcnMgaW52YWxpZC4gKi9cXG4rXFx0XFx0aWYgKGVyciBcXHUwMDI2XFx1MDAyNiBlcnIgIT0gRU5PRU5UKVxcbitcXHRcXHRcXHRnb3RvIGVycm9yO1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgY291bnQ7IGkrKykge1xcbitcXHRcXHRcXHQvKiBLZWVwIHRoZSBhbGlnbm1lbnQgcHJvdmlkZWQgYnkgaW5kaXZpZHVhbCBsb29rdXBzLCBpbmNsdWRpbmdcXG4rXFx0XFx0XFx0ICogZm9yIEJURiB0eXBlcyB3aG9zZSBtYXAga2V5L3ZhbHVlIHNpemUgaXMgbm90IGFsaWduZWQuXFxuK1xcdFxcdFxcdCAqL1xcbitcXHRcXHRcXHRtZW1jcHkoa2V5LCBrZXlzICsgKHNpemVfdClpICogaW5mby1cXHUwMDNla2V5X3NpemUsIGluZm8tXFx1MDAzZWtleV9zaXplKTtcXG4rXFx0XFx0XFx0bWVtY3B5KHZhbHVlLCB2YWx1ZXMgKyAoc2l6ZV90KWkgKiBpbmZvLVxcdTAwM2V2YWx1ZV9zaXplLCBpbmZvLVxcdTAwM2V2YWx1ZV9zaXplKTtcXG4rXFx0XFx0XFx0cHJpbnRfbWFwX2VsZW0oa2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpO1xcbitcXHRcXHRcXHQoKm51bV9lbGVtcykrKztcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoZXJyID09IEVOT0VOVCkge1xcbitcXHRcXHRcXHRlcnIgPSAwO1xcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0fVxcbitcXHRcXHRmaXJzdCA9IGZhbHNlO1xcbitcXHRcXHRiYXRjaCA9IG5leHRfYmF0Y2g7XFxuK1xcdH1cXG4rZXJyb3I6XFxuK1xcdHBfZXJyKFxcXCJjYW4ndCBsb29rdXAgbWFwIGJhdGNoOiAlc1xcXCIsIHN0cmVycm9yKGVycikpO1xcbitcXHRlcnIgPSAtMTtcXG4rb3V0OlxcbitcXHRmcmVlKGtleXMpO1xcbitcXHRmcmVlKHZhbHVlcyk7XFxuK1xcdHJldHVybiBlcnI7XFxuK31cXG4rXFxuIHN0YXRpYyBpbnQgbWFwc19oYXZlX2J0ZihpbnQgKmZkcywgaW50IG5iX2ZkcylcXG4ge1xcbiBcXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcXG5AQCAtODY5LDYgKzk2Miw5IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxcbiBcXHRcXHRwX2luZm8oXFxcIldhcm5pbmc6IGNhbm5vdCByZWFkIHZhbHVlcyBmcm9tICVzIG1hcCB3aXRoIHZhbHVlX3NpemUgIT0gOFxcXCIsXFxuIFxcdFxcdCAgICAgICBtYXBfdHlwZV9zdHIpO1xcbiBcXHR9XFxuK1xcdGVyciA9IGR1bXBfbWFwX2JhdGNoKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0ciwgXFx1MDAyNm51bV9lbGVtcyk7XFxuK1xcdGlmIChlcnIgIT0gMSlcXG4rXFx0XFx0Z290byBlbmRfZHVtcDtcXG4gXFx0d2hpbGUgKHRydWUpIHtcXG4gXFx0XFx0ZXJyID0gYnBmX21hcF9nZXRfbmV4dF9rZXkoZmQsIHByZXZfa2V5LCBrZXkpO1xcbiBcXHRcXHRpZiAoZXJyKSB7XFxuQEAgLTg4MSw2ICs5NzcsNyBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcXG4gXFx0XFx0cHJldl9rZXkgPSBrZXk7XFxuIFxcdH1cXG4gXFxuK2VuZF9kdW1wOlxcbiBcXHRpZiAod3RyKSB7XFxuIFxcdFxcdGpzb253X2VuZF9hcnJheSh3dHIpO1xcdC8qIGVsZW1lbnRzICovXFxuIFxcdFxcdGlmIChzaG93X2hlYWRlcilcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjEzOWQxM2E0OWRjZWZcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY1xcbkBAIC0wLDAgKzEsMTg2IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGZ0b29sX2hlbHBlcnMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9idGYuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2N0eXBlLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIE1BWF9FTlRSSUVTIDEwMjVcXG4rI2RlZmluZSBSRUNPUkRfU0laRSAyNTZcXG4rI2RlZmluZSBPVVRQVVRfU0laRSAoTUFYX0VOVFJJRVMgKiBSRUNPUkRfU0laRSArIDEwMjQpXFxuK1xcbitzdHJ1Y3QgZHVtcF9jYXNlIHtcXG4rXFx0Y29uc3QgY2hhciAqbmFtZTtcXG4rXFx0dW5zaWduZWQgaW50IGNvdW50O1xcbitcXHR1bnNpZ25lZCBpbnQga2V5X3NpemU7XFxuK1xcdHVuc2lnbmVkIGludCB2YWx1ZV9zaXplO1xcbitcXHRib29sIGJ0ZjtcXG4rfTtcXG4rXFxuK3N0YXRpYyB2b2lkIGhleF9ieXRlcyhjaGFyICpvdXQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCBib29sIGpzb24pXFxuK3tcXG4rXFx0Y29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSBkYXRhO1xcbitcXHR1bnNpZ25lZCBpbnQgaTtcXG4rXFxuK1xcdGlmIChqc29uKVxcbitcXHRcXHQqb3V0KysgPSAnWyc7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBzaXplOyBpKyspIHtcXG4rXFx0XFx0aWYgKGpzb24gXFx1MDAyNlxcdTAwMjYgaSlcXG4rXFx0XFx0XFx0Km91dCsrID0gJywnO1xcbitcXHRcXHRvdXQgKz0gc3ByaW50ZihvdXQsIGpzb24gPyBcXFwiXFxcXFxcXCIweCUwMnhcXFxcXFxcIlxcXCIgOiBcXFwiJTAyeFxcXCIsIGJ5dGVzW2ldKTtcXG4rXFx0fVxcbitcXHRpZiAoanNvbilcXG4rXFx0XFx0Km91dCsrID0gJ10nO1xcbitcXHQqb3V0ID0gJ1xcXFwwJztcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgZXhwZWN0ZWRfcmVjb3JkKGNoYXIgKnJlY29yZCwgY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdCxcXG4rXFx0XFx0XFx0ICAgIHVuc2lnbmVkIGludCBpbmRleCwgYm9vbCBqc29uKVxcbit7XFxuK1xcdF9fdTMyIGtleSA9IGluZGV4LCB2YWx1ZSA9IGluZGV4ICogMzcgKyAxMTtcXG4rXFx0dW5zaWduZWQgY2hhciBzaG9ydF9rZXkgPSBpbmRleDtcXG4rXFx0Y2hhciBrZXlfaGV4WzY0XSwgdmFsdWVfaGV4WzY0XSwgZm9ybWF0dGVkWzk2XTtcXG4rXFxuK1xcdGhleF9ieXRlcyhrZXlfaGV4LCB0ZXN0LVxcdTAwM2VrZXlfc2l6ZSA9PSAxID8gKHZvaWQgKilcXHUwMDI2c2hvcnRfa2V5IDogXFx1MDAyNmtleSxcXG4rXFx0XFx0ICB0ZXN0LVxcdTAwM2VrZXlfc2l6ZSwganNvbik7XFxuK1xcdGhleF9ieXRlcyh2YWx1ZV9oZXgsIFxcdTAwMjZ2YWx1ZSwgdGVzdC1cXHUwMDNldmFsdWVfc2l6ZSwganNvbik7XFxuK1xcdHNucHJpbnRmKGZvcm1hdHRlZCwgc2l6ZW9mKGZvcm1hdHRlZCksIFxcXCJ7XFxcXFxcXCJrZXlcXFxcXFxcIjoldSxcXFxcXFxcInZhbHVlXFxcXFxcXCI6JXV9XFxcIixcXG4rXFx0XFx0IGtleSwgdmFsdWUpO1xcbitcXHRpZiAoanNvbiBcXHUwMDI2XFx1MDAyNiB0ZXN0LVxcdTAwM2VidGYpXFxuK1xcdFxcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsXFxuK1xcdFxcdFxcdCBcXFwie1xcXFxcXFwia2V5XFxcXFxcXCI6JXMsXFxcXFxcXCJ2YWx1ZVxcXFxcXFwiOiVzLFxcXFxcXFwiZm9ybWF0dGVkXFxcXFxcXCI6JXN9XFxcIixcXG4rXFx0XFx0XFx0IGtleV9oZXgsIHZhbHVlX2hleCwgZm9ybWF0dGVkKTtcXG4rXFx0ZWxzZSBpZiAoanNvbilcXG4rXFx0XFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgXFxcIntcXFxcXFxcImtleVxcXFxcXFwiOiVzLFxcXFxcXFwidmFsdWVcXFxcXFxcIjolc31cXFwiLFxcbitcXHRcXHRcXHQga2V5X2hleCwgdmFsdWVfaGV4KTtcXG4rXFx0ZWxzZSBpZiAodGVzdC1cXHUwMDNlYnRmKVxcbitcXHRcXHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCBcXFwiJXNcXFwiLCBmb3JtYXR0ZWQpO1xcbitcXHRlbHNlXFxuK1xcdFxcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFxcXCJrZXk6JXN2YWx1ZTolc1xcXCIsIGtleV9oZXgsIHZhbHVlX2hleCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNoZWNrX2R1bXAoY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdCwgX191MzIgaWQsIGJvb2wganNvbiwgYm9vbCBwcmV0dHkpXFxuK3tcXG4rXFx0Ym9vbCBhcnJheSA9IGpzb24gfHwgdGVzdC1cXHUwMDNlYnRmO1xcbitcXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIGV4cGVjdGVkW1JFQ09SRF9TSVpFXSwgZm9vdGVyWzY0XTtcXG4rXFx0Ym9vbCBzZWVuW01BWF9FTlRSSUVTXSA9IHt9O1xcbitcXHRjaGFyICpvdXRwdXQsICpzcmMsICpkc3QsICpjdXJzb3I7XFxuK1xcdHVuc2lnbmVkIGludCBpLCBuO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0b3V0cHV0ID0gY2FsbG9jKDEsIE9VVFBVVF9TSVpFKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKG91dHB1dCwgXFxcImFsbG9jX291dHB1dFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXFxcIiVzbWFwIGR1bXAgaWQgJXVcXFwiLFxcbitcXHRcXHQgcHJldHR5ID8gXFxcIi1wIFxcXCIgOiBqc29uID8gXFxcIi1qIFxcXCIgOiBcXFwiXFxcIiwgaWQpO1xcbitcXHRlcnIgPSBnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwibWFwX2R1bXBcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdC8qIElnbm9yZSBwcmVzZW50YXRpb24gd2hpdGVzcGFjZSwgYnV0IGNvbXBhcmUgY29tcGxldGUgcmVjb3JkcyBhbmQgYWxsXFxuK1xcdCAqIHB1bmN0dWF0aW9uLiBFeHBlY3RlZCBjb250ZW50cyBjb21lIG9ubHkgZnJvbSB0aGUgaW5wdXQgZGF0YSwgbmV2ZXJcXG4rXFx0ICogZnJvbSBhbm90aGVyIG1hcCB3YWxrIG9yIGJwZnRvb2wgaW52b2NhdGlvbi5cXG4rXFx0ICovXFxuK1xcdGZvciAoc3JjID0gb3V0cHV0LCBkc3QgPSBvdXRwdXQ7ICpzcmM7IHNyYysrKVxcbitcXHRcXHRpZiAoIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnNyYykpXFxuK1xcdFxcdFxcdCpkc3QrKyA9ICpzcmM7XFxuK1xcdCpkc3QgPSAnXFxcXDAnO1xcbitcXHRjdXJzb3IgPSBvdXRwdXQ7XFxuK1xcdGlmIChhcnJheSkge1xcbitcXHRcXHRpZiAoIUFTU0VSVF9FUSgqY3Vyc29yLCAnWycsIFxcXCJhcnJheV9zdGFydFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0Y3Vyc29yKys7XFxuK1xcdH1cXG4rXFx0Zm9yIChuID0gMDsgbiBcXHUwMDNjIHRlc3QtXFx1MDAzZWNvdW50OyBuKyspIHtcXG4rXFx0XFx0aWYgKGFycmF5IFxcdTAwMjZcXHUwMDI2IG4pIHtcXG4rXFx0XFx0XFx0aWYgKCFBU1NFUlRfRVEoKmN1cnNvciwgJywnLCBcXFwicmVjb3JkX3NlcGFyYXRvclxcXCIpKVxcbitcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0XFx0Y3Vyc29yKys7XFxuK1xcdFxcdH1cXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHRlc3QtXFx1MDAzZWNvdW50OyBpKyspIHtcXG4rXFx0XFx0XFx0aWYgKHNlZW5baV0pXFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHRleHBlY3RlZF9yZWNvcmQoZXhwZWN0ZWQsIHRlc3QsIGksIGpzb24pO1xcbitcXHRcXHRcXHRpZiAoIXN0cm5jbXAoY3Vyc29yLCBleHBlY3RlZCwgc3RybGVuKGV4cGVjdGVkKSkpXFxuK1xcdFxcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmICghQVNTRVJUX0xUKGksIHRlc3QtXFx1MDAzZWNvdW50LCBcXFwidW5pcXVlX2V4cGVjdGVkX3JlY29yZFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0c2VlbltpXSA9IHRydWU7XFxuK1xcdFxcdGN1cnNvciArPSBzdHJsZW4oZXhwZWN0ZWQpO1xcbitcXHR9XFxuK1xcdGlmIChhcnJheSkge1xcbitcXHRcXHRBU1NFUlRfU1RSRVEoY3Vyc29yLCBcXFwiXVxcXCIsIFxcXCJhcnJheV9lbmRfYW5kX2NvdW50XFxcIik7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHNucHJpbnRmKGZvb3Rlciwgc2l6ZW9mKGZvb3RlciksIFxcXCJGb3VuZCV1ZWxlbWVudCVzXFxcIiwgdGVzdC1cXHUwMDNlY291bnQsXFxuK1xcdFxcdFxcdCB0ZXN0LVxcdTAwM2Vjb3VudCA9PSAxID8gXFxcIlxcXCIgOiBcXFwic1xcXCIpO1xcbitcXHRcXHRBU1NFUlRfU1RSRVEoY3Vyc29yLCBmb290ZXIsIFxcXCJwbGFpbl9jb3VudFxcXCIpO1xcbitcXHR9XFxuK291dDpcXG4rXFx0ZnJlZShvdXRwdXQpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBydW5fZHVtcF9jYXNlKGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XFxuK1xcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xcbitcXHRfX3UzMiBpbmZvX2xlbiA9IHNpemVvZihpbmZvKTtcXG4rXFx0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcXG4rXFx0dW5zaWduZWQgaW50IGk7XFxuK1xcdGludCBmZCA9IC0xO1xcbitcXG4rXFx0aWYgKHRlc3QtXFx1MDAzZWJ0Zikge1xcbitcXHRcXHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcXFwiYnRmX25ld1xcXCIpKVxcbitcXHRcXHRcXHRyZXR1cm47XFxuK1xcdFxcdGlmICghQVNTRVJUX0VRKGJ0Zl9fYWRkX2ludChidGYsIFxcXCJ1bnNpZ25lZCBpbnRcXFwiLCA0LCAwKSwgMSxcXG4rXFx0XFx0XFx0ICAgICAgIFxcXCJidGZfaW50XFxcIikgfHxcXG4rXFx0XFx0ICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksIFxcXCJidGZfbG9hZFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0b3B0cy5idGZfZmQgPSBidGZfX2ZkKGJ0Zik7XFxuK1xcdFxcdG9wdHMuYnRmX2tleV90eXBlX2lkID0gMTtcXG4rXFx0XFx0b3B0cy5idGZfdmFsdWVfdHlwZV9pZCA9IDE7XFxuK1xcdH1cXG4rXFx0ZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXFxcImR1bXBfYmF0Y2hcXFwiLCB0ZXN0LVxcdTAwM2VrZXlfc2l6ZSxcXG4rXFx0XFx0XFx0ICAgIHRlc3QtXFx1MDAzZXZhbHVlX3NpemUsIHRlc3QtXFx1MDAzZWNvdW50ID86IDEsIFxcdTAwMjZvcHRzKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFxcXCJtYXBfY3JlYXRlXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgdGVzdC1cXHUwMDNlY291bnQ7IGkrKykge1xcbitcXHRcXHRfX3UzMiBrZXkgPSBpLCB2YWx1ZSA9IGkgKiAzNyArIDExO1xcbitcXHRcXHR1bnNpZ25lZCBjaGFyIHNob3J0X2tleSA9IGk7XFxuK1xcdFxcdHZvaWQgKmtleV9wdHIgPSB0ZXN0LVxcdTAwM2VrZXlfc2l6ZSA9PSAxID8gKHZvaWQgKilcXHUwMDI2c2hvcnRfa2V5IDogXFx1MDAyNmtleTtcXG4rXFxuK1xcdFxcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmQsIGtleV9wdHIsIFxcdTAwMjZ2YWx1ZSwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwibWFwX3VwZGF0ZVxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcXHUwMDI2aW5mbywgXFx1MDAyNmluZm9fbGVuKSwgXFxcIm1hcF9pbmZvXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRjaGVja19kdW1wKHRlc3QsIGluZm8uaWQsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgdHJ1ZSwgZmFsc2UpO1xcbitcXHRjaGVja19kdW1wKHRlc3QsIGluZm8uaWQsIHRydWUsIHRydWUpO1xcbitvdXQ6XFxuK1xcdGlmIChmZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShmZCk7XFxuK1xcdGJ0Zl9fZnJlZShidGYpO1xcbit9XFxuK1xcbit2b2lkIHRlc3RfYnBmdG9vbF9tYXBfYmF0Y2godm9pZClcXG4re1xcbitcXHRzdGF0aWMgY29uc3Qgc3RydWN0IGR1bXBfY2FzZSBjYXNlc1tdID0ge1xcbitcXHRcXHR7IFxcXCJlbXB0eVxcXCIsIDAsIDQsIDQgfSxcXG4rXFx0XFx0eyBcXFwic2luZ2xlXFxcIiwgMSwgNCwgNCB9LFxcbitcXHRcXHR7IFxcXCJiZWxvd19iYXRjaFxcXCIsIDI1NSwgNCwgNCB9LFxcbitcXHRcXHR7IFxcXCJleGFjdF9iYXRjaFxcXCIsIDI1NiwgNCwgNCB9LFxcbitcXHRcXHR7IFxcXCJhYm92ZV9iYXRjaFxcXCIsIDI1NywgNCwgNCB9LFxcbitcXHRcXHR7IFxcXCJtdWx0aXBsZV9iYXRjaGVzXFxcIiwgMTAyNSwgNCwgNCB9LFxcbitcXHRcXHR7IFxcXCJvbmVfYnl0ZV9rZXlcXFwiLCAyNTYsIDEsIDQgfSxcXG4rXFx0XFx0eyBcXFwib2RkX3ZhbHVlX3NpemVcXFwiLCAyNTcsIDQsIDMgfSxcXG4rXFx0XFx0eyBcXFwiYnRmX2VtcHR5XFxcIiwgMCwgNCwgNCwgdHJ1ZSB9LFxcbitcXHRcXHR7IFxcXCJidGZfc2luZ2xlXFxcIiwgMSwgNCwgNCwgdHJ1ZSB9LFxcbitcXHRcXHR7IFxcXCJidGZfbXVsdGlwbGVfYmF0Y2hlc1xcXCIsIDEwMjUsIDQsIDQsIHRydWUgfSxcXG4rXFx0fTtcXG4rXFx0dW5zaWduZWQgaW50IGk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQVJSQVlfU0laRShjYXNlcyk7IGkrKylcXG4rXFx0XFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoY2FzZXNbaV0ubmFtZSkpXFxuK1xcdFxcdFxcdHJ1bl9kdW1wX2Nhc2UoXFx1MDAyNmNhc2VzW2ldKTtcXG4rfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwMjowOTo0MC44NDE4MDQ5OTRaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjg3MTgyNjUxNzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlci1zcGFjZSB0b29saW5nIGFuZCBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvIChicGZ0b29sIGFuZCBCUEYgc2VsZnRlc3RzKSBhbmQgZG9lcyBub3QgbWFrZSBhbnkgY2hhbmdlcyB0byB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNWEwYTNlNTE1ZWI0YTZkOGZjMDg5NDY1ODE5NTQwZThmYjQzYjY4MFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDcgMDI6MDk6MzcgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXAuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG5pbmRleCA2ODRhOGZiNzI0MTQ2Li4xZWNjZGMwZDFlOTYzIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG5AQCAtNzQwLDE1ICs3NDAsMTAgQEAgc3RhdGljIGludCBkb19zaG93KGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdHJldHVybiBlcnJubyA9PSBFTk9FTlQgPyAwIDogLTE7XG4gfVxuIFxuLXN0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4tXHRcdFx0IHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsXG4tXHRcdFx0IGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXG4rc3RhdGljIHZvaWQgcHJpbnRfbWFwX2VsZW0odm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbitcdFx0XHQgICBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxuK1x0XHRcdCAgIGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXG4ge1xuLVx0aWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7XG4tXHRcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGVycm5vKTtcbi1cdFx0cmV0dXJuIC0xO1xuLVx0fVxuLVxuIFx0aWYgKGpzb25fb3V0cHV0KSB7XG4gXHRcdHByaW50X2VudHJ5X2pzb24obWFwX2luZm8sIGtleSwgdmFsdWUsIGJ0Zik7XG4gXHR9IGVsc2UgaWYgKGJ0Zikge1xuQEAgLTc2MiwxMCArNzU3LDEwOCBAQCBzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuIFx0fSBlbHNlIHtcbiBcdFx0cHJpbnRfZW50cnlfcGxhaW4obWFwX2luZm8sIGtleSwgdmFsdWUpO1xuIFx0fVxuK31cbitcbitzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuK1x0XHRcdCBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxuK1x0XHRcdCBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxuK3tcbitcdGlmIChicGZfbWFwX2xvb2t1cF9lbGVtKGZkLCBrZXksIHZhbHVlKSkge1xuK1x0XHRwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbiBcbitcdHByaW50X21hcF9lbGVtKGtleSwgdmFsdWUsIG1hcF9pbmZvLCBidGYsIGJ0Zl93dHIpO1xuIFx0cmV0dXJuIDA7XG4gfVxuIFxuKyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfU0laRSAyNTZVXG4rI2RlZmluZSBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgKDQgKiAxMDI0ICogMTAyNClcbitcbisvKiBSZXR1cm4gMSB0byB1c2UgaW5kaXZpZHVhbCBsb29rdXBzLCBidXQgb25seSBiZWZvcmUgYmF0Y2ggdHJhdmVyc2FsIHN0YXJ0cy4gKi9cbitzdGF0aWMgaW50IGR1bXBfbWFwX2JhdGNoKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbitcdFx0XHQgIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHN0cnVjdCBidGYgKmJ0ZixcbitcdFx0XHQgIGpzb25fd3JpdGVyX3QgKnd0ciwgdW5zaWduZWQgaW50ICpudW1fZWxlbXMpXG4re1xuK1x0X191MzIgY2FwYWNpdHksIGNvdW50LCBiYXRjaCA9IDAsIG5leHRfYmF0Y2ggPSAwLCBpO1xuK1x0dm9pZCAqa2V5cyA9IE5VTEwsICp2YWx1ZXMgPSBOVUxMLCAqYnVmO1xuK1x0Ym9vbCBmaXJzdCA9IHRydWUsIGNhbl9mYWxsYmFjayA9IHRydWU7XG4rXHRpbnQgZXJyO1xuK1xuK1x0LyogSGFzaCBsb29rdXAgYmF0Y2hlcyBtdXN0IGFjY29tbW9kYXRlIGEgd2hvbGUgYnVja2V0LiBSZXN0cmljdCB0aGVcbitcdCAqIG9wdGltaXphdGlvbiB0byBtYXBzIHdob3NlIHdvcnN0LWNhc2UgYnVja2V0IGZpdHMgdGhlIG1lbW9yeSBidWRnZXQsXG4rXHQgKiBzbyBhIGxhdGVyIEVOT1NQQyBuZXZlciBmb3JjZXMgYSByZXN0YXJ0IGFmdGVyIHByaW50aW5nIHNvbWUgZW50cmllcy5cbitcdCAqIERpdmlzaW9uIGFsc28gYm91bmRzIHRoZSBhbGxvY2F0aW9uIG11bHRpcGxpY2F0aW9ucyBvbiAzMi1iaXQgaG9zdHMuXG4rXHQgKi9cbitcdGlmIChpbmZvLVx1MDAzZXR5cGUgIT0gQlBGX01BUF9UWVBFX0hBU0ggfHwgIWluZm8tXHUwMDNlbWF4X2VudHJpZXMgfHxcbitcdCAgICAoX191NjQpaW5mby1cdTAwM2VrZXlfc2l6ZSArIGluZm8tXHUwMDNldmFsdWVfc2l6ZSBcdTAwM2VcbitcdCAgICBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgLyBpbmZvLVx1MDAzZW1heF9lbnRyaWVzKVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdGNhcGFjaXR5ID0gbWluKGluZm8tXHUwMDNlbWF4X2VudHJpZXMsIE1BUF9EVU1QX0JBVENIX1NJWkUpO1xuK3Jlc2l6ZTpcbitcdGJ1ZiA9IHJlYWxsb2Moa2V5cywgKHNpemVfdCljYXBhY2l0eSAqIGluZm8tXHUwMDNla2V5X3NpemUpO1xuK1x0aWYgKCFidWYpIHtcbitcdFx0ZXJyID0gRU5PTUVNO1xuK1x0XHRnb3RvIGVycm9yO1xuK1x0fVxuK1x0a2V5cyA9IGJ1ZjtcbitcdGJ1ZiA9IHJlYWxsb2ModmFsdWVzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby1cdTAwM2V2YWx1ZV9zaXplKTtcbitcdGlmICghYnVmKSB7XG4rXHRcdGVyciA9IEVOT01FTTtcbitcdFx0Z290byBlcnJvcjtcbitcdH1cbitcdHZhbHVlcyA9IGJ1ZjtcbitcbitcdHdoaWxlICh0cnVlKSB7XG4rXHRcdGNvdW50ID0gY2FwYWNpdHk7XG4rXHRcdGVyciA9IGJwZl9tYXBfbG9va3VwX2JhdGNoKGZkLCBmaXJzdCA/IE5VTEwgOiBcdTAwMjZiYXRjaCxcbitcdFx0XHRcdFx0ICAgXHUwMDI2bmV4dF9iYXRjaCwga2V5cywgdmFsdWVzLCBcdTAwMjZjb3VudCwgTlVMTCk7XG4rXHRcdGVyciA9IGVyciA/IGVycm5vIDogMDtcbitcdFx0LyogT2xkZXIga2VybmVscyByZWplY3QgdGhlIGNvbW1hbmQgYmVmb3JlIHVwZGF0aW5nIGNvdW50LiBEbyBub3RcbitcdFx0ICogaW5zcGVjdCB0aGUgYnVmZmVycyBvbiB0aGVzZSBlcnJvcnMsIG9yIGZhbGwgYmFjayBhZnRlciBwcm9ncmVzcy5cbitcdFx0ICovXG4rXHRcdGlmIChjYW5fZmFsbGJhY2sgXHUwMDI2XHUwMDI2IChlcnIgPT0gRUlOVkFMIHx8IGVyciA9PSBFT1BOT1RTVVBQIHx8XG4rXHRcdFx0XHQgICAgIGVyciA9PSA1MjQgLyogRU5PVFNVUFAgKi8pKSB7XG4rXHRcdFx0ZXJyID0gMTtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0XHRjYW5fZmFsbGJhY2sgPSBmYWxzZTtcbitcdFx0aWYgKGVyciA9PSBFTk9TUEMpIHtcbitcdFx0XHRpZiAoY2FwYWNpdHkgPT0gaW5mby1cdTAwM2VtYXhfZW50cmllcylcbitcdFx0XHRcdGdvdG8gZXJyb3I7XG4rXHRcdFx0Y2FwYWNpdHkgKz0gbWluKGNhcGFjaXR5LCBpbmZvLVx1MDAzZW1heF9lbnRyaWVzIC0gY2FwYWNpdHkpO1xuK1x0XHRcdC8qIFByZXNlcnZlIHRoZSBpbnB1dCBjdXJzb3I6IHRoZSBvdmVyc2l6ZWQgYnVja2V0IHdhcyBub3QgcmVhZC4gKi9cbitcdFx0XHRnb3RvIHJlc2l6ZTtcbitcdFx0fVxuK1x0XHQvKiBJbiBwYXJ0aWN1bGFyLCBFRkFVTFQgY2FuIGxlYXZlIGNvdW50IGFuZCB0aGUgYnVmZmVycyBpbnZhbGlkLiAqL1xuK1x0XHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBlcnIgIT0gRU5PRU5UKVxuK1x0XHRcdGdvdG8gZXJyb3I7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGNvdW50OyBpKyspIHtcbitcdFx0XHQvKiBLZWVwIHRoZSBhbGlnbm1lbnQgcHJvdmlkZWQgYnkgaW5kaXZpZHVhbCBsb29rdXBzLCBpbmNsdWRpbmdcbitcdFx0XHQgKiBmb3IgQlRGIHR5cGVzIHdob3NlIG1hcCBrZXkvdmFsdWUgc2l6ZSBpcyBub3QgYWxpZ25lZC5cbitcdFx0XHQgKi9cbitcdFx0XHRtZW1jcHkoa2V5LCBrZXlzICsgKHNpemVfdClpICogaW5mby1cdTAwM2VrZXlfc2l6ZSwgaW5mby1cdTAwM2VrZXlfc2l6ZSk7XG4rXHRcdFx0bWVtY3B5KHZhbHVlLCB2YWx1ZXMgKyAoc2l6ZV90KWkgKiBpbmZvLVx1MDAzZXZhbHVlX3NpemUsIGluZm8tXHUwMDNldmFsdWVfc2l6ZSk7XG4rXHRcdFx0cHJpbnRfbWFwX2VsZW0oa2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpO1xuK1x0XHRcdCgqbnVtX2VsZW1zKSsrO1xuK1x0XHR9XG4rXHRcdGlmIChlcnIgPT0gRU5PRU5UKSB7XG4rXHRcdFx0ZXJyID0gMDtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0XHRmaXJzdCA9IGZhbHNlO1xuK1x0XHRiYXRjaCA9IG5leHRfYmF0Y2g7XG4rXHR9XG4rZXJyb3I6XG4rXHRwX2VycihcImNhbid0IGxvb2t1cCBtYXAgYmF0Y2g6ICVzXCIsIHN0cmVycm9yKGVycikpO1xuK1x0ZXJyID0gLTE7XG4rb3V0OlxuK1x0ZnJlZShrZXlzKTtcbitcdGZyZWUodmFsdWVzKTtcbitcdHJldHVybiBlcnI7XG4rfVxuK1xuIHN0YXRpYyBpbnQgbWFwc19oYXZlX2J0ZihpbnQgKmZkcywgaW50IG5iX2ZkcylcbiB7XG4gXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbkBAIC04NjksNiArOTYyLDkgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXHRcdHBfaW5mbyhcIldhcm5pbmc6IGNhbm5vdCByZWFkIHZhbHVlcyBmcm9tICVzIG1hcCB3aXRoIHZhbHVlX3NpemUgIT0gOFwiLFxuIFx0XHQgICAgICAgbWFwX3R5cGVfc3RyKTtcbiBcdH1cbitcdGVyciA9IGR1bXBfbWFwX2JhdGNoKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0ciwgXHUwMDI2bnVtX2VsZW1zKTtcbitcdGlmIChlcnIgIT0gMSlcbitcdFx0Z290byBlbmRfZHVtcDtcbiBcdHdoaWxlICh0cnVlKSB7XG4gXHRcdGVyciA9IGJwZl9tYXBfZ2V0X25leHRfa2V5KGZkLCBwcmV2X2tleSwga2V5KTtcbiBcdFx0aWYgKGVycikge1xuQEAgLTg4MSw2ICs5NzcsNyBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdFx0cHJldl9rZXkgPSBrZXk7XG4gXHR9XG4gXG4rZW5kX2R1bXA6XG4gXHRpZiAod3RyKSB7XG4gXHRcdGpzb253X2VuZF9hcnJheSh3dHIpO1x0LyogZWxlbWVudHMgKi9cbiBcdFx0aWYgKHNob3dfaGVhZGVyKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMTM5ZDEzYTQ5ZGNlZlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY1xuQEAgLTAsMCArMSwxODYgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2J0Zi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjY3R5cGUuaFx1MDAzZVxuK1xuKyNkZWZpbmUgTUFYX0VOVFJJRVMgMTAyNVxuKyNkZWZpbmUgUkVDT1JEX1NJWkUgMjU2XG4rI2RlZmluZSBPVVRQVVRfU0laRSAoTUFYX0VOVFJJRVMgKiBSRUNPUkRfU0laRSArIDEwMjQpXG4rXG4rc3RydWN0IGR1bXBfY2FzZSB7XG4rXHRjb25zdCBjaGFyICpuYW1lO1xuK1x0dW5zaWduZWQgaW50IGNvdW50O1xuK1x0dW5zaWduZWQgaW50IGtleV9zaXplO1xuK1x0dW5zaWduZWQgaW50IHZhbHVlX3NpemU7XG4rXHRib29sIGJ0Zjtcbit9O1xuK1xuK3N0YXRpYyB2b2lkIGhleF9ieXRlcyhjaGFyICpvdXQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCBib29sIGpzb24pXG4re1xuK1x0Y29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSBkYXRhO1xuK1x0dW5zaWduZWQgaW50IGk7XG4rXG4rXHRpZiAoanNvbilcbitcdFx0Km91dCsrID0gJ1snO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc2l6ZTsgaSsrKSB7XG4rXHRcdGlmIChqc29uIFx1MDAyNlx1MDAyNiBpKVxuK1x0XHRcdCpvdXQrKyA9ICcsJztcbitcdFx0b3V0ICs9IHNwcmludGYob3V0LCBqc29uID8gXCJcXFwiMHglMDJ4XFxcIlwiIDogXCIlMDJ4XCIsIGJ5dGVzW2ldKTtcbitcdH1cbitcdGlmIChqc29uKVxuK1x0XHQqb3V0KysgPSAnXSc7XG4rXHQqb3V0ID0gJ1xcMCc7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGV4cGVjdGVkX3JlY29yZChjaGFyICpyZWNvcmQsIGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QsXG4rXHRcdFx0ICAgIHVuc2lnbmVkIGludCBpbmRleCwgYm9vbCBqc29uKVxuK3tcbitcdF9fdTMyIGtleSA9IGluZGV4LCB2YWx1ZSA9IGluZGV4ICogMzcgKyAxMTtcbitcdHVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaW5kZXg7XG4rXHRjaGFyIGtleV9oZXhbNjRdLCB2YWx1ZV9oZXhbNjRdLCBmb3JtYXR0ZWRbOTZdO1xuK1xuK1x0aGV4X2J5dGVzKGtleV9oZXgsIHRlc3QtXHUwMDNla2V5X3NpemUgPT0gMSA/ICh2b2lkICopXHUwMDI2c2hvcnRfa2V5IDogXHUwMDI2a2V5LFxuK1x0XHQgIHRlc3QtXHUwMDNla2V5X3NpemUsIGpzb24pO1xuK1x0aGV4X2J5dGVzKHZhbHVlX2hleCwgXHUwMDI2dmFsdWUsIHRlc3QtXHUwMDNldmFsdWVfc2l6ZSwganNvbik7XG4rXHRzbnByaW50Zihmb3JtYXR0ZWQsIHNpemVvZihmb3JtYXR0ZWQpLCBcIntcXFwia2V5XFxcIjoldSxcXFwidmFsdWVcXFwiOiV1fVwiLFxuK1x0XHQga2V5LCB2YWx1ZSk7XG4rXHRpZiAoanNvbiBcdTAwMjZcdTAwMjYgdGVzdC1cdTAwM2VidGYpXG4rXHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsXG4rXHRcdFx0IFwie1xcXCJrZXlcXFwiOiVzLFxcXCJ2YWx1ZVxcXCI6JXMsXFxcImZvcm1hdHRlZFxcXCI6JXN9XCIsXG4rXHRcdFx0IGtleV9oZXgsIHZhbHVlX2hleCwgZm9ybWF0dGVkKTtcbitcdGVsc2UgaWYgKGpzb24pXG4rXHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFwie1xcXCJrZXlcXFwiOiVzLFxcXCJ2YWx1ZVxcXCI6JXN9XCIsXG4rXHRcdFx0IGtleV9oZXgsIHZhbHVlX2hleCk7XG4rXHRlbHNlIGlmICh0ZXN0LVx1MDAzZWJ0ZilcbitcdFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgXCIlc1wiLCBmb3JtYXR0ZWQpO1xuK1x0ZWxzZVxuK1x0XHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCBcImtleTolc3ZhbHVlOiVzXCIsIGtleV9oZXgsIHZhbHVlX2hleCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNoZWNrX2R1bXAoY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdCwgX191MzIgaWQsIGJvb2wganNvbiwgYm9vbCBwcmV0dHkpXG4re1xuK1x0Ym9vbCBhcnJheSA9IGpzb24gfHwgdGVzdC1cdTAwM2VidGY7XG4rXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIGV4cGVjdGVkW1JFQ09SRF9TSVpFXSwgZm9vdGVyWzY0XTtcbitcdGJvb2wgc2VlbltNQVhfRU5UUklFU10gPSB7fTtcbitcdGNoYXIgKm91dHB1dCwgKnNyYywgKmRzdCwgKmN1cnNvcjtcbitcdHVuc2lnbmVkIGludCBpLCBuO1xuK1x0aW50IGVycjtcbitcbitcdG91dHB1dCA9IGNhbGxvYygxLCBPVVRQVVRfU0laRSk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIob3V0cHV0LCBcImFsbG9jX291dHB1dFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcIiVzbWFwIGR1bXAgaWQgJXVcIixcbitcdFx0IHByZXR0eSA/IFwiLXAgXCIgOiBqc29uID8gXCItaiBcIiA6IFwiXCIsIGlkKTtcbitcdGVyciA9IGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcIm1hcF9kdW1wXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdC8qIElnbm9yZSBwcmVzZW50YXRpb24gd2hpdGVzcGFjZSwgYnV0IGNvbXBhcmUgY29tcGxldGUgcmVjb3JkcyBhbmQgYWxsXG4rXHQgKiBwdW5jdHVhdGlvbi4gRXhwZWN0ZWQgY29udGVudHMgY29tZSBvbmx5IGZyb20gdGhlIGlucHV0IGRhdGEsIG5ldmVyXG4rXHQgKiBmcm9tIGFub3RoZXIgbWFwIHdhbGsgb3IgYnBmdG9vbCBpbnZvY2F0aW9uLlxuK1x0ICovXG4rXHRmb3IgKHNyYyA9IG91dHB1dCwgZHN0ID0gb3V0cHV0OyAqc3JjOyBzcmMrKylcbitcdFx0aWYgKCFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxuK1x0XHRcdCpkc3QrKyA9ICpzcmM7XG4rXHQqZHN0ID0gJ1xcMCc7XG4rXHRjdXJzb3IgPSBvdXRwdXQ7XG4rXHRpZiAoYXJyYXkpIHtcbitcdFx0aWYgKCFBU1NFUlRfRVEoKmN1cnNvciwgJ1snLCBcImFycmF5X3N0YXJ0XCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRjdXJzb3IrKztcbitcdH1cbitcdGZvciAobiA9IDA7IG4gXHUwMDNjIHRlc3QtXHUwMDNlY291bnQ7IG4rKykge1xuK1x0XHRpZiAoYXJyYXkgXHUwMDI2XHUwMDI2IG4pIHtcbitcdFx0XHRpZiAoIUFTU0VSVF9FUSgqY3Vyc29yLCAnLCcsIFwicmVjb3JkX3NlcGFyYXRvclwiKSlcbitcdFx0XHRcdGdvdG8gb3V0O1xuK1x0XHRcdGN1cnNvcisrO1xuK1x0XHR9XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRlc3QtXHUwMDNlY291bnQ7IGkrKykge1xuK1x0XHRcdGlmIChzZWVuW2ldKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0ZXhwZWN0ZWRfcmVjb3JkKGV4cGVjdGVkLCB0ZXN0LCBpLCBqc29uKTtcbitcdFx0XHRpZiAoIXN0cm5jbXAoY3Vyc29yLCBleHBlY3RlZCwgc3RybGVuKGV4cGVjdGVkKSkpXG4rXHRcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0XHRpZiAoIUFTU0VSVF9MVChpLCB0ZXN0LVx1MDAzZWNvdW50LCBcInVuaXF1ZV9leHBlY3RlZF9yZWNvcmRcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdHNlZW5baV0gPSB0cnVlO1xuK1x0XHRjdXJzb3IgKz0gc3RybGVuKGV4cGVjdGVkKTtcbitcdH1cbitcdGlmIChhcnJheSkge1xuK1x0XHRBU1NFUlRfU1RSRVEoY3Vyc29yLCBcIl1cIiwgXCJhcnJheV9lbmRfYW5kX2NvdW50XCIpO1xuK1x0fSBlbHNlIHtcbitcdFx0c25wcmludGYoZm9vdGVyLCBzaXplb2YoZm9vdGVyKSwgXCJGb3VuZCV1ZWxlbWVudCVzXCIsIHRlc3QtXHUwMDNlY291bnQsXG4rXHRcdFx0IHRlc3QtXHUwMDNlY291bnQgPT0gMSA/IFwiXCIgOiBcInNcIik7XG4rXHRcdEFTU0VSVF9TVFJFUShjdXJzb3IsIGZvb3RlciwgXCJwbGFpbl9jb3VudFwiKTtcbitcdH1cbitvdXQ6XG4rXHRmcmVlKG91dHB1dCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJ1bl9kdW1wX2Nhc2UoY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdClcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbitcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuK1x0X191MzIgaW5mb19sZW4gPSBzaXplb2YoaW5mbyk7XG4rXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xuK1x0dW5zaWduZWQgaW50IGk7XG4rXHRpbnQgZmQgPSAtMTtcbitcbitcdGlmICh0ZXN0LVx1MDAzZWJ0Zikge1xuK1x0XHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xuK1x0XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcImJ0Zl9uZXdcIikpXG4rXHRcdFx0cmV0dXJuO1xuK1x0XHRpZiAoIUFTU0VSVF9FUShidGZfX2FkZF9pbnQoYnRmLCBcInVuc2lnbmVkIGludFwiLCA0LCAwKSwgMSxcbitcdFx0XHQgICAgICAgXCJidGZfaW50XCIpIHx8XG4rXHRcdCAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcImJ0Zl9sb2FkXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRvcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTtcbitcdFx0b3B0cy5idGZfa2V5X3R5cGVfaWQgPSAxO1xuK1x0XHRvcHRzLmJ0Zl92YWx1ZV90eXBlX2lkID0gMTtcbitcdH1cbitcdGZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwiZHVtcF9iYXRjaFwiLCB0ZXN0LVx1MDAzZWtleV9zaXplLFxuK1x0XHRcdCAgICB0ZXN0LVx1MDAzZXZhbHVlX3NpemUsIHRlc3QtXHUwMDNlY291bnQgPzogMSwgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZCwgXCJtYXBfY3JlYXRlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRlc3QtXHUwMDNlY291bnQ7IGkrKykge1xuK1x0XHRfX3UzMiBrZXkgPSBpLCB2YWx1ZSA9IGkgKiAzNyArIDExO1xuK1x0XHR1bnNpZ25lZCBjaGFyIHNob3J0X2tleSA9IGk7XG4rXHRcdHZvaWQgKmtleV9wdHIgPSB0ZXN0LVx1MDAzZWtleV9zaXplID09IDEgPyAodm9pZCAqKVx1MDAyNnNob3J0X2tleSA6IFx1MDAyNmtleTtcbitcbitcdFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZCwga2V5X3B0ciwgXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxuK1x0XHRcdCAgICAgICBcIm1hcF91cGRhdGVcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcdTAwMjZpbmZvLCBcdTAwMjZpbmZvX2xlbiksIFwibWFwX2luZm9cIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCBmYWxzZSwgZmFsc2UpO1xuK1x0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCBmYWxzZSk7XG4rXHRjaGVja19kdW1wKHRlc3QsIGluZm8uaWQsIHRydWUsIHRydWUpO1xuK291dDpcbitcdGlmIChmZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGZkKTtcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbit2b2lkIHRlc3RfYnBmdG9vbF9tYXBfYmF0Y2godm9pZClcbit7XG4rXHRzdGF0aWMgY29uc3Qgc3RydWN0IGR1bXBfY2FzZSBjYXNlc1tdID0ge1xuK1x0XHR7IFwiZW1wdHlcIiwgMCwgNCwgNCB9LFxuK1x0XHR7IFwic2luZ2xlXCIsIDEsIDQsIDQgfSxcbitcdFx0eyBcImJlbG93X2JhdGNoXCIsIDI1NSwgNCwgNCB9LFxuK1x0XHR7IFwiZXhhY3RfYmF0Y2hcIiwgMjU2LCA0LCA0IH0sXG4rXHRcdHsgXCJhYm92ZV9iYXRjaFwiLCAyNTcsIDQsIDQgfSxcbitcdFx0eyBcIm11bHRpcGxlX2JhdGNoZXNcIiwgMTAyNSwgNCwgNCB9LFxuK1x0XHR7IFwib25lX2J5dGVfa2V5XCIsIDI1NiwgMSwgNCB9LFxuK1x0XHR7IFwib2RkX3ZhbHVlX3NpemVcIiwgMjU3LCA0LCAzIH0sXG4rXHRcdHsgXCJidGZfZW1wdHlcIiwgMCwgNCwgNCwgdHJ1ZSB9LFxuK1x0XHR7IFwiYnRmX3NpbmdsZVwiLCAxLCA0LCA0LCB0cnVlIH0sXG4rXHRcdHsgXCJidGZfbXVsdGlwbGVfYmF0Y2hlc1wiLCAxMDI1LCA0LCA0LCB0cnVlIH0sXG4rXHR9O1xuK1x0dW5zaWduZWQgaW50IGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGNhc2VzKTsgaSsrKVxuK1x0XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChjYXNlc1tpXS5uYW1lKSlcbitcdFx0XHRydW5fZHVtcF9jYXNlKFx1MDAyNmNhc2VzW2ldKTtcbit9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwMjowOTo0MC44NDE4MDY0MzRaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo4NzE4MjQyNjczLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlBhdGNoIEFuYWx5c2lzOiBXb3J0aEZ1enppbmcgRGV0ZXJtaW5hdGlvbioqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhlIGRpZmYgYWZmZWN0cyBgdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNgIGFuZCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY2AuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBydW4gdGhyb3VnaCB0aGUgbmVnYXRpdmUgY3JpdGVyaWEgY2hlY2tsaXN0LiBJIG5lZWQgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgY2hhbmdlIHdhcnJhbnRzIGZ1enppbmcuXG5cblRoZSBjcml0ZXJpYSBzYXlzIGBXb3J0aEZ1enppbmc9ZmFsc2VgIGlmICphbGwqIG1vZGlmaWVkIGNvZGUgZmFsbHMgdW5kZXIgc3BlY2lmaWMgY2F0ZWdvcmllcy4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gY2hlY2sgZm9yIG5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXMsIGxpa2UgZG9jdW1lbnRhdGlvbiwgY29tbWVudHMsIHNwZWxsaW5nIGZpeGVzLCBvciB1c2VyLXNwYWNlIGNvZGUgdGhhdCBkb2Vzbid0IGltcGFjdCB0aGUga2VybmVsIGltYWdlIG9yIG1vZHVsZXMuXG5cbkEgcXVpY2sgZ2xhbmNlIHRlbGxzIG1lIGJvdGggZmlsZXMgYXJlIHVuZGVyIGB0b29scy9gLCBzbyB0aGV5J3JlIHVzZXItc3BhY2UuIEkgbmVlZCB0byBiZSBhYnNvbHV0ZWx5IHN1cmUgdGhvdWdoLCBzbyBsZXQncyBkb3VibGUtY2hlY2sgYnkgbG9va2luZyBkaXJlY3RseSBhdCB0aGUgZGlmZiwgbm8gbmVlZCB0byBpbnZvbHZlIGdpdCBjb21tYW5kcyBmb3Igc3VjaCBhIHNtYWxsIGNoYW5nZS4gVGhlIGRpZmYgY29uZmlybXMgbXkgaW5pdGlhbCBhc3Nlc3NtZW50OiBvbmx5IHRob3NlIHR3byBmaWxlcy5cblxuR2l2ZW4gdGhhdCB0aGVzZSBhcmUgc3RyaWN0bHkgd2l0aGluIHRoZSBgdG9vbHMvYCBkaXJlY3RvcnksIGFuZCBpdCdzIGFsbCB1c2VyLXNwYWNlLCAqd2l0aG91dCogYWZmZWN0aW5nIHRoZSBrZXJuZWwgaW1hZ2Ugb3IgbW9kdWxlcywgSSdtIGNvbmZpZGVudCBpbiBzYXlpbmcgdGhpcyBwYXRjaCBkb2Vzbid0IHdhcnJhbnQgZnV6emluZy5cblxuU28sIEknbSBnb2luZyB3aXRoOlxuXG4qICAgYFdvcnRoRnV6emluZzogZmFsc2VgXG4qICAgYEZvY3VzU3ltYm9sczogW11gIChub3RoaW5nIHRvIHNwZWNpZmljYWxseSB0YXJnZXQpXG4qICAgYEVuYWJsZUNvbmZpZ3M6IFtdYCAobm8gc3BlY2lmaWMgY29uZmlnIG9wdGlvbnMgbmVlZGVkKVxuKiAgIGBSZWFzb25pbmc6IFRoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXItc3BhY2UgY29kZSB3aXRoaW4gdG9vbHMvICh0b29scy9icGYvYnBmdG9vbC9tYXAuYyBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guYyksIHdoaWNoIGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlIG9yIGtlcm5lbCBtb2R1bGVzLmBcblxuXG4iLCJJbnB1dFRva2VucyI6Njk3OSwiT3V0cHV0VG9rZW5zIjo3NywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQzNiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDAyOjA5OjQ5LjU2MDA1MDczN1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc4NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xpbmcgYW5kIHNlbGZ0ZXN0cyB1bmRlciB0b29scy8gKGJwZnRvb2wgYW5kIEJQRiBzZWxmdGVzdHMpIGFuZCBkb2VzIG5vdCBtYWtlIGFueSBjaGFuZ2VzIHRvIHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xpbmcgYW5kIHNlbGZ0ZXN0cyB1bmRlciB0b29scy8gKGJwZnRvb2wgYW5kIEJQRiBzZWxmdGVzdHMpIGFuZCBkb2VzIG5vdCBtYWtlIGFueSBjaGFuZ2VzIHRvIHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDI6MDk6NDkuNTYwMDcxODA3WiIsIlNlcSI6NSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflowwfh8c[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-07 01:25:11 +0000 UTC FinishedAt: 2026-09-07 02:09:51 +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+CgkJCTx0ZD4yMDI2LzA5LzA3IDAyOjA5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xpbmcgYW5kIHNlbGZ0ZXN0cyB1bmRlciB0b29scy8gKGJwZnRvb2wgYW5kIEJQRiBzZWxmdGVzdHMpIGFuZCBkb2VzIG5vdCBtYWtlIGFueSBjaGFuZ2VzIHRvIHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMjowOTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDVhMGEzZTUxNWViNGE2ZDhmYzA4OTQ2NTgxOTU0MGU4ZmI0M2I2ODBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCA3IDAyOjA5OjM3IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbmluZGV4IDY4NGE4ZmI3MjQxNDYuLjFlY2NkYzBkMWU5NjMgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbkBAIC03NDAsMTUgJiM0Mzs3NDAsMTAgQEAgc3RhdGljIGludCBkb19zaG93KGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdHJldHVybiBlcnJubyA9PSBFTk9FTlQgPyAwIDogLTE7XG4gfVxuIFxuLXN0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4tXHRcdFx0IHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsXG4tXHRcdFx0IGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXG4mIzQzO3N0YXRpYyB2b2lkIHByaW50X21hcF9lbGVtKHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4mIzQzO1x0XHRcdCAgIHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsXG4mIzQzO1x0XHRcdCAgIGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXG4ge1xuLVx0aWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7XG4tXHRcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGVycm5vKTtcbi1cdFx0cmV0dXJuIC0xO1xuLVx0fVxuLVxuIFx0aWYgKGpzb25fb3V0cHV0KSB7XG4gXHRcdHByaW50X2VudHJ5X2pzb24obWFwX2luZm8sIGtleSwgdmFsdWUsIGJ0Zik7XG4gXHR9IGVsc2UgaWYgKGJ0Zikge1xuQEAgLTc2MiwxMCAmIzQzOzc1NywxMDggQEAgc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbiBcdH0gZWxzZSB7XG4gXHRcdHByaW50X2VudHJ5X3BsYWluKG1hcF9pbmZvLCBrZXksIHZhbHVlKTtcbiBcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbiYjNDM7XHRcdFx0IHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsXG4mIzQzO1x0XHRcdCBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7XG4mIzQzO1x0XHRwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuIFxuJiM0MztcdHByaW50X21hcF9lbGVtKGtleSwgdmFsdWUsIG1hcF9pbmZvLCBidGYsIGJ0Zl93dHIpO1xuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0MzsjZGVmaW5lIE1BUF9EVU1QX0JBVENIX1NJWkUgMjU2VVxuJiM0MzsjZGVmaW5lIE1BUF9EVU1QX0JBVENIX01BWF9CWVRFUyAoNCAqIDEwMjQgKiAxMDI0KVxuJiM0MztcbiYjNDM7LyogUmV0dXJuIDEgdG8gdXNlIGluZGl2aWR1YWwgbG9va3VwcywgYnV0IG9ubHkgYmVmb3JlIGJhdGNoIHRyYXZlcnNhbCBzdGFydHMuICovXG4mIzQzO3N0YXRpYyBpbnQgZHVtcF9tYXBfYmF0Y2goaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuJiM0MztcdFx0XHQgIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHN0cnVjdCBidGYgKmJ0ZixcbiYjNDM7XHRcdFx0ICBqc29uX3dyaXRlcl90ICp3dHIsIHVuc2lnbmVkIGludCAqbnVtX2VsZW1zKVxuJiM0Mzt7XG4mIzQzO1x0X191MzIgY2FwYWNpdHksIGNvdW50LCBiYXRjaCA9IDAsIG5leHRfYmF0Y2ggPSAwLCBpO1xuJiM0MztcdHZvaWQgKmtleXMgPSBOVUxMLCAqdmFsdWVzID0gTlVMTCwgKmJ1ZjtcbiYjNDM7XHRib29sIGZpcnN0ID0gdHJ1ZSwgY2FuX2ZhbGxiYWNrID0gdHJ1ZTtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHQvKiBIYXNoIGxvb2t1cCBiYXRjaGVzIG11c3QgYWNjb21tb2RhdGUgYSB3aG9sZSBidWNrZXQuIFJlc3RyaWN0IHRoZVxuJiM0MztcdCAqIG9wdGltaXphdGlvbiB0byBtYXBzIHdob3NlIHdvcnN0LWNhc2UgYnVja2V0IGZpdHMgdGhlIG1lbW9yeSBidWRnZXQsXG4mIzQzO1x0ICogc28gYSBsYXRlciBFTk9TUEMgbmV2ZXIgZm9yY2VzIGEgcmVzdGFydCBhZnRlciBwcmludGluZyBzb21lIGVudHJpZXMuXG4mIzQzO1x0ICogRGl2aXNpb24gYWxzbyBib3VuZHMgdGhlIGFsbG9jYXRpb24gbXVsdGlwbGljYXRpb25zIG9uIDMyLWJpdCBob3N0cy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoaW5mby1cdTAwM2V0eXBlICE9IEJQRl9NQVBfVFlQRV9IQVNIIHx8ICFpbmZvLVx1MDAzZW1heF9lbnRyaWVzIHx8XG4mIzQzO1x0ICAgIChfX3U2NClpbmZvLVx1MDAzZWtleV9zaXplICYjNDM7IGluZm8tXHUwMDNldmFsdWVfc2l6ZSBcdTAwM2VcbiYjNDM7XHQgICAgTUFQX0RVTVBfQkFUQ0hfTUFYX0JZVEVTIC8gaW5mby1cdTAwM2VtYXhfZW50cmllcylcbiYjNDM7XHRcdHJldHVybiAxO1xuJiM0MztcbiYjNDM7XHRjYXBhY2l0eSA9IG1pbihpbmZvLVx1MDAzZW1heF9lbnRyaWVzLCBNQVBfRFVNUF9CQVRDSF9TSVpFKTtcbiYjNDM7cmVzaXplOlxuJiM0MztcdGJ1ZiA9IHJlYWxsb2Moa2V5cywgKHNpemVfdCljYXBhY2l0eSAqIGluZm8tXHUwMDNla2V5X3NpemUpO1xuJiM0MztcdGlmICghYnVmKSB7XG4mIzQzO1x0XHRlcnIgPSBFTk9NRU07XG4mIzQzO1x0XHRnb3RvIGVycm9yO1xuJiM0MztcdH1cbiYjNDM7XHRrZXlzID0gYnVmO1xuJiM0MztcdGJ1ZiA9IHJlYWxsb2ModmFsdWVzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby1cdTAwM2V2YWx1ZV9zaXplKTtcbiYjNDM7XHRpZiAoIWJ1Zikge1xuJiM0MztcdFx0ZXJyID0gRU5PTUVNO1xuJiM0MztcdFx0Z290byBlcnJvcjtcbiYjNDM7XHR9XG4mIzQzO1x0dmFsdWVzID0gYnVmO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAodHJ1ZSkge1xuJiM0MztcdFx0Y291bnQgPSBjYXBhY2l0eTtcbiYjNDM7XHRcdGVyciA9IGJwZl9tYXBfbG9va3VwX2JhdGNoKGZkLCBmaXJzdCA/IE5VTEwgOiBcdTAwMjZiYXRjaCxcbiYjNDM7XHRcdFx0XHRcdCAgIFx1MDAyNm5leHRfYmF0Y2gsIGtleXMsIHZhbHVlcywgXHUwMDI2Y291bnQsIE5VTEwpO1xuJiM0MztcdFx0ZXJyID0gZXJyID8gZXJybm8gOiAwO1xuJiM0MztcdFx0LyogT2xkZXIga2VybmVscyByZWplY3QgdGhlIGNvbW1hbmQgYmVmb3JlIHVwZGF0aW5nIGNvdW50LiBEbyBub3RcbiYjNDM7XHRcdCAqIGluc3BlY3QgdGhlIGJ1ZmZlcnMgb24gdGhlc2UgZXJyb3JzLCBvciBmYWxsIGJhY2sgYWZ0ZXIgcHJvZ3Jlc3MuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmIChjYW5fZmFsbGJhY2sgXHUwMDI2XHUwMDI2IChlcnIgPT0gRUlOVkFMIHx8IGVyciA9PSBFT1BOT1RTVVBQIHx8XG4mIzQzO1x0XHRcdFx0ICAgICBlcnIgPT0gNTI0IC8qIEVOT1RTVVBQICovKSkge1xuJiM0MztcdFx0XHRlcnIgPSAxO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGNhbl9mYWxsYmFjayA9IGZhbHNlO1xuJiM0MztcdFx0aWYgKGVyciA9PSBFTk9TUEMpIHtcbiYjNDM7XHRcdFx0aWYgKGNhcGFjaXR5ID09IGluZm8tXHUwMDNlbWF4X2VudHJpZXMpXG4mIzQzO1x0XHRcdFx0Z290byBlcnJvcjtcbiYjNDM7XHRcdFx0Y2FwYWNpdHkgJiM0Mzs9IG1pbihjYXBhY2l0eSwgaW5mby1cdTAwM2VtYXhfZW50cmllcyAtIGNhcGFjaXR5KTtcbiYjNDM7XHRcdFx0LyogUHJlc2VydmUgdGhlIGlucHV0IGN1cnNvcjogdGhlIG92ZXJzaXplZCBidWNrZXQgd2FzIG5vdCByZWFkLiAqL1xuJiM0MztcdFx0XHRnb3RvIHJlc2l6ZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdC8qIEluIHBhcnRpY3VsYXIsIEVGQVVMVCBjYW4gbGVhdmUgY291bnQgYW5kIHRoZSBidWZmZXJzIGludmFsaWQuICovXG4mIzQzO1x0XHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBlcnIgIT0gRU5PRU5UKVxuJiM0MztcdFx0XHRnb3RvIGVycm9yO1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgY291bnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdC8qIEtlZXAgdGhlIGFsaWdubWVudCBwcm92aWRlZCBieSBpbmRpdmlkdWFsIGxvb2t1cHMsIGluY2x1ZGluZ1xuJiM0MztcdFx0XHQgKiBmb3IgQlRGIHR5cGVzIHdob3NlIG1hcCBrZXkvdmFsdWUgc2l6ZSBpcyBub3QgYWxpZ25lZC5cbiYjNDM7XHRcdFx0ICovXG4mIzQzO1x0XHRcdG1lbWNweShrZXksIGtleXMgJiM0MzsgKHNpemVfdClpICogaW5mby1cdTAwM2VrZXlfc2l6ZSwgaW5mby1cdTAwM2VrZXlfc2l6ZSk7XG4mIzQzO1x0XHRcdG1lbWNweSh2YWx1ZSwgdmFsdWVzICYjNDM7IChzaXplX3QpaSAqIGluZm8tXHUwMDNldmFsdWVfc2l6ZSwgaW5mby1cdTAwM2V2YWx1ZV9zaXplKTtcbiYjNDM7XHRcdFx0cHJpbnRfbWFwX2VsZW0oa2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpO1xuJiM0MztcdFx0XHQoKm51bV9lbGVtcykmIzQzOyYjNDM7O1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKGVyciA9PSBFTk9FTlQpIHtcbiYjNDM7XHRcdFx0ZXJyID0gMDtcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRmaXJzdCA9IGZhbHNlO1xuJiM0MztcdFx0YmF0Y2ggPSBuZXh0X2JhdGNoO1xuJiM0MztcdH1cbiYjNDM7ZXJyb3I6XG4mIzQzO1x0cF9lcnIoXCYjMzQ7Y2FuJiMzOTt0IGxvb2t1cCBtYXAgYmF0Y2g6ICVzXCYjMzQ7LCBzdHJlcnJvcihlcnIpKTtcbiYjNDM7XHRlcnIgPSAtMTtcbiYjNDM7b3V0OlxuJiM0MztcdGZyZWUoa2V5cyk7XG4mIzQzO1x0ZnJlZSh2YWx1ZXMpO1xuJiM0MztcdHJldHVybiBlcnI7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIGludCBtYXBzX2hhdmVfYnRmKGludCAqZmRzLCBpbnQgbmJfZmRzKVxuIHtcbiBcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuQEAgLTg2OSw2ICYjNDM7OTYyLDkgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXHRcdHBfaW5mbyhcJiMzNDtXYXJuaW5nOiBjYW5ub3QgcmVhZCB2YWx1ZXMgZnJvbSAlcyBtYXAgd2l0aCB2YWx1ZV9zaXplICE9IDhcJiMzNDssXG4gXHRcdCAgICAgICBtYXBfdHlwZV9zdHIpO1xuIFx0fVxuJiM0MztcdGVyciA9IGR1bXBfbWFwX2JhdGNoKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0ciwgXHUwMDI2bnVtX2VsZW1zKTtcbiYjNDM7XHRpZiAoZXJyICE9IDEpXG4mIzQzO1x0XHRnb3RvIGVuZF9kdW1wO1xuIFx0d2hpbGUgKHRydWUpIHtcbiBcdFx0ZXJyID0gYnBmX21hcF9nZXRfbmV4dF9rZXkoZmQsIHByZXZfa2V5LCBrZXkpO1xuIFx0XHRpZiAoZXJyKSB7XG5AQCAtODgxLDYgJiM0Mzs5NzcsNyBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdFx0cHJldl9rZXkgPSBrZXk7XG4gXHR9XG4gXG4mIzQzO2VuZF9kdW1wOlxuIFx0aWYgKHd0cikge1xuIFx0XHRqc29ud19lbmRfYXJyYXkod3RyKTtcdC8qIGVsZW1lbnRzICovXG4gXHRcdGlmIChzaG93X2hlYWRlcilcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjEzOWQxM2E0OWRjZWZcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmNcbkBAIC0wLDAgJiM0MzsxLDE4NiBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmdG9vbF9oZWxwZXJzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2J0Zi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2N0eXBlLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNkZWZpbmUgTUFYX0VOVFJJRVMgMTAyNVxuJiM0MzsjZGVmaW5lIFJFQ09SRF9TSVpFIDI1NlxuJiM0MzsjZGVmaW5lIE9VVFBVVF9TSVpFIChNQVhfRU5UUklFUyAqIFJFQ09SRF9TSVpFICYjNDM7IDEwMjQpXG4mIzQzO1xuJiM0MztzdHJ1Y3QgZHVtcF9jYXNlIHtcbiYjNDM7XHRjb25zdCBjaGFyICpuYW1lO1xuJiM0MztcdHVuc2lnbmVkIGludCBjb3VudDtcbiYjNDM7XHR1bnNpZ25lZCBpbnQga2V5X3NpemU7XG4mIzQzO1x0dW5zaWduZWQgaW50IHZhbHVlX3NpemU7XG4mIzQzO1x0Ym9vbCBidGY7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBoZXhfYnl0ZXMoY2hhciAqb3V0LCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSwgYm9vbCBqc29uKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSBkYXRhO1xuJiM0MztcdHVuc2lnbmVkIGludCBpO1xuJiM0MztcbiYjNDM7XHRpZiAoanNvbilcbiYjNDM7XHRcdCpvdXQmIzQzOyYjNDM7ID0gJiMzOTtbJiMzOTs7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc2l6ZTsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChqc29uIFx1MDAyNlx1MDAyNiBpKVxuJiM0MztcdFx0XHQqb3V0JiM0MzsmIzQzOyA9ICYjMzk7LCYjMzk7O1xuJiM0MztcdFx0b3V0ICYjNDM7PSBzcHJpbnRmKG91dCwganNvbiA/IFwmIzM0O1xcXCYjMzQ7MHglMDJ4XFxcJiMzNDtcJiMzNDsgOiBcJiMzNDslMDJ4XCYjMzQ7LCBieXRlc1tpXSk7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChqc29uKVxuJiM0MztcdFx0Km91dCYjNDM7JiM0MzsgPSAmIzM5O10mIzM5OztcbiYjNDM7XHQqb3V0ID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgZXhwZWN0ZWRfcmVjb3JkKGNoYXIgKnJlY29yZCwgY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdCxcbiYjNDM7XHRcdFx0ICAgIHVuc2lnbmVkIGludCBpbmRleCwgYm9vbCBqc29uKVxuJiM0Mzt7XG4mIzQzO1x0X191MzIga2V5ID0gaW5kZXgsIHZhbHVlID0gaW5kZXggKiAzNyAmIzQzOyAxMTtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyIHNob3J0X2tleSA9IGluZGV4O1xuJiM0MztcdGNoYXIga2V5X2hleFs2NF0sIHZhbHVlX2hleFs2NF0sIGZvcm1hdHRlZFs5Nl07XG4mIzQzO1xuJiM0MztcdGhleF9ieXRlcyhrZXlfaGV4LCB0ZXN0LVx1MDAzZWtleV9zaXplID09IDEgPyAodm9pZCAqKVx1MDAyNnNob3J0X2tleSA6IFx1MDAyNmtleSxcbiYjNDM7XHRcdCAgdGVzdC1cdTAwM2VrZXlfc2l6ZSwganNvbik7XG4mIzQzO1x0aGV4X2J5dGVzKHZhbHVlX2hleCwgXHUwMDI2dmFsdWUsIHRlc3QtXHUwMDNldmFsdWVfc2l6ZSwganNvbik7XG4mIzQzO1x0c25wcmludGYoZm9ybWF0dGVkLCBzaXplb2YoZm9ybWF0dGVkKSwgXCYjMzQ7e1xcXCYjMzQ7a2V5XFxcJiMzNDs6JXUsXFxcJiMzNDt2YWx1ZVxcXCYjMzQ7OiV1fVwmIzM0OyxcbiYjNDM7XHRcdCBrZXksIHZhbHVlKTtcbiYjNDM7XHRpZiAoanNvbiBcdTAwMjZcdTAwMjYgdGVzdC1cdTAwM2VidGYpXG4mIzQzO1x0XHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLFxuJiM0MztcdFx0XHQgXCYjMzQ7e1xcXCYjMzQ7a2V5XFxcJiMzNDs6JXMsXFxcJiMzNDt2YWx1ZVxcXCYjMzQ7OiVzLFxcXCYjMzQ7Zm9ybWF0dGVkXFxcJiMzNDs6JXN9XCYjMzQ7LFxuJiM0MztcdFx0XHQga2V5X2hleCwgdmFsdWVfaGV4LCBmb3JtYXR0ZWQpO1xuJiM0MztcdGVsc2UgaWYgKGpzb24pXG4mIzQzO1x0XHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCBcJiMzNDt7XFxcJiMzNDtrZXlcXFwmIzM0OzolcyxcXFwmIzM0O3ZhbHVlXFxcJiMzNDs6JXN9XCYjMzQ7LFxuJiM0MztcdFx0XHQga2V5X2hleCwgdmFsdWVfaGV4KTtcbiYjNDM7XHRlbHNlIGlmICh0ZXN0LVx1MDAzZWJ0ZilcbiYjNDM7XHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFwmIzM0OyVzXCYjMzQ7LCBmb3JtYXR0ZWQpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFwmIzM0O2tleTolc3ZhbHVlOiVzXCYjMzQ7LCBrZXlfaGV4LCB2YWx1ZV9oZXgpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjaGVja19kdW1wKGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QsIF9fdTMyIGlkLCBib29sIGpzb24sIGJvb2wgcHJldHR5KVxuJiM0Mzt7XG4mIzQzO1x0Ym9vbCBhcnJheSA9IGpzb24gfHwgdGVzdC1cdTAwM2VidGY7XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBleHBlY3RlZFtSRUNPUkRfU0laRV0sIGZvb3Rlcls2NF07XG4mIzQzO1x0Ym9vbCBzZWVuW01BWF9FTlRSSUVTXSA9IHt9O1xuJiM0MztcdGNoYXIgKm91dHB1dCwgKnNyYywgKmRzdCwgKmN1cnNvcjtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgaSwgbjtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRvdXRwdXQgPSBjYWxsb2MoMSwgT1VUUFVUX1NJWkUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihvdXRwdXQsIFwmIzM0O2FsbG9jX291dHB1dFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDslc21hcCBkdW1wIGlkICV1XCYjMzQ7LFxuJiM0MztcdFx0IHByZXR0eSA/IFwmIzM0Oy1wIFwmIzM0OyA6IGpzb24gPyBcJiMzNDstaiBcJiMzNDsgOiBcJiMzNDtcJiMzNDssIGlkKTtcbiYjNDM7XHRlcnIgPSBnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O21hcF9kdW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdC8qIElnbm9yZSBwcmVzZW50YXRpb24gd2hpdGVzcGFjZSwgYnV0IGNvbXBhcmUgY29tcGxldGUgcmVjb3JkcyBhbmQgYWxsXG4mIzQzO1x0ICogcHVuY3R1YXRpb24uIEV4cGVjdGVkIGNvbnRlbnRzIGNvbWUgb25seSBmcm9tIHRoZSBpbnB1dCBkYXRhLCBuZXZlclxuJiM0MztcdCAqIGZyb20gYW5vdGhlciBtYXAgd2FsayBvciBicGZ0b29sIGludm9jYXRpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0Zm9yIChzcmMgPSBvdXRwdXQsIGRzdCA9IG91dHB1dDsgKnNyYzsgc3JjJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmICghaXNzcGFjZSgodW5zaWduZWQgY2hhcikqc3JjKSlcbiYjNDM7XHRcdFx0KmRzdCYjNDM7JiM0MzsgPSAqc3JjO1xuJiM0MztcdCpkc3QgPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcdGN1cnNvciA9IG91dHB1dDtcbiYjNDM7XHRpZiAoYXJyYXkpIHtcbiYjNDM7XHRcdGlmICghQVNTRVJUX0VRKCpjdXJzb3IsICYjMzk7WyYjMzk7LCBcJiMzNDthcnJheV9zdGFydFwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0Y3Vyc29yJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1x0Zm9yIChuID0gMDsgbiBcdTAwM2MgdGVzdC1cdTAwM2Vjb3VudDsgbiYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChhcnJheSBcdTAwMjZcdTAwMjYgbikge1xuJiM0MztcdFx0XHRpZiAoIUFTU0VSVF9FUSgqY3Vyc29yLCAmIzM5OywmIzM5OywgXCYjMzQ7cmVjb3JkX3NlcGFyYXRvclwmIzM0OykpXG4mIzQzO1x0XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRcdGN1cnNvciYjNDM7JiM0Mzs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0ZXN0LVx1MDAzZWNvdW50OyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAoc2VlbltpXSlcbiYjNDM7XHRcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdFx0ZXhwZWN0ZWRfcmVjb3JkKGV4cGVjdGVkLCB0ZXN0LCBpLCBqc29uKTtcbiYjNDM7XHRcdFx0aWYgKCFzdHJuY21wKGN1cnNvciwgZXhwZWN0ZWQsIHN0cmxlbihleHBlY3RlZCkpKVxuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKCFBU1NFUlRfTFQoaSwgdGVzdC1cdTAwM2Vjb3VudCwgXCYjMzQ7dW5pcXVlX2V4cGVjdGVkX3JlY29yZFwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0c2VlbltpXSA9IHRydWU7XG4mIzQzO1x0XHRjdXJzb3IgJiM0Mzs9IHN0cmxlbihleHBlY3RlZCk7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChhcnJheSkge1xuJiM0MztcdFx0QVNTRVJUX1NUUkVRKGN1cnNvciwgXCYjMzQ7XVwmIzM0OywgXCYjMzQ7YXJyYXlfZW5kX2FuZF9jb3VudFwmIzM0Oyk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHNucHJpbnRmKGZvb3Rlciwgc2l6ZW9mKGZvb3RlciksIFwmIzM0O0ZvdW5kJXVlbGVtZW50JXNcJiMzNDssIHRlc3QtXHUwMDNlY291bnQsXG4mIzQzO1x0XHRcdCB0ZXN0LVx1MDAzZWNvdW50ID09IDEgPyBcJiMzNDtcJiMzNDsgOiBcJiMzNDtzXCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShjdXJzb3IsIGZvb3RlciwgXCYjMzQ7cGxhaW5fY291bnRcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7b3V0OlxuJiM0MztcdGZyZWUob3V0cHV0KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgcnVuX2R1bXBfY2FzZShjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0KVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4mIzQzO1x0c3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307XG4mIzQzO1x0X191MzIgaW5mb19sZW4gPSBzaXplb2YoaW5mbyk7XG4mIzQzO1x0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgaTtcbiYjNDM7XHRpbnQgZmQgPSAtMTtcbiYjNDM7XG4mIzQzO1x0aWYgKHRlc3QtXHUwMDNlYnRmKSB7XG4mIzQzO1x0XHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCYjMzQ7YnRmX25ld1wmIzM0OykpXG4mIzQzO1x0XHRcdHJldHVybjtcbiYjNDM7XHRcdGlmICghQVNTRVJUX0VRKGJ0Zl9fYWRkX2ludChidGYsIFwmIzM0O3Vuc2lnbmVkIGludFwmIzM0OywgNCwgMCksIDEsXG4mIzQzO1x0XHRcdCAgICAgICBcJiMzNDtidGZfaW50XCYjMzQ7KSB8fFxuJiM0MztcdFx0ICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksIFwmIzM0O2J0Zl9sb2FkXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRvcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTtcbiYjNDM7XHRcdG9wdHMuYnRmX2tleV90eXBlX2lkID0gMTtcbiYjNDM7XHRcdG9wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxO1xuJiM0MztcdH1cbiYjNDM7XHRmZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcJiMzNDtkdW1wX2JhdGNoXCYjMzQ7LCB0ZXN0LVx1MDAzZWtleV9zaXplLFxuJiM0MztcdFx0XHQgICAgdGVzdC1cdTAwM2V2YWx1ZV9zaXplLCB0ZXN0LVx1MDAzZWNvdW50ID86IDEsIFx1MDAyNm9wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGZkLCBcJiMzNDttYXBfY3JlYXRlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRlc3QtXHUwMDNlY291bnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRfX3UzMiBrZXkgPSBpLCB2YWx1ZSA9IGkgKiAzNyAmIzQzOyAxMTtcbiYjNDM7XHRcdHVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaTtcbiYjNDM7XHRcdHZvaWQgKmtleV9wdHIgPSB0ZXN0LVx1MDAzZWtleV9zaXplID09IDEgPyAodm9pZCAqKVx1MDAyNnNob3J0X2tleSA6IFx1MDAyNmtleTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkLCBrZXlfcHRyLCBcdTAwMjZ2YWx1ZSwgQlBGX0FOWSksXG4mIzQzO1x0XHRcdCAgICAgICBcJiMzNDttYXBfdXBkYXRlXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsIFx1MDAyNmluZm8sIFx1MDAyNmluZm9fbGVuKSwgXCYjMzQ7bWFwX2luZm9cJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgdHJ1ZSwgZmFsc2UpO1xuJiM0MztcdGNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgdHJ1ZSwgdHJ1ZSk7XG4mIzQzO291dDpcbiYjNDM7XHRpZiAoZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UoZmQpO1xuJiM0MztcdGJ0Zl9fZnJlZShidGYpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIHRlc3RfYnBmdG9vbF9tYXBfYmF0Y2godm9pZClcbiYjNDM7e1xuJiM0MztcdHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlIGNhc2VzW10gPSB7XG4mIzQzO1x0XHR7IFwmIzM0O2VtcHR5XCYjMzQ7LCAwLCA0LCA0IH0sXG4mIzQzO1x0XHR7IFwmIzM0O3NpbmdsZVwmIzM0OywgMSwgNCwgNCB9LFxuJiM0MztcdFx0eyBcJiMzNDtiZWxvd19iYXRjaFwmIzM0OywgMjU1LCA0LCA0IH0sXG4mIzQzO1x0XHR7IFwmIzM0O2V4YWN0X2JhdGNoXCYjMzQ7LCAyNTYsIDQsIDQgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7YWJvdmVfYmF0Y2hcJiMzNDssIDI1NywgNCwgNCB9LFxuJiM0MztcdFx0eyBcJiMzNDttdWx0aXBsZV9iYXRjaGVzXCYjMzQ7LCAxMDI1LCA0LCA0IH0sXG4mIzQzO1x0XHR7IFwmIzM0O29uZV9ieXRlX2tleVwmIzM0OywgMjU2LCAxLCA0IH0sXG4mIzQzO1x0XHR7IFwmIzM0O29kZF92YWx1ZV9zaXplXCYjMzQ7LCAyNTcsIDQsIDMgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7YnRmX2VtcHR5XCYjMzQ7LCAwLCA0LCA0LCB0cnVlIH0sXG4mIzQzO1x0XHR7IFwmIzM0O2J0Zl9zaW5nbGVcJiMzNDssIDEsIDQsIDQsIHRydWUgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7YnRmX211bHRpcGxlX2JhdGNoZXNcJiMzNDssIDEwMjUsIDQsIDQsIHRydWUgfSxcbiYjNDM7XHR9O1xuJiM0MztcdHVuc2lnbmVkIGludCBpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGNhc2VzKTsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChjYXNlc1tpXS5uYW1lKSlcbiYjNDM7XHRcdFx0cnVuX2R1bXBfY2FzZShcdTAwMjZjYXNlc1tpXSk7XG4mIzQzO31cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMjowOTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBvbmx5IHVzZXItc3BhY2UgdG9vbGluZyBhbmQgc2VsZnRlc3RzIHVuZGVyIHRvb2xzLyAoYnBmdG9vbCBhbmQgQlBGIHNlbGZ0ZXN0cykgYW5kIGRvZXMgbm90IG1ha2UgYW55IGNoYW5nZXMgdG8gdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNWEwYTNlNTE1ZWI0YTZkOGZjMDg5NDY1ODE5NTQwZThmYjQzYjY4MApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDcgMDI6MDk6MzcgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXAuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCmluZGV4IDY4NGE4ZmI3MjQxNDYuLjFlY2NkYzBkMWU5NjMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCkBAIC03NDAsMTUgJiM0Mzs3NDAsMTAgQEAgc3RhdGljIGludCBkb19zaG93KGludCBhcmdjLCBjaGFyICoqYXJndikKIAlyZXR1cm4gZXJybm8gPT0gRU5PRU5UID8gMCA6IC0xOwogfQogCi1zdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAotCQkJIHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsCi0JCQkganNvbl93cml0ZXJfdCAqYnRmX3d0cikKJiM0MztzdGF0aWMgdm9pZCBwcmludF9tYXBfZWxlbSh2b2lkICprZXksIHZvaWQgKnZhbHVlLAomIzQzOwkJCSAgIHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsCiYjNDM7CQkJICAganNvbl93cml0ZXJfdCAqYnRmX3d0cikKIHsKLQlpZiAoYnBmX21hcF9sb29rdXBfZWxlbShmZCwga2V5LCB2YWx1ZSkpIHsKLQkJcHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgZXJybm8pOwotCQlyZXR1cm4gLTE7Ci0JfQotCiAJaWYgKGpzb25fb3V0cHV0KSB7CiAJCXByaW50X2VudHJ5X2pzb24obWFwX2luZm8sIGtleSwgdmFsdWUsIGJ0Zik7CiAJfSBlbHNlIGlmIChidGYpIHsKQEAgLTc2MiwxMCAmIzQzOzc1NywxMDggQEAgc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwKIAl9IGVsc2UgewogCQlwcmludF9lbnRyeV9wbGFpbihtYXBfaW5mbywga2V5LCB2YWx1ZSk7CiAJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAomIzQzOwkJCSBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLAomIzQzOwkJCSBqc29uX3dyaXRlcl90ICpidGZfd3RyKQomIzQzO3sKJiM0MzsJaWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7CiYjNDM7CQlwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KIAomIzQzOwlwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBtYXBfaW5mbywgYnRmLCBidGZfd3RyKTsKIAlyZXR1cm4gMDsKIH0KIAomIzQzOyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfU0laRSAyNTZVCiYjNDM7I2RlZmluZSBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgKDQgKiAxMDI0ICogMTAyNCkKJiM0MzsKJiM0MzsvKiBSZXR1cm4gMSB0byB1c2UgaW5kaXZpZHVhbCBsb29rdXBzLCBidXQgb25seSBiZWZvcmUgYmF0Y2ggdHJhdmVyc2FsIHN0YXJ0cy4gKi8KJiM0MztzdGF0aWMgaW50IGR1bXBfbWFwX2JhdGNoKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwKJiM0MzsJCQkgIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHN0cnVjdCBidGYgKmJ0ZiwKJiM0MzsJCQkgIGpzb25fd3JpdGVyX3QgKnd0ciwgdW5zaWduZWQgaW50ICpudW1fZWxlbXMpCiYjNDM7ewomIzQzOwlfX3UzMiBjYXBhY2l0eSwgY291bnQsIGJhdGNoID0gMCwgbmV4dF9iYXRjaCA9IDAsIGk7CiYjNDM7CXZvaWQgKmtleXMgPSBOVUxMLCAqdmFsdWVzID0gTlVMTCwgKmJ1ZjsKJiM0MzsJYm9vbCBmaXJzdCA9IHRydWUsIGNhbl9mYWxsYmFjayA9IHRydWU7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CS8qIEhhc2ggbG9va3VwIGJhdGNoZXMgbXVzdCBhY2NvbW1vZGF0ZSBhIHdob2xlIGJ1Y2tldC4gUmVzdHJpY3QgdGhlCiYjNDM7CSAqIG9wdGltaXphdGlvbiB0byBtYXBzIHdob3NlIHdvcnN0LWNhc2UgYnVja2V0IGZpdHMgdGhlIG1lbW9yeSBidWRnZXQsCiYjNDM7CSAqIHNvIGEgbGF0ZXIgRU5PU1BDIG5ldmVyIGZvcmNlcyBhIHJlc3RhcnQgYWZ0ZXIgcHJpbnRpbmcgc29tZSBlbnRyaWVzLgomIzQzOwkgKiBEaXZpc2lvbiBhbHNvIGJvdW5kcyB0aGUgYWxsb2NhdGlvbiBtdWx0aXBsaWNhdGlvbnMgb24gMzItYml0IGhvc3RzLgomIzQzOwkgKi8KJiM0MzsJaWYgKGluZm8tJmd0O3R5cGUgIT0gQlBGX01BUF9UWVBFX0hBU0ggfHwgIWluZm8tJmd0O21heF9lbnRyaWVzIHx8CiYjNDM7CSAgICAoX191NjQpaW5mby0mZ3Q7a2V5X3NpemUgJiM0MzsgaW5mby0mZ3Q7dmFsdWVfc2l6ZSAmZ3Q7CiYjNDM7CSAgICBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgLyBpbmZvLSZndDttYXhfZW50cmllcykKJiM0MzsJCXJldHVybiAxOwomIzQzOwomIzQzOwljYXBhY2l0eSA9IG1pbihpbmZvLSZndDttYXhfZW50cmllcywgTUFQX0RVTVBfQkFUQ0hfU0laRSk7CiYjNDM7cmVzaXplOgomIzQzOwlidWYgPSByZWFsbG9jKGtleXMsIChzaXplX3QpY2FwYWNpdHkgKiBpbmZvLSZndDtrZXlfc2l6ZSk7CiYjNDM7CWlmICghYnVmKSB7CiYjNDM7CQllcnIgPSBFTk9NRU07CiYjNDM7CQlnb3RvIGVycm9yOwomIzQzOwl9CiYjNDM7CWtleXMgPSBidWY7CiYjNDM7CWJ1ZiA9IHJlYWxsb2ModmFsdWVzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby0mZ3Q7dmFsdWVfc2l6ZSk7CiYjNDM7CWlmICghYnVmKSB7CiYjNDM7CQllcnIgPSBFTk9NRU07CiYjNDM7CQlnb3RvIGVycm9yOwomIzQzOwl9CiYjNDM7CXZhbHVlcyA9IGJ1ZjsKJiM0MzsKJiM0MzsJd2hpbGUgKHRydWUpIHsKJiM0MzsJCWNvdW50ID0gY2FwYWNpdHk7CiYjNDM7CQllcnIgPSBicGZfbWFwX2xvb2t1cF9iYXRjaChmZCwgZmlyc3QgPyBOVUxMIDogJmFtcDtiYXRjaCwKJiM0MzsJCQkJCSAgICZhbXA7bmV4dF9iYXRjaCwga2V5cywgdmFsdWVzLCAmYW1wO2NvdW50LCBOVUxMKTsKJiM0MzsJCWVyciA9IGVyciA/IGVycm5vIDogMDsKJiM0MzsJCS8qIE9sZGVyIGtlcm5lbHMgcmVqZWN0IHRoZSBjb21tYW5kIGJlZm9yZSB1cGRhdGluZyBjb3VudC4gRG8gbm90CiYjNDM7CQkgKiBpbnNwZWN0IHRoZSBidWZmZXJzIG9uIHRoZXNlIGVycm9ycywgb3IgZmFsbCBiYWNrIGFmdGVyIHByb2dyZXNzLgomIzQzOwkJICovCiYjNDM7CQlpZiAoY2FuX2ZhbGxiYWNrICZhbXA7JmFtcDsgKGVyciA9PSBFSU5WQUwgfHwgZXJyID09IEVPUE5PVFNVUFAgfHwKJiM0MzsJCQkJICAgICBlcnIgPT0gNTI0IC8qIEVOT1RTVVBQICovKSkgewomIzQzOwkJCWVyciA9IDE7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CQljYW5fZmFsbGJhY2sgPSBmYWxzZTsKJiM0MzsJCWlmIChlcnIgPT0gRU5PU1BDKSB7CiYjNDM7CQkJaWYgKGNhcGFjaXR5ID09IGluZm8tJmd0O21heF9lbnRyaWVzKQomIzQzOwkJCQlnb3RvIGVycm9yOwomIzQzOwkJCWNhcGFjaXR5ICYjNDM7PSBtaW4oY2FwYWNpdHksIGluZm8tJmd0O21heF9lbnRyaWVzIC0gY2FwYWNpdHkpOwomIzQzOwkJCS8qIFByZXNlcnZlIHRoZSBpbnB1dCBjdXJzb3I6IHRoZSBvdmVyc2l6ZWQgYnVja2V0IHdhcyBub3QgcmVhZC4gKi8KJiM0MzsJCQlnb3RvIHJlc2l6ZTsKJiM0MzsJCX0KJiM0MzsJCS8qIEluIHBhcnRpY3VsYXIsIEVGQVVMVCBjYW4gbGVhdmUgY291bnQgYW5kIHRoZSBidWZmZXJzIGludmFsaWQuICovCiYjNDM7CQlpZiAoZXJyICZhbXA7JmFtcDsgZXJyICE9IEVOT0VOVCkKJiM0MzsJCQlnb3RvIGVycm9yOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IGNvdW50OyBpJiM0MzsmIzQzOykgewomIzQzOwkJCS8qIEtlZXAgdGhlIGFsaWdubWVudCBwcm92aWRlZCBieSBpbmRpdmlkdWFsIGxvb2t1cHMsIGluY2x1ZGluZwomIzQzOwkJCSAqIGZvciBCVEYgdHlwZXMgd2hvc2UgbWFwIGtleS92YWx1ZSBzaXplIGlzIG5vdCBhbGlnbmVkLgomIzQzOwkJCSAqLwomIzQzOwkJCW1lbWNweShrZXksIGtleXMgJiM0MzsgKHNpemVfdClpICogaW5mby0mZ3Q7a2V5X3NpemUsIGluZm8tJmd0O2tleV9zaXplKTsKJiM0MzsJCQltZW1jcHkodmFsdWUsIHZhbHVlcyAmIzQzOyAoc2l6ZV90KWkgKiBpbmZvLSZndDt2YWx1ZV9zaXplLCBpbmZvLSZndDt2YWx1ZV9zaXplKTsKJiM0MzsJCQlwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cik7CiYjNDM7CQkJKCpudW1fZWxlbXMpJiM0MzsmIzQzOzsKJiM0MzsJCX0KJiM0MzsJCWlmIChlcnIgPT0gRU5PRU5UKSB7CiYjNDM7CQkJZXJyID0gMDsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsJCWZpcnN0ID0gZmFsc2U7CiYjNDM7CQliYXRjaCA9IG5leHRfYmF0Y2g7CiYjNDM7CX0KJiM0MztlcnJvcjoKJiM0MzsJcF9lcnIoJiMzNDtjYW4mIzM5O3QgbG9va3VwIG1hcCBiYXRjaDogJXMmIzM0Oywgc3RyZXJyb3IoZXJyKSk7CiYjNDM7CWVyciA9IC0xOwomIzQzO291dDoKJiM0MzsJZnJlZShrZXlzKTsKJiM0MzsJZnJlZSh2YWx1ZXMpOwomIzQzOwlyZXR1cm4gZXJyOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQgbWFwc19oYXZlX2J0ZihpbnQgKmZkcywgaW50IG5iX2ZkcykKIHsKIAlzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTsKQEAgLTg2OSw2ICYjNDM7OTYyLDkgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCiAJCXBfaW5mbygmIzM0O1dhcm5pbmc6IGNhbm5vdCByZWFkIHZhbHVlcyBmcm9tICVzIG1hcCB3aXRoIHZhbHVlX3NpemUgIT0gOCYjMzQ7LAogCQkgICAgICAgbWFwX3R5cGVfc3RyKTsKIAl9CiYjNDM7CWVyciA9IGR1bXBfbWFwX2JhdGNoKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0ciwgJmFtcDtudW1fZWxlbXMpOwomIzQzOwlpZiAoZXJyICE9IDEpCiYjNDM7CQlnb3RvIGVuZF9kdW1wOwogCXdoaWxlICh0cnVlKSB7CiAJCWVyciA9IGJwZl9tYXBfZ2V0X25leHRfa2V5KGZkLCBwcmV2X2tleSwga2V5KTsKIAkJaWYgKGVycikgewpAQCAtODgxLDYgJiM0Mzs5NzcsNyBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0ciwKIAkJcHJldl9rZXkgPSBrZXk7CiAJfQogCiYjNDM7ZW5kX2R1bXA6CiAJaWYgKHd0cikgewogCQlqc29ud19lbmRfYXJyYXkod3RyKTsJLyogZWxlbWVudHMgKi8KIAkJaWYgKHNob3dfaGVhZGVyKQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uMTM5ZDEzYTQ5ZGNlZgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmMKQEAgLTAsMCAmIzQzOzEsMTg2IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGZ0b29sX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2J0Zi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtjdHlwZS5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgTUFYX0VOVFJJRVMgMTAyNQomIzQzOyNkZWZpbmUgUkVDT1JEX1NJWkUgMjU2CiYjNDM7I2RlZmluZSBPVVRQVVRfU0laRSAoTUFYX0VOVFJJRVMgKiBSRUNPUkRfU0laRSAmIzQzOyAxMDI0KQomIzQzOwomIzQzO3N0cnVjdCBkdW1wX2Nhc2UgewomIzQzOwljb25zdCBjaGFyICpuYW1lOwomIzQzOwl1bnNpZ25lZCBpbnQgY291bnQ7CiYjNDM7CXVuc2lnbmVkIGludCBrZXlfc2l6ZTsKJiM0MzsJdW5zaWduZWQgaW50IHZhbHVlX3NpemU7CiYjNDM7CWJvb2wgYnRmOwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgaGV4X2J5dGVzKGNoYXIgKm91dCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUsIGJvb2wganNvbikKJiM0Mzt7CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gZGF0YTsKJiM0MzsJdW5zaWduZWQgaW50IGk7CiYjNDM7CiYjNDM7CWlmIChqc29uKQomIzQzOwkJKm91dCYjNDM7JiM0MzsgPSAmIzM5O1smIzM5OzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IHNpemU7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoanNvbiAmYW1wOyZhbXA7IGkpCiYjNDM7CQkJKm91dCYjNDM7JiM0MzsgPSAmIzM5OywmIzM5OzsKJiM0MzsJCW91dCAmIzQzOz0gc3ByaW50ZihvdXQsIGpzb24gPyAmIzM0O1wmIzM0OzB4JTAyeFwmIzM0OyYjMzQ7IDogJiMzNDslMDJ4JiMzNDssIGJ5dGVzW2ldKTsKJiM0MzsJfQomIzQzOwlpZiAoanNvbikKJiM0MzsJCSpvdXQmIzQzOyYjNDM7ID0gJiMzOTtdJiMzOTs7CiYjNDM7CSpvdXQgPSAmIzM5O1wwJiMzOTs7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGV4cGVjdGVkX3JlY29yZChjaGFyICpyZWNvcmQsIGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QsCiYjNDM7CQkJICAgIHVuc2lnbmVkIGludCBpbmRleCwgYm9vbCBqc29uKQomIzQzO3sKJiM0MzsJX191MzIga2V5ID0gaW5kZXgsIHZhbHVlID0gaW5kZXggKiAzNyAmIzQzOyAxMTsKJiM0MzsJdW5zaWduZWQgY2hhciBzaG9ydF9rZXkgPSBpbmRleDsKJiM0MzsJY2hhciBrZXlfaGV4WzY0XSwgdmFsdWVfaGV4WzY0XSwgZm9ybWF0dGVkWzk2XTsKJiM0MzsKJiM0MzsJaGV4X2J5dGVzKGtleV9oZXgsIHRlc3QtJmd0O2tleV9zaXplID09IDEgPyAodm9pZCAqKSZhbXA7c2hvcnRfa2V5IDogJmFtcDtrZXksCiYjNDM7CQkgIHRlc3QtJmd0O2tleV9zaXplLCBqc29uKTsKJiM0MzsJaGV4X2J5dGVzKHZhbHVlX2hleCwgJmFtcDt2YWx1ZSwgdGVzdC0mZ3Q7dmFsdWVfc2l6ZSwganNvbik7CiYjNDM7CXNucHJpbnRmKGZvcm1hdHRlZCwgc2l6ZW9mKGZvcm1hdHRlZCksICYjMzQ7e1wmIzM0O2tleVwmIzM0OzoldSxcJiMzNDt2YWx1ZVwmIzM0OzoldX0mIzM0OywKJiM0MzsJCSBrZXksIHZhbHVlKTsKJiM0MzsJaWYgKGpzb24gJmFtcDsmYW1wOyB0ZXN0LSZndDtidGYpCiYjNDM7CQlzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLAomIzQzOwkJCSAmIzM0O3tcJiMzNDtrZXlcJiMzNDs6JXMsXCYjMzQ7dmFsdWVcJiMzNDs6JXMsXCYjMzQ7Zm9ybWF0dGVkXCYjMzQ7OiVzfSYjMzQ7LAomIzQzOwkJCSBrZXlfaGV4LCB2YWx1ZV9oZXgsIGZvcm1hdHRlZCk7CiYjNDM7CWVsc2UgaWYgKGpzb24pCiYjNDM7CQlzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCAmIzM0O3tcJiMzNDtrZXlcJiMzNDs6JXMsXCYjMzQ7dmFsdWVcJiMzNDs6JXN9JiMzNDssCiYjNDM7CQkJIGtleV9oZXgsIHZhbHVlX2hleCk7CiYjNDM7CWVsc2UgaWYgKHRlc3QtJmd0O2J0ZikKJiM0MzsJCXNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsICYjMzQ7JXMmIzM0OywgZm9ybWF0dGVkKTsKJiM0MzsJZWxzZQomIzQzOwkJc25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgJiMzNDtrZXk6JXN2YWx1ZTolcyYjMzQ7LCBrZXlfaGV4LCB2YWx1ZV9oZXgpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBjaGVja19kdW1wKGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QsIF9fdTMyIGlkLCBib29sIGpzb24sIGJvb2wgcHJldHR5KQomIzQzO3sKJiM0MzsJYm9vbCBhcnJheSA9IGpzb24gfHwgdGVzdC0mZ3Q7YnRmOwomIzQzOwljaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIGV4cGVjdGVkW1JFQ09SRF9TSVpFXSwgZm9vdGVyWzY0XTsKJiM0MzsJYm9vbCBzZWVuW01BWF9FTlRSSUVTXSA9IHt9OwomIzQzOwljaGFyICpvdXRwdXQsICpzcmMsICpkc3QsICpjdXJzb3I7CiYjNDM7CXVuc2lnbmVkIGludCBpLCBuOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlvdXRwdXQgPSBjYWxsb2MoMSwgT1VUUFVUX1NJWkUpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIob3V0cHV0LCAmIzM0O2FsbG9jX291dHB1dCYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAmIzM0OyVzbWFwIGR1bXAgaWQgJXUmIzM0OywKJiM0MzsJCSBwcmV0dHkgPyAmIzM0Oy1wICYjMzQ7IDoganNvbiA/ICYjMzQ7LWogJiMzNDsgOiAmIzM0OyYjMzQ7LCBpZCk7CiYjNDM7CWVyciA9IGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7bWFwX2R1bXAmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJLyogSWdub3JlIHByZXNlbnRhdGlvbiB3aGl0ZXNwYWNlLCBidXQgY29tcGFyZSBjb21wbGV0ZSByZWNvcmRzIGFuZCBhbGwKJiM0MzsJICogcHVuY3R1YXRpb24uIEV4cGVjdGVkIGNvbnRlbnRzIGNvbWUgb25seSBmcm9tIHRoZSBpbnB1dCBkYXRhLCBuZXZlcgomIzQzOwkgKiBmcm9tIGFub3RoZXIgbWFwIHdhbGsgb3IgYnBmdG9vbCBpbnZvY2F0aW9uLgomIzQzOwkgKi8KJiM0MzsJZm9yIChzcmMgPSBvdXRwdXQsIGRzdCA9IG91dHB1dDsgKnNyYzsgc3JjJiM0MzsmIzQzOykKJiM0MzsJCWlmICghaXNzcGFjZSgodW5zaWduZWQgY2hhcikqc3JjKSkKJiM0MzsJCQkqZHN0JiM0MzsmIzQzOyA9ICpzcmM7CiYjNDM7CSpkc3QgPSAmIzM5O1wwJiMzOTs7CiYjNDM7CWN1cnNvciA9IG91dHB1dDsKJiM0MzsJaWYgKGFycmF5KSB7CiYjNDM7CQlpZiAoIUFTU0VSVF9FUSgqY3Vyc29yLCAmIzM5O1smIzM5OywgJiMzNDthcnJheV9zdGFydCYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWN1cnNvciYjNDM7JiM0Mzs7CiYjNDM7CX0KJiM0MzsJZm9yIChuID0gMDsgbiAmbHQ7IHRlc3QtJmd0O2NvdW50OyBuJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKGFycmF5ICZhbXA7JmFtcDsgbikgewomIzQzOwkJCWlmICghQVNTRVJUX0VRKCpjdXJzb3IsICYjMzk7LCYjMzk7LCAmIzM0O3JlY29yZF9zZXBhcmF0b3ImIzM0OykpCiYjNDM7CQkJCWdvdG8gb3V0OwomIzQzOwkJCWN1cnNvciYjNDM7JiM0Mzs7CiYjNDM7CQl9CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgdGVzdC0mZ3Q7Y291bnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJaWYgKHNlZW5baV0pCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCWV4cGVjdGVkX3JlY29yZChleHBlY3RlZCwgdGVzdCwgaSwganNvbik7CiYjNDM7CQkJaWYgKCFzdHJuY21wKGN1cnNvciwgZXhwZWN0ZWQsIHN0cmxlbihleHBlY3RlZCkpKQomIzQzOwkJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsJCWlmICghQVNTRVJUX0xUKGksIHRlc3QtJmd0O2NvdW50LCAmIzM0O3VuaXF1ZV9leHBlY3RlZF9yZWNvcmQmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlzZWVuW2ldID0gdHJ1ZTsKJiM0MzsJCWN1cnNvciAmIzQzOz0gc3RybGVuKGV4cGVjdGVkKTsKJiM0MzsJfQomIzQzOwlpZiAoYXJyYXkpIHsKJiM0MzsJCUFTU0VSVF9TVFJFUShjdXJzb3IsICYjMzQ7XSYjMzQ7LCAmIzM0O2FycmF5X2VuZF9hbmRfY291bnQmIzM0Oyk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlzbnByaW50Zihmb290ZXIsIHNpemVvZihmb290ZXIpLCAmIzM0O0ZvdW5kJXVlbGVtZW50JXMmIzM0OywgdGVzdC0mZ3Q7Y291bnQsCiYjNDM7CQkJIHRlc3QtJmd0O2NvdW50ID09IDEgPyAmIzM0OyYjMzQ7IDogJiMzNDtzJiMzNDspOwomIzQzOwkJQVNTRVJUX1NUUkVRKGN1cnNvciwgZm9vdGVyLCAmIzM0O3BsYWluX2NvdW50JiMzNDspOwomIzQzOwl9CiYjNDM7b3V0OgomIzQzOwlmcmVlKG91dHB1dCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJ1bl9kdW1wX2Nhc2UoY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdCkKJiM0Mzt7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpOwomIzQzOwlzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTsKJiM0MzsJX191MzIgaW5mb19sZW4gPSBzaXplb2YoaW5mbyk7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7CiYjNDM7CXVuc2lnbmVkIGludCBpOwomIzQzOwlpbnQgZmQgPSAtMTsKJiM0MzsKJiM0MzsJaWYgKHRlc3QtJmd0O2J0ZikgewomIzQzOwkJYnRmID0gYnRmX19uZXdfZW1wdHkoKTsKJiM0MzsJCWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7YnRmX25ldyYjMzQ7KSkKJiM0MzsJCQlyZXR1cm47CiYjNDM7CQlpZiAoIUFTU0VSVF9FUShidGZfX2FkZF9pbnQoYnRmLCAmIzM0O3Vuc2lnbmVkIGludCYjMzQ7LCA0LCAwKSwgMSwKJiM0MzsJCQkgICAgICAgJiMzNDtidGZfaW50JiMzNDspIHx8CiYjNDM7CQkgICAgIUFTU0VSVF9PSyhidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKSwgJiMzNDtidGZfbG9hZCYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCW9wdHMuYnRmX2ZkID0gYnRmX19mZChidGYpOwomIzQzOwkJb3B0cy5idGZfa2V5X3R5cGVfaWQgPSAxOwomIzQzOwkJb3B0cy5idGZfdmFsdWVfdHlwZV9pZCA9IDE7CiYjNDM7CX0KJiM0MzsJZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgJiMzNDtkdW1wX2JhdGNoJiMzNDssIHRlc3QtJmd0O2tleV9zaXplLAomIzQzOwkJCSAgICB0ZXN0LSZndDt2YWx1ZV9zaXplLCB0ZXN0LSZndDtjb3VudCA/OiAxLCAmYW1wO29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChmZCwgJiMzNDttYXBfY3JlYXRlJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyB0ZXN0LSZndDtjb3VudDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCV9fdTMyIGtleSA9IGksIHZhbHVlID0gaSAqIDM3ICYjNDM7IDExOwomIzQzOwkJdW5zaWduZWQgY2hhciBzaG9ydF9rZXkgPSBpOwomIzQzOwkJdm9pZCAqa2V5X3B0ciA9IHRlc3QtJmd0O2tleV9zaXplID09IDEgPyAodm9pZCAqKSZhbXA7c2hvcnRfa2V5IDogJmFtcDtrZXk7CiYjNDM7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkLCBrZXlfcHRyLCAmYW1wO3ZhbHVlLCBCUEZfQU5ZKSwKJiM0MzsJCQkgICAgICAgJiMzNDttYXBfdXBkYXRlJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CWlmICghQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsICZhbXA7aW5mbywgJmFtcDtpbmZvX2xlbiksICYjMzQ7bWFwX2luZm8mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJY2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCBmYWxzZSwgZmFsc2UpOwomIzQzOwljaGVja19kdW1wKHRlc3QsIGluZm8uaWQsIHRydWUsIGZhbHNlKTsKJiM0MzsJY2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCB0cnVlKTsKJiM0MztvdXQ6CiYjNDM7CWlmIChmZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoZmQpOwomIzQzOwlidGZfX2ZyZWUoYnRmKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2JhdGNoKHZvaWQpCiYjNDM7ewomIzQzOwlzdGF0aWMgY29uc3Qgc3RydWN0IGR1bXBfY2FzZSBjYXNlc1tdID0gewomIzQzOwkJeyAmIzM0O2VtcHR5JiMzNDssIDAsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDtzaW5nbGUmIzM0OywgMSwgNCwgNCB9LAomIzQzOwkJeyAmIzM0O2JlbG93X2JhdGNoJiMzNDssIDI1NSwgNCwgNCB9LAomIzQzOwkJeyAmIzM0O2V4YWN0X2JhdGNoJiMzNDssIDI1NiwgNCwgNCB9LAomIzQzOwkJeyAmIzM0O2Fib3ZlX2JhdGNoJiMzNDssIDI1NywgNCwgNCB9LAomIzQzOwkJeyAmIzM0O211bHRpcGxlX2JhdGNoZXMmIzM0OywgMTAyNSwgNCwgNCB9LAomIzQzOwkJeyAmIzM0O29uZV9ieXRlX2tleSYjMzQ7LCAyNTYsIDEsIDQgfSwKJiM0MzsJCXsgJiMzNDtvZGRfdmFsdWVfc2l6ZSYjMzQ7LCAyNTcsIDQsIDMgfSwKJiM0MzsJCXsgJiMzNDtidGZfZW1wdHkmIzM0OywgMCwgNCwgNCwgdHJ1ZSB9LAomIzQzOwkJeyAmIzM0O2J0Zl9zaW5nbGUmIzM0OywgMSwgNCwgNCwgdHJ1ZSB9LAomIzQzOwkJeyAmIzM0O2J0Zl9tdWx0aXBsZV9iYXRjaGVzJiMzNDssIDEwMjUsIDQsIDQsIHRydWUgfSwKJiM0MzsJfTsKJiM0MzsJdW5zaWduZWQgaW50IGk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBBUlJBWV9TSVpFKGNhc2VzKTsgaSYjNDM7JiM0MzspCiYjNDM7CQlpZiAodGVzdF9fc3RhcnRfc3VidGVzdChjYXNlc1tpXS5uYW1lKSkKJiM0MzsJCQlydW5fZHVtcF9jYXNlKCZhbXA7Y2FzZXNbaV0pOwomIzQzO30KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDI6MDk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjk3OQoJCQkJCQkJb3V0cHV0OiA3NwoJCQkJCQkJdGhvdWdodHM6IDQzNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipQYXRjaCBBbmFseXNpczogV29ydGhGdXp6aW5nIERldGVybWluYXRpb24qKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gVGhlIGRpZmYgYWZmZWN0cyBgdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNgIGFuZCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY2AuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBydW4gdGhyb3VnaCB0aGUgbmVnYXRpdmUgY3JpdGVyaWEgY2hlY2tsaXN0LiBJIG5lZWQgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgY2hhbmdlIHdhcnJhbnRzIGZ1enppbmcuCgpUaGUgY3JpdGVyaWEgc2F5cyBgV29ydGhGdXp6aW5nPWZhbHNlYCBpZiAqYWxsKiBtb2RpZmllZCBjb2RlIGZhbGxzIHVuZGVyIHNwZWNpZmljIGNhdGVnb3JpZXMuIFNwZWNpZmljYWxseSwgSSBuZWVkIHRvIGNoZWNrIGZvciBub24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzLCBsaWtlIGRvY3VtZW50YXRpb24sIGNvbW1lbnRzLCBzcGVsbGluZyBmaXhlcywgb3IgdXNlci1zcGFjZSBjb2RlIHRoYXQgZG9lc24mIzM5O3QgaW1wYWN0IHRoZSBrZXJuZWwgaW1hZ2Ugb3IgbW9kdWxlcy4KCkEgcXVpY2sgZ2xhbmNlIHRlbGxzIG1lIGJvdGggZmlsZXMgYXJlIHVuZGVyIGB0b29scy9gLCBzbyB0aGV5JiMzOTtyZSB1c2VyLXNwYWNlLiBJIG5lZWQgdG8gYmUgYWJzb2x1dGVseSBzdXJlIHRob3VnaCwgc28gbGV0JiMzOTtzIGRvdWJsZS1jaGVjayBieSBsb29raW5nIGRpcmVjdGx5IGF0IHRoZSBkaWZmLCBubyBuZWVkIHRvIGludm9sdmUgZ2l0IGNvbW1hbmRzIGZvciBzdWNoIGEgc21hbGwgY2hhbmdlLiBUaGUgZGlmZiBjb25maXJtcyBteSBpbml0aWFsIGFzc2Vzc21lbnQ6IG9ubHkgdGhvc2UgdHdvIGZpbGVzLgoKR2l2ZW4gdGhhdCB0aGVzZSBhcmUgc3RyaWN0bHkgd2l0aGluIHRoZSBgdG9vbHMvYCBkaXJlY3RvcnksIGFuZCBpdCYjMzk7cyBhbGwgdXNlci1zcGFjZSwgKndpdGhvdXQqIGFmZmVjdGluZyB0aGUga2VybmVsIGltYWdlIG9yIG1vZHVsZXMsIEkmIzM5O20gY29uZmlkZW50IGluIHNheWluZyB0aGlzIHBhdGNoIGRvZXNuJiMzOTt0IHdhcnJhbnQgZnV6emluZy4KClNvLCBJJiMzOTttIGdvaW5nIHdpdGg6CgoqICAgYFdvcnRoRnV6emluZzogZmFsc2VgCiogICBgRm9jdXNTeW1ib2xzOiBbXWAgKG5vdGhpbmcgdG8gc3BlY2lmaWNhbGx5IHRhcmdldCkKKiAgIGBFbmFibGVDb25maWdzOiBbXWAgKG5vIHNwZWNpZmljIGNvbmZpZyBvcHRpb25zIG5lZWRlZCkKKiAgIGBSZWFzb25pbmc6IFRoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXItc3BhY2UgY29kZSB3aXRoaW4gdG9vbHMvICh0b29scy9icGYvYnBmdG9vbC9tYXAuYyBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guYyksIHdoaWNoIGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlIG9yIGtlcm5lbCBtb2R1bGVzLmAKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMjowOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFtdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlci1zcGFjZSB0b29saW5nIGFuZCBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvIChicGZ0b29sIGFuZCBCUEYgc2VsZnRlc3RzKSBhbmQgZG9lcyBub3QgbWFrZSBhbnkgY2hhbmdlcyB0byB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlci1zcGFjZSB0b29saW5nIGFuZCBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvIChicGZ0b29sIGFuZCBCUEYgc2VsZnRlc3RzKSBhbmQgZG9lcyBub3QgbWFrZSBhbnkgY2hhbmdlcyB0byB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDI6MDk8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDAyOjA5OjM5LjI0MjQxODM5MloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwMzE3NjYxMjc1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xpbmcgYW5kIHNlbGZ0ZXN0cyB1bmRlciB0b29scy8gKGJwZnRvb2wgYW5kIEJQRiBzZWxmdGVzdHMpIGFuZCBkb2VzIG5vdCBtYWtlIGFueSBjaGFuZ2VzIHRvIHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDI6MDk6MzkuMjQyNDIyMTkyWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTk4NzgwNTYyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgNWEwYTNlNTE1ZWI0YTZkOGZjMDg5NDY1ODE5NTQwZThmYjQzYjY4MFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgTW9uIFNlcCA3IDAyOjA5OjM3IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcXG5pbmRleCA2ODRhOGZiNzI0MTQ2Li4xZWNjZGMwZDFlOTYzIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcXG5AQCAtNzQwLDE1ICs3NDAsMTAgQEAgc3RhdGljIGludCBkb19zaG93KGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0cmV0dXJuIGVycm5vID09IEVOT0VOVCA/IDAgOiAtMTtcXG4gfVxcbiBcXG4tc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcXG4tXFx0XFx0XFx0IHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsXFxuLVxcdFxcdFxcdCBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxcbitzdGF0aWMgdm9pZCBwcmludF9tYXBfZWxlbSh2b2lkICprZXksIHZvaWQgKnZhbHVlLFxcbitcXHRcXHRcXHQgICBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxcbitcXHRcXHRcXHQgICBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxcbiB7XFxuLVxcdGlmIChicGZfbWFwX2xvb2t1cF9lbGVtKGZkLCBrZXksIHZhbHVlKSkge1xcbi1cXHRcXHRwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7XFxuLVxcdFxcdHJldHVybiAtMTtcXG4tXFx0fVxcbi1cXG4gXFx0aWYgKGpzb25fb3V0cHV0KSB7XFxuIFxcdFxcdHByaW50X2VudHJ5X2pzb24obWFwX2luZm8sIGtleSwgdmFsdWUsIGJ0Zik7XFxuIFxcdH0gZWxzZSBpZiAoYnRmKSB7XFxuQEAgLTc2MiwxMCArNzU3LDEwOCBAQCBzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxcbiBcXHR9IGVsc2Uge1xcbiBcXHRcXHRwcmludF9lbnRyeV9wbGFpbihtYXBfaW5mbywga2V5LCB2YWx1ZSk7XFxuIFxcdH1cXG4rfVxcbitcXG4rc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcXG4rXFx0XFx0XFx0IHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsXFxuK1xcdFxcdFxcdCBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxcbit7XFxuK1xcdGlmIChicGZfbWFwX2xvb2t1cF9lbGVtKGZkLCBrZXksIHZhbHVlKSkge1xcbitcXHRcXHRwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7XFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0fVxcbiBcXG4rXFx0cHJpbnRfbWFwX2VsZW0oa2V5LCB2YWx1ZSwgbWFwX2luZm8sIGJ0ZiwgYnRmX3d0cik7XFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbisjZGVmaW5lIE1BUF9EVU1QX0JBVENIX1NJWkUgMjU2VVxcbisjZGVmaW5lIE1BUF9EVU1QX0JBVENIX01BWF9CWVRFUyAoNCAqIDEwMjQgKiAxMDI0KVxcbitcXG4rLyogUmV0dXJuIDEgdG8gdXNlIGluZGl2aWR1YWwgbG9va3VwcywgYnV0IG9ubHkgYmVmb3JlIGJhdGNoIHRyYXZlcnNhbCBzdGFydHMuICovXFxuK3N0YXRpYyBpbnQgZHVtcF9tYXBfYmF0Y2goaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxcbitcXHRcXHRcXHQgIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHN0cnVjdCBidGYgKmJ0ZixcXG4rXFx0XFx0XFx0ICBqc29uX3dyaXRlcl90ICp3dHIsIHVuc2lnbmVkIGludCAqbnVtX2VsZW1zKVxcbit7XFxuK1xcdF9fdTMyIGNhcGFjaXR5LCBjb3VudCwgYmF0Y2ggPSAwLCBuZXh0X2JhdGNoID0gMCwgaTtcXG4rXFx0dm9pZCAqa2V5cyA9IE5VTEwsICp2YWx1ZXMgPSBOVUxMLCAqYnVmO1xcbitcXHRib29sIGZpcnN0ID0gdHJ1ZSwgY2FuX2ZhbGxiYWNrID0gdHJ1ZTtcXG4rXFx0aW50IGVycjtcXG4rXFxuK1xcdC8qIEhhc2ggbG9va3VwIGJhdGNoZXMgbXVzdCBhY2NvbW1vZGF0ZSBhIHdob2xlIGJ1Y2tldC4gUmVzdHJpY3QgdGhlXFxuK1xcdCAqIG9wdGltaXphdGlvbiB0byBtYXBzIHdob3NlIHdvcnN0LWNhc2UgYnVja2V0IGZpdHMgdGhlIG1lbW9yeSBidWRnZXQsXFxuK1xcdCAqIHNvIGEgbGF0ZXIgRU5PU1BDIG5ldmVyIGZvcmNlcyBhIHJlc3RhcnQgYWZ0ZXIgcHJpbnRpbmcgc29tZSBlbnRyaWVzLlxcbitcXHQgKiBEaXZpc2lvbiBhbHNvIGJvdW5kcyB0aGUgYWxsb2NhdGlvbiBtdWx0aXBsaWNhdGlvbnMgb24gMzItYml0IGhvc3RzLlxcbitcXHQgKi9cXG4rXFx0aWYgKGluZm8tXFx1MDAzZXR5cGUgIT0gQlBGX01BUF9UWVBFX0hBU0ggfHwgIWluZm8tXFx1MDAzZW1heF9lbnRyaWVzIHx8XFxuK1xcdCAgICAoX191NjQpaW5mby1cXHUwMDNla2V5X3NpemUgKyBpbmZvLVxcdTAwM2V2YWx1ZV9zaXplIFxcdTAwM2VcXG4rXFx0ICAgIE1BUF9EVU1QX0JBVENIX01BWF9CWVRFUyAvIGluZm8tXFx1MDAzZW1heF9lbnRyaWVzKVxcbitcXHRcXHRyZXR1cm4gMTtcXG4rXFxuK1xcdGNhcGFjaXR5ID0gbWluKGluZm8tXFx1MDAzZW1heF9lbnRyaWVzLCBNQVBfRFVNUF9CQVRDSF9TSVpFKTtcXG4rcmVzaXplOlxcbitcXHRidWYgPSByZWFsbG9jKGtleXMsIChzaXplX3QpY2FwYWNpdHkgKiBpbmZvLVxcdTAwM2VrZXlfc2l6ZSk7XFxuK1xcdGlmICghYnVmKSB7XFxuK1xcdFxcdGVyciA9IEVOT01FTTtcXG4rXFx0XFx0Z290byBlcnJvcjtcXG4rXFx0fVxcbitcXHRrZXlzID0gYnVmO1xcbitcXHRidWYgPSByZWFsbG9jKHZhbHVlcywgKHNpemVfdCljYXBhY2l0eSAqIGluZm8tXFx1MDAzZXZhbHVlX3NpemUpO1xcbitcXHRpZiAoIWJ1Zikge1xcbitcXHRcXHRlcnIgPSBFTk9NRU07XFxuK1xcdFxcdGdvdG8gZXJyb3I7XFxuK1xcdH1cXG4rXFx0dmFsdWVzID0gYnVmO1xcbitcXG4rXFx0d2hpbGUgKHRydWUpIHtcXG4rXFx0XFx0Y291bnQgPSBjYXBhY2l0eTtcXG4rXFx0XFx0ZXJyID0gYnBmX21hcF9sb29rdXBfYmF0Y2goZmQsIGZpcnN0ID8gTlVMTCA6IFxcdTAwMjZiYXRjaCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgXFx1MDAyNm5leHRfYmF0Y2gsIGtleXMsIHZhbHVlcywgXFx1MDAyNmNvdW50LCBOVUxMKTtcXG4rXFx0XFx0ZXJyID0gZXJyID8gZXJybm8gOiAwO1xcbitcXHRcXHQvKiBPbGRlciBrZXJuZWxzIHJlamVjdCB0aGUgY29tbWFuZCBiZWZvcmUgdXBkYXRpbmcgY291bnQuIERvIG5vdFxcbitcXHRcXHQgKiBpbnNwZWN0IHRoZSBidWZmZXJzIG9uIHRoZXNlIGVycm9ycywgb3IgZmFsbCBiYWNrIGFmdGVyIHByb2dyZXNzLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKGNhbl9mYWxsYmFjayBcXHUwMDI2XFx1MDAyNiAoZXJyID09IEVJTlZBTCB8fCBlcnIgPT0gRU9QTk9UU1VQUCB8fFxcbitcXHRcXHRcXHRcXHQgICAgIGVyciA9PSA1MjQgLyogRU5PVFNVUFAgKi8pKSB7XFxuK1xcdFxcdFxcdGVyciA9IDE7XFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcdFxcdGNhbl9mYWxsYmFjayA9IGZhbHNlO1xcbitcXHRcXHRpZiAoZXJyID09IEVOT1NQQykge1xcbitcXHRcXHRcXHRpZiAoY2FwYWNpdHkgPT0gaW5mby1cXHUwMDNlbWF4X2VudHJpZXMpXFxuK1xcdFxcdFxcdFxcdGdvdG8gZXJyb3I7XFxuK1xcdFxcdFxcdGNhcGFjaXR5ICs9IG1pbihjYXBhY2l0eSwgaW5mby1cXHUwMDNlbWF4X2VudHJpZXMgLSBjYXBhY2l0eSk7XFxuK1xcdFxcdFxcdC8qIFByZXNlcnZlIHRoZSBpbnB1dCBjdXJzb3I6IHRoZSBvdmVyc2l6ZWQgYnVja2V0IHdhcyBub3QgcmVhZC4gKi9cXG4rXFx0XFx0XFx0Z290byByZXNpemU7XFxuK1xcdFxcdH1cXG4rXFx0XFx0LyogSW4gcGFydGljdWxhciwgRUZBVUxUIGNhbiBsZWF2ZSBjb3VudCBhbmQgdGhlIGJ1ZmZlcnMgaW52YWxpZC4gKi9cXG4rXFx0XFx0aWYgKGVyciBcXHUwMDI2XFx1MDAyNiBlcnIgIT0gRU5PRU5UKVxcbitcXHRcXHRcXHRnb3RvIGVycm9yO1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgY291bnQ7IGkrKykge1xcbitcXHRcXHRcXHQvKiBLZWVwIHRoZSBhbGlnbm1lbnQgcHJvdmlkZWQgYnkgaW5kaXZpZHVhbCBsb29rdXBzLCBpbmNsdWRpbmdcXG4rXFx0XFx0XFx0ICogZm9yIEJURiB0eXBlcyB3aG9zZSBtYXAga2V5L3ZhbHVlIHNpemUgaXMgbm90IGFsaWduZWQuXFxuK1xcdFxcdFxcdCAqL1xcbitcXHRcXHRcXHRtZW1jcHkoa2V5LCBrZXlzICsgKHNpemVfdClpICogaW5mby1cXHUwMDNla2V5X3NpemUsIGluZm8tXFx1MDAzZWtleV9zaXplKTtcXG4rXFx0XFx0XFx0bWVtY3B5KHZhbHVlLCB2YWx1ZXMgKyAoc2l6ZV90KWkgKiBpbmZvLVxcdTAwM2V2YWx1ZV9zaXplLCBpbmZvLVxcdTAwM2V2YWx1ZV9zaXplKTtcXG4rXFx0XFx0XFx0cHJpbnRfbWFwX2VsZW0oa2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpO1xcbitcXHRcXHRcXHQoKm51bV9lbGVtcykrKztcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoZXJyID09IEVOT0VOVCkge1xcbitcXHRcXHRcXHRlcnIgPSAwO1xcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0fVxcbitcXHRcXHRmaXJzdCA9IGZhbHNlO1xcbitcXHRcXHRiYXRjaCA9IG5leHRfYmF0Y2g7XFxuK1xcdH1cXG4rZXJyb3I6XFxuK1xcdHBfZXJyKFxcXCJjYW4ndCBsb29rdXAgbWFwIGJhdGNoOiAlc1xcXCIsIHN0cmVycm9yKGVycikpO1xcbitcXHRlcnIgPSAtMTtcXG4rb3V0OlxcbitcXHRmcmVlKGtleXMpO1xcbitcXHRmcmVlKHZhbHVlcyk7XFxuK1xcdHJldHVybiBlcnI7XFxuK31cXG4rXFxuIHN0YXRpYyBpbnQgbWFwc19oYXZlX2J0ZihpbnQgKmZkcywgaW50IG5iX2ZkcylcXG4ge1xcbiBcXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcXG5AQCAtODY5LDYgKzk2Miw5IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxcbiBcXHRcXHRwX2luZm8oXFxcIldhcm5pbmc6IGNhbm5vdCByZWFkIHZhbHVlcyBmcm9tICVzIG1hcCB3aXRoIHZhbHVlX3NpemUgIT0gOFxcXCIsXFxuIFxcdFxcdCAgICAgICBtYXBfdHlwZV9zdHIpO1xcbiBcXHR9XFxuK1xcdGVyciA9IGR1bXBfbWFwX2JhdGNoKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0ciwgXFx1MDAyNm51bV9lbGVtcyk7XFxuK1xcdGlmIChlcnIgIT0gMSlcXG4rXFx0XFx0Z290byBlbmRfZHVtcDtcXG4gXFx0d2hpbGUgKHRydWUpIHtcXG4gXFx0XFx0ZXJyID0gYnBmX21hcF9nZXRfbmV4dF9rZXkoZmQsIHByZXZfa2V5LCBrZXkpO1xcbiBcXHRcXHRpZiAoZXJyKSB7XFxuQEAgLTg4MSw2ICs5NzcsNyBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcXG4gXFx0XFx0cHJldl9rZXkgPSBrZXk7XFxuIFxcdH1cXG4gXFxuK2VuZF9kdW1wOlxcbiBcXHRpZiAod3RyKSB7XFxuIFxcdFxcdGpzb253X2VuZF9hcnJheSh3dHIpO1xcdC8qIGVsZW1lbnRzICovXFxuIFxcdFxcdGlmIChzaG93X2hlYWRlcilcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjEzOWQxM2E0OWRjZWZcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY1xcbkBAIC0wLDAgKzEsMTg2IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGZ0b29sX2hlbHBlcnMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9idGYuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2N0eXBlLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIE1BWF9FTlRSSUVTIDEwMjVcXG4rI2RlZmluZSBSRUNPUkRfU0laRSAyNTZcXG4rI2RlZmluZSBPVVRQVVRfU0laRSAoTUFYX0VOVFJJRVMgKiBSRUNPUkRfU0laRSArIDEwMjQpXFxuK1xcbitzdHJ1Y3QgZHVtcF9jYXNlIHtcXG4rXFx0Y29uc3QgY2hhciAqbmFtZTtcXG4rXFx0dW5zaWduZWQgaW50IGNvdW50O1xcbitcXHR1bnNpZ25lZCBpbnQga2V5X3NpemU7XFxuK1xcdHVuc2lnbmVkIGludCB2YWx1ZV9zaXplO1xcbitcXHRib29sIGJ0ZjtcXG4rfTtcXG4rXFxuK3N0YXRpYyB2b2lkIGhleF9ieXRlcyhjaGFyICpvdXQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCBib29sIGpzb24pXFxuK3tcXG4rXFx0Y29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSBkYXRhO1xcbitcXHR1bnNpZ25lZCBpbnQgaTtcXG4rXFxuK1xcdGlmIChqc29uKVxcbitcXHRcXHQqb3V0KysgPSAnWyc7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBzaXplOyBpKyspIHtcXG4rXFx0XFx0aWYgKGpzb24gXFx1MDAyNlxcdTAwMjYgaSlcXG4rXFx0XFx0XFx0Km91dCsrID0gJywnO1xcbitcXHRcXHRvdXQgKz0gc3ByaW50ZihvdXQsIGpzb24gPyBcXFwiXFxcXFxcXCIweCUwMnhcXFxcXFxcIlxcXCIgOiBcXFwiJTAyeFxcXCIsIGJ5dGVzW2ldKTtcXG4rXFx0fVxcbitcXHRpZiAoanNvbilcXG4rXFx0XFx0Km91dCsrID0gJ10nO1xcbitcXHQqb3V0ID0gJ1xcXFwwJztcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgZXhwZWN0ZWRfcmVjb3JkKGNoYXIgKnJlY29yZCwgY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdCxcXG4rXFx0XFx0XFx0ICAgIHVuc2lnbmVkIGludCBpbmRleCwgYm9vbCBqc29uKVxcbit7XFxuK1xcdF9fdTMyIGtleSA9IGluZGV4LCB2YWx1ZSA9IGluZGV4ICogMzcgKyAxMTtcXG4rXFx0dW5zaWduZWQgY2hhciBzaG9ydF9rZXkgPSBpbmRleDtcXG4rXFx0Y2hhciBrZXlfaGV4WzY0XSwgdmFsdWVfaGV4WzY0XSwgZm9ybWF0dGVkWzk2XTtcXG4rXFxuK1xcdGhleF9ieXRlcyhrZXlfaGV4LCB0ZXN0LVxcdTAwM2VrZXlfc2l6ZSA9PSAxID8gKHZvaWQgKilcXHUwMDI2c2hvcnRfa2V5IDogXFx1MDAyNmtleSxcXG4rXFx0XFx0ICB0ZXN0LVxcdTAwM2VrZXlfc2l6ZSwganNvbik7XFxuK1xcdGhleF9ieXRlcyh2YWx1ZV9oZXgsIFxcdTAwMjZ2YWx1ZSwgdGVzdC1cXHUwMDNldmFsdWVfc2l6ZSwganNvbik7XFxuK1xcdHNucHJpbnRmKGZvcm1hdHRlZCwgc2l6ZW9mKGZvcm1hdHRlZCksIFxcXCJ7XFxcXFxcXCJrZXlcXFxcXFxcIjoldSxcXFxcXFxcInZhbHVlXFxcXFxcXCI6JXV9XFxcIixcXG4rXFx0XFx0IGtleSwgdmFsdWUpO1xcbitcXHRpZiAoanNvbiBcXHUwMDI2XFx1MDAyNiB0ZXN0LVxcdTAwM2VidGYpXFxuK1xcdFxcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsXFxuK1xcdFxcdFxcdCBcXFwie1xcXFxcXFwia2V5XFxcXFxcXCI6JXMsXFxcXFxcXCJ2YWx1ZVxcXFxcXFwiOiVzLFxcXFxcXFwiZm9ybWF0dGVkXFxcXFxcXCI6JXN9XFxcIixcXG4rXFx0XFx0XFx0IGtleV9oZXgsIHZhbHVlX2hleCwgZm9ybWF0dGVkKTtcXG4rXFx0ZWxzZSBpZiAoanNvbilcXG4rXFx0XFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgXFxcIntcXFxcXFxcImtleVxcXFxcXFwiOiVzLFxcXFxcXFwidmFsdWVcXFxcXFxcIjolc31cXFwiLFxcbitcXHRcXHRcXHQga2V5X2hleCwgdmFsdWVfaGV4KTtcXG4rXFx0ZWxzZSBpZiAodGVzdC1cXHUwMDNlYnRmKVxcbitcXHRcXHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCBcXFwiJXNcXFwiLCBmb3JtYXR0ZWQpO1xcbitcXHRlbHNlXFxuK1xcdFxcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFxcXCJrZXk6JXN2YWx1ZTolc1xcXCIsIGtleV9oZXgsIHZhbHVlX2hleCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNoZWNrX2R1bXAoY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdCwgX191MzIgaWQsIGJvb2wganNvbiwgYm9vbCBwcmV0dHkpXFxuK3tcXG4rXFx0Ym9vbCBhcnJheSA9IGpzb24gfHwgdGVzdC1cXHUwMDNlYnRmO1xcbitcXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIGV4cGVjdGVkW1JFQ09SRF9TSVpFXSwgZm9vdGVyWzY0XTtcXG4rXFx0Ym9vbCBzZWVuW01BWF9FTlRSSUVTXSA9IHt9O1xcbitcXHRjaGFyICpvdXRwdXQsICpzcmMsICpkc3QsICpjdXJzb3I7XFxuK1xcdHVuc2lnbmVkIGludCBpLCBuO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0b3V0cHV0ID0gY2FsbG9jKDEsIE9VVFBVVF9TSVpFKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKG91dHB1dCwgXFxcImFsbG9jX291dHB1dFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXFxcIiVzbWFwIGR1bXAgaWQgJXVcXFwiLFxcbitcXHRcXHQgcHJldHR5ID8gXFxcIi1wIFxcXCIgOiBqc29uID8gXFxcIi1qIFxcXCIgOiBcXFwiXFxcIiwgaWQpO1xcbitcXHRlcnIgPSBnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwibWFwX2R1bXBcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdC8qIElnbm9yZSBwcmVzZW50YXRpb24gd2hpdGVzcGFjZSwgYnV0IGNvbXBhcmUgY29tcGxldGUgcmVjb3JkcyBhbmQgYWxsXFxuK1xcdCAqIHB1bmN0dWF0aW9uLiBFeHBlY3RlZCBjb250ZW50cyBjb21lIG9ubHkgZnJvbSB0aGUgaW5wdXQgZGF0YSwgbmV2ZXJcXG4rXFx0ICogZnJvbSBhbm90aGVyIG1hcCB3YWxrIG9yIGJwZnRvb2wgaW52b2NhdGlvbi5cXG4rXFx0ICovXFxuK1xcdGZvciAoc3JjID0gb3V0cHV0LCBkc3QgPSBvdXRwdXQ7ICpzcmM7IHNyYysrKVxcbitcXHRcXHRpZiAoIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnNyYykpXFxuK1xcdFxcdFxcdCpkc3QrKyA9ICpzcmM7XFxuK1xcdCpkc3QgPSAnXFxcXDAnO1xcbitcXHRjdXJzb3IgPSBvdXRwdXQ7XFxuK1xcdGlmIChhcnJheSkge1xcbitcXHRcXHRpZiAoIUFTU0VSVF9FUSgqY3Vyc29yLCAnWycsIFxcXCJhcnJheV9zdGFydFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0Y3Vyc29yKys7XFxuK1xcdH1cXG4rXFx0Zm9yIChuID0gMDsgbiBcXHUwMDNjIHRlc3QtXFx1MDAzZWNvdW50OyBuKyspIHtcXG4rXFx0XFx0aWYgKGFycmF5IFxcdTAwMjZcXHUwMDI2IG4pIHtcXG4rXFx0XFx0XFx0aWYgKCFBU1NFUlRfRVEoKmN1cnNvciwgJywnLCBcXFwicmVjb3JkX3NlcGFyYXRvclxcXCIpKVxcbitcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0XFx0Y3Vyc29yKys7XFxuK1xcdFxcdH1cXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHRlc3QtXFx1MDAzZWNvdW50OyBpKyspIHtcXG4rXFx0XFx0XFx0aWYgKHNlZW5baV0pXFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHRleHBlY3RlZF9yZWNvcmQoZXhwZWN0ZWQsIHRlc3QsIGksIGpzb24pO1xcbitcXHRcXHRcXHRpZiAoIXN0cm5jbXAoY3Vyc29yLCBleHBlY3RlZCwgc3RybGVuKGV4cGVjdGVkKSkpXFxuK1xcdFxcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmICghQVNTRVJUX0xUKGksIHRlc3QtXFx1MDAzZWNvdW50LCBcXFwidW5pcXVlX2V4cGVjdGVkX3JlY29yZFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0c2VlbltpXSA9IHRydWU7XFxuK1xcdFxcdGN1cnNvciArPSBzdHJsZW4oZXhwZWN0ZWQpO1xcbitcXHR9XFxuK1xcdGlmIChhcnJheSkge1xcbitcXHRcXHRBU1NFUlRfU1RSRVEoY3Vyc29yLCBcXFwiXVxcXCIsIFxcXCJhcnJheV9lbmRfYW5kX2NvdW50XFxcIik7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHNucHJpbnRmKGZvb3Rlciwgc2l6ZW9mKGZvb3RlciksIFxcXCJGb3VuZCV1ZWxlbWVudCVzXFxcIiwgdGVzdC1cXHUwMDNlY291bnQsXFxuK1xcdFxcdFxcdCB0ZXN0LVxcdTAwM2Vjb3VudCA9PSAxID8gXFxcIlxcXCIgOiBcXFwic1xcXCIpO1xcbitcXHRcXHRBU1NFUlRfU1RSRVEoY3Vyc29yLCBmb290ZXIsIFxcXCJwbGFpbl9jb3VudFxcXCIpO1xcbitcXHR9XFxuK291dDpcXG4rXFx0ZnJlZShvdXRwdXQpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBydW5fZHVtcF9jYXNlKGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XFxuK1xcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xcbitcXHRfX3UzMiBpbmZvX2xlbiA9IHNpemVvZihpbmZvKTtcXG4rXFx0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcXG4rXFx0dW5zaWduZWQgaW50IGk7XFxuK1xcdGludCBmZCA9IC0xO1xcbitcXG4rXFx0aWYgKHRlc3QtXFx1MDAzZWJ0Zikge1xcbitcXHRcXHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcXFwiYnRmX25ld1xcXCIpKVxcbitcXHRcXHRcXHRyZXR1cm47XFxuK1xcdFxcdGlmICghQVNTRVJUX0VRKGJ0Zl9fYWRkX2ludChidGYsIFxcXCJ1bnNpZ25lZCBpbnRcXFwiLCA0LCAwKSwgMSxcXG4rXFx0XFx0XFx0ICAgICAgIFxcXCJidGZfaW50XFxcIikgfHxcXG4rXFx0XFx0ICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksIFxcXCJidGZfbG9hZFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0b3B0cy5idGZfZmQgPSBidGZfX2ZkKGJ0Zik7XFxuK1xcdFxcdG9wdHMuYnRmX2tleV90eXBlX2lkID0gMTtcXG4rXFx0XFx0b3B0cy5idGZfdmFsdWVfdHlwZV9pZCA9IDE7XFxuK1xcdH1cXG4rXFx0ZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXFxcImR1bXBfYmF0Y2hcXFwiLCB0ZXN0LVxcdTAwM2VrZXlfc2l6ZSxcXG4rXFx0XFx0XFx0ICAgIHRlc3QtXFx1MDAzZXZhbHVlX3NpemUsIHRlc3QtXFx1MDAzZWNvdW50ID86IDEsIFxcdTAwMjZvcHRzKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFxcXCJtYXBfY3JlYXRlXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgdGVzdC1cXHUwMDNlY291bnQ7IGkrKykge1xcbitcXHRcXHRfX3UzMiBrZXkgPSBpLCB2YWx1ZSA9IGkgKiAzNyArIDExO1xcbitcXHRcXHR1bnNpZ25lZCBjaGFyIHNob3J0X2tleSA9IGk7XFxuK1xcdFxcdHZvaWQgKmtleV9wdHIgPSB0ZXN0LVxcdTAwM2VrZXlfc2l6ZSA9PSAxID8gKHZvaWQgKilcXHUwMDI2c2hvcnRfa2V5IDogXFx1MDAyNmtleTtcXG4rXFxuK1xcdFxcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmQsIGtleV9wdHIsIFxcdTAwMjZ2YWx1ZSwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwibWFwX3VwZGF0ZVxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcXHUwMDI2aW5mbywgXFx1MDAyNmluZm9fbGVuKSwgXFxcIm1hcF9pbmZvXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRjaGVja19kdW1wKHRlc3QsIGluZm8uaWQsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgdHJ1ZSwgZmFsc2UpO1xcbitcXHRjaGVja19kdW1wKHRlc3QsIGluZm8uaWQsIHRydWUsIHRydWUpO1xcbitvdXQ6XFxuK1xcdGlmIChmZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShmZCk7XFxuK1xcdGJ0Zl9fZnJlZShidGYpO1xcbit9XFxuK1xcbit2b2lkIHRlc3RfYnBmdG9vbF9tYXBfYmF0Y2godm9pZClcXG4re1xcbitcXHRzdGF0aWMgY29uc3Qgc3RydWN0IGR1bXBfY2FzZSBjYXNlc1tdID0ge1xcbitcXHRcXHR7IFxcXCJlbXB0eVxcXCIsIDAsIDQsIDQgfSxcXG4rXFx0XFx0eyBcXFwic2luZ2xlXFxcIiwgMSwgNCwgNCB9LFxcbitcXHRcXHR7IFxcXCJiZWxvd19iYXRjaFxcXCIsIDI1NSwgNCwgNCB9LFxcbitcXHRcXHR7IFxcXCJleGFjdF9iYXRjaFxcXCIsIDI1NiwgNCwgNCB9LFxcbitcXHRcXHR7IFxcXCJhYm92ZV9iYXRjaFxcXCIsIDI1NywgNCwgNCB9LFxcbitcXHRcXHR7IFxcXCJtdWx0aXBsZV9iYXRjaGVzXFxcIiwgMTAyNSwgNCwgNCB9LFxcbitcXHRcXHR7IFxcXCJvbmVfYnl0ZV9rZXlcXFwiLCAyNTYsIDEsIDQgfSxcXG4rXFx0XFx0eyBcXFwib2RkX3ZhbHVlX3NpemVcXFwiLCAyNTcsIDQsIDMgfSxcXG4rXFx0XFx0eyBcXFwiYnRmX2VtcHR5XFxcIiwgMCwgNCwgNCwgdHJ1ZSB9LFxcbitcXHRcXHR7IFxcXCJidGZfc2luZ2xlXFxcIiwgMSwgNCwgNCwgdHJ1ZSB9LFxcbitcXHRcXHR7IFxcXCJidGZfbXVsdGlwbGVfYmF0Y2hlc1xcXCIsIDEwMjUsIDQsIDQsIHRydWUgfSxcXG4rXFx0fTtcXG4rXFx0dW5zaWduZWQgaW50IGk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQVJSQVlfU0laRShjYXNlcyk7IGkrKylcXG4rXFx0XFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoY2FzZXNbaV0ubmFtZSkpXFxuK1xcdFxcdFxcdHJ1bl9kdW1wX2Nhc2UoXFx1MDAyNmNhc2VzW2ldKTtcXG4rfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwMjowOTo0MC44NDE4MDQ5OTRaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjg3MTgyNjUxNzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlci1zcGFjZSB0b29saW5nIGFuZCBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvIChicGZ0b29sIGFuZCBCUEYgc2VsZnRlc3RzKSBhbmQgZG9lcyBub3QgbWFrZSBhbnkgY2hhbmdlcyB0byB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNWEwYTNlNTE1ZWI0YTZkOGZjMDg5NDY1ODE5NTQwZThmYjQzYjY4MFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDcgMDI6MDk6MzcgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXAuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG5pbmRleCA2ODRhOGZiNzI0MTQ2Li4xZWNjZGMwZDFlOTYzIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG5AQCAtNzQwLDE1ICs3NDAsMTAgQEAgc3RhdGljIGludCBkb19zaG93KGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdHJldHVybiBlcnJubyA9PSBFTk9FTlQgPyAwIDogLTE7XG4gfVxuIFxuLXN0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4tXHRcdFx0IHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsXG4tXHRcdFx0IGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXG4rc3RhdGljIHZvaWQgcHJpbnRfbWFwX2VsZW0odm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbitcdFx0XHQgICBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxuK1x0XHRcdCAgIGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXG4ge1xuLVx0aWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7XG4tXHRcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGVycm5vKTtcbi1cdFx0cmV0dXJuIC0xO1xuLVx0fVxuLVxuIFx0aWYgKGpzb25fb3V0cHV0KSB7XG4gXHRcdHByaW50X2VudHJ5X2pzb24obWFwX2luZm8sIGtleSwgdmFsdWUsIGJ0Zik7XG4gXHR9IGVsc2UgaWYgKGJ0Zikge1xuQEAgLTc2MiwxMCArNzU3LDEwOCBAQCBzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuIFx0fSBlbHNlIHtcbiBcdFx0cHJpbnRfZW50cnlfcGxhaW4obWFwX2luZm8sIGtleSwgdmFsdWUpO1xuIFx0fVxuK31cbitcbitzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuK1x0XHRcdCBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxuK1x0XHRcdCBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxuK3tcbitcdGlmIChicGZfbWFwX2xvb2t1cF9lbGVtKGZkLCBrZXksIHZhbHVlKSkge1xuK1x0XHRwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbiBcbitcdHByaW50X21hcF9lbGVtKGtleSwgdmFsdWUsIG1hcF9pbmZvLCBidGYsIGJ0Zl93dHIpO1xuIFx0cmV0dXJuIDA7XG4gfVxuIFxuKyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfU0laRSAyNTZVXG4rI2RlZmluZSBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgKDQgKiAxMDI0ICogMTAyNClcbitcbisvKiBSZXR1cm4gMSB0byB1c2UgaW5kaXZpZHVhbCBsb29rdXBzLCBidXQgb25seSBiZWZvcmUgYmF0Y2ggdHJhdmVyc2FsIHN0YXJ0cy4gKi9cbitzdGF0aWMgaW50IGR1bXBfbWFwX2JhdGNoKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbitcdFx0XHQgIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHN0cnVjdCBidGYgKmJ0ZixcbitcdFx0XHQgIGpzb25fd3JpdGVyX3QgKnd0ciwgdW5zaWduZWQgaW50ICpudW1fZWxlbXMpXG4re1xuK1x0X191MzIgY2FwYWNpdHksIGNvdW50LCBiYXRjaCA9IDAsIG5leHRfYmF0Y2ggPSAwLCBpO1xuK1x0dm9pZCAqa2V5cyA9IE5VTEwsICp2YWx1ZXMgPSBOVUxMLCAqYnVmO1xuK1x0Ym9vbCBmaXJzdCA9IHRydWUsIGNhbl9mYWxsYmFjayA9IHRydWU7XG4rXHRpbnQgZXJyO1xuK1xuK1x0LyogSGFzaCBsb29rdXAgYmF0Y2hlcyBtdXN0IGFjY29tbW9kYXRlIGEgd2hvbGUgYnVja2V0LiBSZXN0cmljdCB0aGVcbitcdCAqIG9wdGltaXphdGlvbiB0byBtYXBzIHdob3NlIHdvcnN0LWNhc2UgYnVja2V0IGZpdHMgdGhlIG1lbW9yeSBidWRnZXQsXG4rXHQgKiBzbyBhIGxhdGVyIEVOT1NQQyBuZXZlciBmb3JjZXMgYSByZXN0YXJ0IGFmdGVyIHByaW50aW5nIHNvbWUgZW50cmllcy5cbitcdCAqIERpdmlzaW9uIGFsc28gYm91bmRzIHRoZSBhbGxvY2F0aW9uIG11bHRpcGxpY2F0aW9ucyBvbiAzMi1iaXQgaG9zdHMuXG4rXHQgKi9cbitcdGlmIChpbmZvLVx1MDAzZXR5cGUgIT0gQlBGX01BUF9UWVBFX0hBU0ggfHwgIWluZm8tXHUwMDNlbWF4X2VudHJpZXMgfHxcbitcdCAgICAoX191NjQpaW5mby1cdTAwM2VrZXlfc2l6ZSArIGluZm8tXHUwMDNldmFsdWVfc2l6ZSBcdTAwM2VcbitcdCAgICBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgLyBpbmZvLVx1MDAzZW1heF9lbnRyaWVzKVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdGNhcGFjaXR5ID0gbWluKGluZm8tXHUwMDNlbWF4X2VudHJpZXMsIE1BUF9EVU1QX0JBVENIX1NJWkUpO1xuK3Jlc2l6ZTpcbitcdGJ1ZiA9IHJlYWxsb2Moa2V5cywgKHNpemVfdCljYXBhY2l0eSAqIGluZm8tXHUwMDNla2V5X3NpemUpO1xuK1x0aWYgKCFidWYpIHtcbitcdFx0ZXJyID0gRU5PTUVNO1xuK1x0XHRnb3RvIGVycm9yO1xuK1x0fVxuK1x0a2V5cyA9IGJ1ZjtcbitcdGJ1ZiA9IHJlYWxsb2ModmFsdWVzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby1cdTAwM2V2YWx1ZV9zaXplKTtcbitcdGlmICghYnVmKSB7XG4rXHRcdGVyciA9IEVOT01FTTtcbitcdFx0Z290byBlcnJvcjtcbitcdH1cbitcdHZhbHVlcyA9IGJ1ZjtcbitcbitcdHdoaWxlICh0cnVlKSB7XG4rXHRcdGNvdW50ID0gY2FwYWNpdHk7XG4rXHRcdGVyciA9IGJwZl9tYXBfbG9va3VwX2JhdGNoKGZkLCBmaXJzdCA/IE5VTEwgOiBcdTAwMjZiYXRjaCxcbitcdFx0XHRcdFx0ICAgXHUwMDI2bmV4dF9iYXRjaCwga2V5cywgdmFsdWVzLCBcdTAwMjZjb3VudCwgTlVMTCk7XG4rXHRcdGVyciA9IGVyciA/IGVycm5vIDogMDtcbitcdFx0LyogT2xkZXIga2VybmVscyByZWplY3QgdGhlIGNvbW1hbmQgYmVmb3JlIHVwZGF0aW5nIGNvdW50LiBEbyBub3RcbitcdFx0ICogaW5zcGVjdCB0aGUgYnVmZmVycyBvbiB0aGVzZSBlcnJvcnMsIG9yIGZhbGwgYmFjayBhZnRlciBwcm9ncmVzcy5cbitcdFx0ICovXG4rXHRcdGlmIChjYW5fZmFsbGJhY2sgXHUwMDI2XHUwMDI2IChlcnIgPT0gRUlOVkFMIHx8IGVyciA9PSBFT1BOT1RTVVBQIHx8XG4rXHRcdFx0XHQgICAgIGVyciA9PSA1MjQgLyogRU5PVFNVUFAgKi8pKSB7XG4rXHRcdFx0ZXJyID0gMTtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0XHRjYW5fZmFsbGJhY2sgPSBmYWxzZTtcbitcdFx0aWYgKGVyciA9PSBFTk9TUEMpIHtcbitcdFx0XHRpZiAoY2FwYWNpdHkgPT0gaW5mby1cdTAwM2VtYXhfZW50cmllcylcbitcdFx0XHRcdGdvdG8gZXJyb3I7XG4rXHRcdFx0Y2FwYWNpdHkgKz0gbWluKGNhcGFjaXR5LCBpbmZvLVx1MDAzZW1heF9lbnRyaWVzIC0gY2FwYWNpdHkpO1xuK1x0XHRcdC8qIFByZXNlcnZlIHRoZSBpbnB1dCBjdXJzb3I6IHRoZSBvdmVyc2l6ZWQgYnVja2V0IHdhcyBub3QgcmVhZC4gKi9cbitcdFx0XHRnb3RvIHJlc2l6ZTtcbitcdFx0fVxuK1x0XHQvKiBJbiBwYXJ0aWN1bGFyLCBFRkFVTFQgY2FuIGxlYXZlIGNvdW50IGFuZCB0aGUgYnVmZmVycyBpbnZhbGlkLiAqL1xuK1x0XHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBlcnIgIT0gRU5PRU5UKVxuK1x0XHRcdGdvdG8gZXJyb3I7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGNvdW50OyBpKyspIHtcbitcdFx0XHQvKiBLZWVwIHRoZSBhbGlnbm1lbnQgcHJvdmlkZWQgYnkgaW5kaXZpZHVhbCBsb29rdXBzLCBpbmNsdWRpbmdcbitcdFx0XHQgKiBmb3IgQlRGIHR5cGVzIHdob3NlIG1hcCBrZXkvdmFsdWUgc2l6ZSBpcyBub3QgYWxpZ25lZC5cbitcdFx0XHQgKi9cbitcdFx0XHRtZW1jcHkoa2V5LCBrZXlzICsgKHNpemVfdClpICogaW5mby1cdTAwM2VrZXlfc2l6ZSwgaW5mby1cdTAwM2VrZXlfc2l6ZSk7XG4rXHRcdFx0bWVtY3B5KHZhbHVlLCB2YWx1ZXMgKyAoc2l6ZV90KWkgKiBpbmZvLVx1MDAzZXZhbHVlX3NpemUsIGluZm8tXHUwMDNldmFsdWVfc2l6ZSk7XG4rXHRcdFx0cHJpbnRfbWFwX2VsZW0oa2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpO1xuK1x0XHRcdCgqbnVtX2VsZW1zKSsrO1xuK1x0XHR9XG4rXHRcdGlmIChlcnIgPT0gRU5PRU5UKSB7XG4rXHRcdFx0ZXJyID0gMDtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0XHRmaXJzdCA9IGZhbHNlO1xuK1x0XHRiYXRjaCA9IG5leHRfYmF0Y2g7XG4rXHR9XG4rZXJyb3I6XG4rXHRwX2VycihcImNhbid0IGxvb2t1cCBtYXAgYmF0Y2g6ICVzXCIsIHN0cmVycm9yKGVycikpO1xuK1x0ZXJyID0gLTE7XG4rb3V0OlxuK1x0ZnJlZShrZXlzKTtcbitcdGZyZWUodmFsdWVzKTtcbitcdHJldHVybiBlcnI7XG4rfVxuK1xuIHN0YXRpYyBpbnQgbWFwc19oYXZlX2J0ZihpbnQgKmZkcywgaW50IG5iX2ZkcylcbiB7XG4gXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbkBAIC04NjksNiArOTYyLDkgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXHRcdHBfaW5mbyhcIldhcm5pbmc6IGNhbm5vdCByZWFkIHZhbHVlcyBmcm9tICVzIG1hcCB3aXRoIHZhbHVlX3NpemUgIT0gOFwiLFxuIFx0XHQgICAgICAgbWFwX3R5cGVfc3RyKTtcbiBcdH1cbitcdGVyciA9IGR1bXBfbWFwX2JhdGNoKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0ciwgXHUwMDI2bnVtX2VsZW1zKTtcbitcdGlmIChlcnIgIT0gMSlcbitcdFx0Z290byBlbmRfZHVtcDtcbiBcdHdoaWxlICh0cnVlKSB7XG4gXHRcdGVyciA9IGJwZl9tYXBfZ2V0X25leHRfa2V5KGZkLCBwcmV2X2tleSwga2V5KTtcbiBcdFx0aWYgKGVycikge1xuQEAgLTg4MSw2ICs5NzcsNyBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdFx0cHJldl9rZXkgPSBrZXk7XG4gXHR9XG4gXG4rZW5kX2R1bXA6XG4gXHRpZiAod3RyKSB7XG4gXHRcdGpzb253X2VuZF9hcnJheSh3dHIpO1x0LyogZWxlbWVudHMgKi9cbiBcdFx0aWYgKHNob3dfaGVhZGVyKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMTM5ZDEzYTQ5ZGNlZlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY1xuQEAgLTAsMCArMSwxODYgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2J0Zi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjY3R5cGUuaFx1MDAzZVxuK1xuKyNkZWZpbmUgTUFYX0VOVFJJRVMgMTAyNVxuKyNkZWZpbmUgUkVDT1JEX1NJWkUgMjU2XG4rI2RlZmluZSBPVVRQVVRfU0laRSAoTUFYX0VOVFJJRVMgKiBSRUNPUkRfU0laRSArIDEwMjQpXG4rXG4rc3RydWN0IGR1bXBfY2FzZSB7XG4rXHRjb25zdCBjaGFyICpuYW1lO1xuK1x0dW5zaWduZWQgaW50IGNvdW50O1xuK1x0dW5zaWduZWQgaW50IGtleV9zaXplO1xuK1x0dW5zaWduZWQgaW50IHZhbHVlX3NpemU7XG4rXHRib29sIGJ0Zjtcbit9O1xuK1xuK3N0YXRpYyB2b2lkIGhleF9ieXRlcyhjaGFyICpvdXQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCBib29sIGpzb24pXG4re1xuK1x0Y29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSBkYXRhO1xuK1x0dW5zaWduZWQgaW50IGk7XG4rXG4rXHRpZiAoanNvbilcbitcdFx0Km91dCsrID0gJ1snO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc2l6ZTsgaSsrKSB7XG4rXHRcdGlmIChqc29uIFx1MDAyNlx1MDAyNiBpKVxuK1x0XHRcdCpvdXQrKyA9ICcsJztcbitcdFx0b3V0ICs9IHNwcmludGYob3V0LCBqc29uID8gXCJcXFwiMHglMDJ4XFxcIlwiIDogXCIlMDJ4XCIsIGJ5dGVzW2ldKTtcbitcdH1cbitcdGlmIChqc29uKVxuK1x0XHQqb3V0KysgPSAnXSc7XG4rXHQqb3V0ID0gJ1xcMCc7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGV4cGVjdGVkX3JlY29yZChjaGFyICpyZWNvcmQsIGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QsXG4rXHRcdFx0ICAgIHVuc2lnbmVkIGludCBpbmRleCwgYm9vbCBqc29uKVxuK3tcbitcdF9fdTMyIGtleSA9IGluZGV4LCB2YWx1ZSA9IGluZGV4ICogMzcgKyAxMTtcbitcdHVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaW5kZXg7XG4rXHRjaGFyIGtleV9oZXhbNjRdLCB2YWx1ZV9oZXhbNjRdLCBmb3JtYXR0ZWRbOTZdO1xuK1xuK1x0aGV4X2J5dGVzKGtleV9oZXgsIHRlc3QtXHUwMDNla2V5X3NpemUgPT0gMSA/ICh2b2lkICopXHUwMDI2c2hvcnRfa2V5IDogXHUwMDI2a2V5LFxuK1x0XHQgIHRlc3QtXHUwMDNla2V5X3NpemUsIGpzb24pO1xuK1x0aGV4X2J5dGVzKHZhbHVlX2hleCwgXHUwMDI2dmFsdWUsIHRlc3QtXHUwMDNldmFsdWVfc2l6ZSwganNvbik7XG4rXHRzbnByaW50Zihmb3JtYXR0ZWQsIHNpemVvZihmb3JtYXR0ZWQpLCBcIntcXFwia2V5XFxcIjoldSxcXFwidmFsdWVcXFwiOiV1fVwiLFxuK1x0XHQga2V5LCB2YWx1ZSk7XG4rXHRpZiAoanNvbiBcdTAwMjZcdTAwMjYgdGVzdC1cdTAwM2VidGYpXG4rXHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsXG4rXHRcdFx0IFwie1xcXCJrZXlcXFwiOiVzLFxcXCJ2YWx1ZVxcXCI6JXMsXFxcImZvcm1hdHRlZFxcXCI6JXN9XCIsXG4rXHRcdFx0IGtleV9oZXgsIHZhbHVlX2hleCwgZm9ybWF0dGVkKTtcbitcdGVsc2UgaWYgKGpzb24pXG4rXHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFwie1xcXCJrZXlcXFwiOiVzLFxcXCJ2YWx1ZVxcXCI6JXN9XCIsXG4rXHRcdFx0IGtleV9oZXgsIHZhbHVlX2hleCk7XG4rXHRlbHNlIGlmICh0ZXN0LVx1MDAzZWJ0ZilcbitcdFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgXCIlc1wiLCBmb3JtYXR0ZWQpO1xuK1x0ZWxzZVxuK1x0XHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCBcImtleTolc3ZhbHVlOiVzXCIsIGtleV9oZXgsIHZhbHVlX2hleCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNoZWNrX2R1bXAoY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdCwgX191MzIgaWQsIGJvb2wganNvbiwgYm9vbCBwcmV0dHkpXG4re1xuK1x0Ym9vbCBhcnJheSA9IGpzb24gfHwgdGVzdC1cdTAwM2VidGY7XG4rXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIGV4cGVjdGVkW1JFQ09SRF9TSVpFXSwgZm9vdGVyWzY0XTtcbitcdGJvb2wgc2VlbltNQVhfRU5UUklFU10gPSB7fTtcbitcdGNoYXIgKm91dHB1dCwgKnNyYywgKmRzdCwgKmN1cnNvcjtcbitcdHVuc2lnbmVkIGludCBpLCBuO1xuK1x0aW50IGVycjtcbitcbitcdG91dHB1dCA9IGNhbGxvYygxLCBPVVRQVVRfU0laRSk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIob3V0cHV0LCBcImFsbG9jX291dHB1dFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcIiVzbWFwIGR1bXAgaWQgJXVcIixcbitcdFx0IHByZXR0eSA/IFwiLXAgXCIgOiBqc29uID8gXCItaiBcIiA6IFwiXCIsIGlkKTtcbitcdGVyciA9IGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcIm1hcF9kdW1wXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdC8qIElnbm9yZSBwcmVzZW50YXRpb24gd2hpdGVzcGFjZSwgYnV0IGNvbXBhcmUgY29tcGxldGUgcmVjb3JkcyBhbmQgYWxsXG4rXHQgKiBwdW5jdHVhdGlvbi4gRXhwZWN0ZWQgY29udGVudHMgY29tZSBvbmx5IGZyb20gdGhlIGlucHV0IGRhdGEsIG5ldmVyXG4rXHQgKiBmcm9tIGFub3RoZXIgbWFwIHdhbGsgb3IgYnBmdG9vbCBpbnZvY2F0aW9uLlxuK1x0ICovXG4rXHRmb3IgKHNyYyA9IG91dHB1dCwgZHN0ID0gb3V0cHV0OyAqc3JjOyBzcmMrKylcbitcdFx0aWYgKCFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxuK1x0XHRcdCpkc3QrKyA9ICpzcmM7XG4rXHQqZHN0ID0gJ1xcMCc7XG4rXHRjdXJzb3IgPSBvdXRwdXQ7XG4rXHRpZiAoYXJyYXkpIHtcbitcdFx0aWYgKCFBU1NFUlRfRVEoKmN1cnNvciwgJ1snLCBcImFycmF5X3N0YXJ0XCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRjdXJzb3IrKztcbitcdH1cbitcdGZvciAobiA9IDA7IG4gXHUwMDNjIHRlc3QtXHUwMDNlY291bnQ7IG4rKykge1xuK1x0XHRpZiAoYXJyYXkgXHUwMDI2XHUwMDI2IG4pIHtcbitcdFx0XHRpZiAoIUFTU0VSVF9FUSgqY3Vyc29yLCAnLCcsIFwicmVjb3JkX3NlcGFyYXRvclwiKSlcbitcdFx0XHRcdGdvdG8gb3V0O1xuK1x0XHRcdGN1cnNvcisrO1xuK1x0XHR9XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRlc3QtXHUwMDNlY291bnQ7IGkrKykge1xuK1x0XHRcdGlmIChzZWVuW2ldKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0ZXhwZWN0ZWRfcmVjb3JkKGV4cGVjdGVkLCB0ZXN0LCBpLCBqc29uKTtcbitcdFx0XHRpZiAoIXN0cm5jbXAoY3Vyc29yLCBleHBlY3RlZCwgc3RybGVuKGV4cGVjdGVkKSkpXG4rXHRcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0XHRpZiAoIUFTU0VSVF9MVChpLCB0ZXN0LVx1MDAzZWNvdW50LCBcInVuaXF1ZV9leHBlY3RlZF9yZWNvcmRcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdHNlZW5baV0gPSB0cnVlO1xuK1x0XHRjdXJzb3IgKz0gc3RybGVuKGV4cGVjdGVkKTtcbitcdH1cbitcdGlmIChhcnJheSkge1xuK1x0XHRBU1NFUlRfU1RSRVEoY3Vyc29yLCBcIl1cIiwgXCJhcnJheV9lbmRfYW5kX2NvdW50XCIpO1xuK1x0fSBlbHNlIHtcbitcdFx0c25wcmludGYoZm9vdGVyLCBzaXplb2YoZm9vdGVyKSwgXCJGb3VuZCV1ZWxlbWVudCVzXCIsIHRlc3QtXHUwMDNlY291bnQsXG4rXHRcdFx0IHRlc3QtXHUwMDNlY291bnQgPT0gMSA/IFwiXCIgOiBcInNcIik7XG4rXHRcdEFTU0VSVF9TVFJFUShjdXJzb3IsIGZvb3RlciwgXCJwbGFpbl9jb3VudFwiKTtcbitcdH1cbitvdXQ6XG4rXHRmcmVlKG91dHB1dCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJ1bl9kdW1wX2Nhc2UoY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdClcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbitcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuK1x0X191MzIgaW5mb19sZW4gPSBzaXplb2YoaW5mbyk7XG4rXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xuK1x0dW5zaWduZWQgaW50IGk7XG4rXHRpbnQgZmQgPSAtMTtcbitcbitcdGlmICh0ZXN0LVx1MDAzZWJ0Zikge1xuK1x0XHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xuK1x0XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcImJ0Zl9uZXdcIikpXG4rXHRcdFx0cmV0dXJuO1xuK1x0XHRpZiAoIUFTU0VSVF9FUShidGZfX2FkZF9pbnQoYnRmLCBcInVuc2lnbmVkIGludFwiLCA0LCAwKSwgMSxcbitcdFx0XHQgICAgICAgXCJidGZfaW50XCIpIHx8XG4rXHRcdCAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcImJ0Zl9sb2FkXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRvcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTtcbitcdFx0b3B0cy5idGZfa2V5X3R5cGVfaWQgPSAxO1xuK1x0XHRvcHRzLmJ0Zl92YWx1ZV90eXBlX2lkID0gMTtcbitcdH1cbitcdGZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwiZHVtcF9iYXRjaFwiLCB0ZXN0LVx1MDAzZWtleV9zaXplLFxuK1x0XHRcdCAgICB0ZXN0LVx1MDAzZXZhbHVlX3NpemUsIHRlc3QtXHUwMDNlY291bnQgPzogMSwgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZCwgXCJtYXBfY3JlYXRlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRlc3QtXHUwMDNlY291bnQ7IGkrKykge1xuK1x0XHRfX3UzMiBrZXkgPSBpLCB2YWx1ZSA9IGkgKiAzNyArIDExO1xuK1x0XHR1bnNpZ25lZCBjaGFyIHNob3J0X2tleSA9IGk7XG4rXHRcdHZvaWQgKmtleV9wdHIgPSB0ZXN0LVx1MDAzZWtleV9zaXplID09IDEgPyAodm9pZCAqKVx1MDAyNnNob3J0X2tleSA6IFx1MDAyNmtleTtcbitcbitcdFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZCwga2V5X3B0ciwgXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxuK1x0XHRcdCAgICAgICBcIm1hcF91cGRhdGVcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcdTAwMjZpbmZvLCBcdTAwMjZpbmZvX2xlbiksIFwibWFwX2luZm9cIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCBmYWxzZSwgZmFsc2UpO1xuK1x0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCBmYWxzZSk7XG4rXHRjaGVja19kdW1wKHRlc3QsIGluZm8uaWQsIHRydWUsIHRydWUpO1xuK291dDpcbitcdGlmIChmZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGZkKTtcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbit2b2lkIHRlc3RfYnBmdG9vbF9tYXBfYmF0Y2godm9pZClcbit7XG4rXHRzdGF0aWMgY29uc3Qgc3RydWN0IGR1bXBfY2FzZSBjYXNlc1tdID0ge1xuK1x0XHR7IFwiZW1wdHlcIiwgMCwgNCwgNCB9LFxuK1x0XHR7IFwic2luZ2xlXCIsIDEsIDQsIDQgfSxcbitcdFx0eyBcImJlbG93X2JhdGNoXCIsIDI1NSwgNCwgNCB9LFxuK1x0XHR7IFwiZXhhY3RfYmF0Y2hcIiwgMjU2LCA0LCA0IH0sXG4rXHRcdHsgXCJhYm92ZV9iYXRjaFwiLCAyNTcsIDQsIDQgfSxcbitcdFx0eyBcIm11bHRpcGxlX2JhdGNoZXNcIiwgMTAyNSwgNCwgNCB9LFxuK1x0XHR7IFwib25lX2J5dGVfa2V5XCIsIDI1NiwgMSwgNCB9LFxuK1x0XHR7IFwib2RkX3ZhbHVlX3NpemVcIiwgMjU3LCA0LCAzIH0sXG4rXHRcdHsgXCJidGZfZW1wdHlcIiwgMCwgNCwgNCwgdHJ1ZSB9LFxuK1x0XHR7IFwiYnRmX3NpbmdsZVwiLCAxLCA0LCA0LCB0cnVlIH0sXG4rXHRcdHsgXCJidGZfbXVsdGlwbGVfYmF0Y2hlc1wiLCAxMDI1LCA0LCA0LCB0cnVlIH0sXG4rXHR9O1xuK1x0dW5zaWduZWQgaW50IGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGNhc2VzKTsgaSsrKVxuK1x0XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChjYXNlc1tpXS5uYW1lKSlcbitcdFx0XHRydW5fZHVtcF9jYXNlKFx1MDAyNmNhc2VzW2ldKTtcbit9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwMjowOTo0MC44NDE4MDY0MzRaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo4NzE4MjQyNjczLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlBhdGNoIEFuYWx5c2lzOiBXb3J0aEZ1enppbmcgRGV0ZXJtaW5hdGlvbioqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhlIGRpZmYgYWZmZWN0cyBgdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNgIGFuZCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY2AuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBydW4gdGhyb3VnaCB0aGUgbmVnYXRpdmUgY3JpdGVyaWEgY2hlY2tsaXN0LiBJIG5lZWQgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgY2hhbmdlIHdhcnJhbnRzIGZ1enppbmcuXG5cblRoZSBjcml0ZXJpYSBzYXlzIGBXb3J0aEZ1enppbmc9ZmFsc2VgIGlmICphbGwqIG1vZGlmaWVkIGNvZGUgZmFsbHMgdW5kZXIgc3BlY2lmaWMgY2F0ZWdvcmllcy4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gY2hlY2sgZm9yIG5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXMsIGxpa2UgZG9jdW1lbnRhdGlvbiwgY29tbWVudHMsIHNwZWxsaW5nIGZpeGVzLCBvciB1c2VyLXNwYWNlIGNvZGUgdGhhdCBkb2Vzbid0IGltcGFjdCB0aGUga2VybmVsIGltYWdlIG9yIG1vZHVsZXMuXG5cbkEgcXVpY2sgZ2xhbmNlIHRlbGxzIG1lIGJvdGggZmlsZXMgYXJlIHVuZGVyIGB0b29scy9gLCBzbyB0aGV5J3JlIHVzZXItc3BhY2UuIEkgbmVlZCB0byBiZSBhYnNvbHV0ZWx5IHN1cmUgdGhvdWdoLCBzbyBsZXQncyBkb3VibGUtY2hlY2sgYnkgbG9va2luZyBkaXJlY3RseSBhdCB0aGUgZGlmZiwgbm8gbmVlZCB0byBpbnZvbHZlIGdpdCBjb21tYW5kcyBmb3Igc3VjaCBhIHNtYWxsIGNoYW5nZS4gVGhlIGRpZmYgY29uZmlybXMgbXkgaW5pdGlhbCBhc3Nlc3NtZW50OiBvbmx5IHRob3NlIHR3byBmaWxlcy5cblxuR2l2ZW4gdGhhdCB0aGVzZSBhcmUgc3RyaWN0bHkgd2l0aGluIHRoZSBgdG9vbHMvYCBkaXJlY3RvcnksIGFuZCBpdCdzIGFsbCB1c2VyLXNwYWNlLCAqd2l0aG91dCogYWZmZWN0aW5nIHRoZSBrZXJuZWwgaW1hZ2Ugb3IgbW9kdWxlcywgSSdtIGNvbmZpZGVudCBpbiBzYXlpbmcgdGhpcyBwYXRjaCBkb2Vzbid0IHdhcnJhbnQgZnV6emluZy5cblxuU28sIEknbSBnb2luZyB3aXRoOlxuXG4qICAgYFdvcnRoRnV6emluZzogZmFsc2VgXG4qICAgYEZvY3VzU3ltYm9sczogW11gIChub3RoaW5nIHRvIHNwZWNpZmljYWxseSB0YXJnZXQpXG4qICAgYEVuYWJsZUNvbmZpZ3M6IFtdYCAobm8gc3BlY2lmaWMgY29uZmlnIG9wdGlvbnMgbmVlZGVkKVxuKiAgIGBSZWFzb25pbmc6IFRoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXItc3BhY2UgY29kZSB3aXRoaW4gdG9vbHMvICh0b29scy9icGYvYnBmdG9vbC9tYXAuYyBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guYyksIHdoaWNoIGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlIG9yIGtlcm5lbCBtb2R1bGVzLmBcblxuXG4iLCJJbnB1dFRva2VucyI6Njk3OSwiT3V0cHV0VG9rZW5zIjo3NywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQzNiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDAyOjA5OjQ5LjU2MDA1MDczN1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc4NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xpbmcgYW5kIHNlbGZ0ZXN0cyB1bmRlciB0b29scy8gKGJwZnRvb2wgYW5kIEJQRiBzZWxmdGVzdHMpIGFuZCBkb2VzIG5vdCBtYWtlIGFueSBjaGFuZ2VzIHRvIHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2VyLXNwYWNlIHRvb2xpbmcgYW5kIHNlbGZ0ZXN0cyB1bmRlciB0b29scy8gKGJwZnRvb2wgYW5kIEJQRiBzZWxmdGVzdHMpIGFuZCBkb2VzIG5vdCBtYWtlIGFueSBjaGFuZ2VzIHRvIHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDI6MDk6NDkuNTYwMDcxODA3WiIsIlNlcSI6NSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflowwfh8c[1] Phase: Running StartedAt: 2026-09-07 02:10:01 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwfh8c[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-09-07 02:10:01 +0000 UTC FinishedAt: 2026-09-07 02:10:06 +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,}