Name: series-workflowj26ln Phase: Failed StartedAt: 2026-09-07 00:30:33 +0000 UTC FinishedAt: 2026-09-07 00:54:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowj26ln[0] Phase: Succeeded StartedAt: 2026-09-07 00:30:33 +0000 UTC FinishedAt: 2026-09-07 00:53:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowj26ln[0].run-triage Phase: Succeeded StartedAt: 2026-09-07 00:30:33 +0000 UTC FinishedAt: 2026-09-07 00:53: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+CgkJCTx0ZD4yMDI2LzA5LzA3IDAwOjUzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIGNvZGUgaW4gdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLCBhbmQgaXMgdGhlcmVmb3JlIG5vdCByZWxldmFudCBmb3Igc3l6a2FsbGVyIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDAwOjUzPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYmRiNTZmMzQxZjIyNzI3NWIyOGQxYTEyNjEwYjFlYWQ1YjcyNDcwMlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDcgMDA6NTM6MzAgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuaW5kZXggNWRhZjNkZTVjNzQ0Ni4uYzEzNTMzODYwMGU4ZiAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuQEAgLTE2LDcgJiM0MzsxNiw3IEBAIFNZTk9QU0lTXG4gXG4gKipicGZ0b29sKiogWypPUFRJT05TKl0gKiptYXAqKiAqQ09NTUFORCpcbiBcbi0qT1BUSU9OUyogOj0geyB8Q09NTU9OX09QVElPTlN8IHwgeyAqKi1mKiogfCAqKi0tYnBmZnMqKiB9IHwgeyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfVxuJiM0MzsqT1BUSU9OUyogOj0geyB8Q09NTU9OX09QVElPTlN8IHwgeyAqKi1mKiogfCAqKi0tYnBmZnMqKiB9IHwgeyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfCB7ICoqLXIqKiB8ICoqLS1yZWN1cnNpdmUqKiB9IH1cbiBcbiAqQ09NTUFORFMqIDo9XG4geyAqKnNob3cqKiB8ICoqbGlzdCoqIHwgKipjcmVhdGUqKiB8ICoqZHVtcCoqIHwgKip1cGRhdGUqKiB8ICoqbG9va3VwKiogfCAqKmdldG5leHQqKiB8XG5AQCAtMTcwLDYgJiM0MzsxNzAsMjMgQEAgT1BUSU9OU1xuICAgICBEbyBub3QgYXV0b21hdGljYWxseSBhdHRlbXB0IHRvIG1vdW50IGFueSB2aXJ0dWFsIGZpbGUgc3lzdGVtIChzdWNoIGFzXG4gICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LlxuIFxuJiM0MzstciwgLS1yZWN1cnNpdmVcbiYjNDM7ICAgIEFsc28gZHVtcCB0aGUgaW5uZXIgbWFwcyByZWZlcmVuY2VkIGJ5ICoqYXJyYXlfb2ZfbWFwcyoqIGFuZCAqKmhhc2hfb2ZfbWFwcyoqXG4mIzQzOyAgICBlbnRyaWVzIHdoZW4gcnVubmluZyAqKm1hcCBkdW1wKiouIEVhY2ggbWFwIGlzIGR1bXBlZCBvbmNlLCBldmVuIGlmIHNldmVyYWxcbiYjNDM7ICAgIGVudHJpZXMgcmVmZXIgdG8gaXQuIFNlbGVjdGVkIG1hcHMgYXJlIGZvbGxvd2VkIGJ5IHRoZWlyIGlubmVyIG1hcHMuXG4mIzQzO1xuJiM0MzsgICAgUGxhaW4gb3V0cHV0IGluY2x1ZGVzIGEgaGVhZGVyIGlkZW50aWZ5aW5nIGVhY2ggbWFwLiBPbiBzdWNjZXNzLCBKU09OIG91dHB1dFxuJiM0MzsgICAgaXMgYWx3YXlzIGFuIGFycmF5IG9mIG1hcCBvYmplY3RzLCBlYWNoIGNvbnRhaW5pbmcgYW4gKippZCoqIGFuZCBhblxuJiM0MzsgICAgKiplbGVtZW50cyoqIGFycmF5LCBpbmNsdWRpbmcgd2hlbiBvbmx5IG9uZSBtYXAgaXMgZHVtcGVkLiBPdXRlciBtYXAgZW50cmllc1xuJiM0MzsgICAgcmV0YWluIHRoZWlyICoqaW5uZXJfbWFwX2lkKiogZmllbGQsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgaW5uZXJcbiYjNDM7ICAgIG1hcCBvYmplY3QuXG4mIzQzO1xuJiM0MzsgICAgVGhlIGR1bXAgaXMgbm90IGEgc25hcHNob3Q6IGNvbmN1cnJlbnQgdXBkYXRlcyBjYW4gY2hhbmdlIG1hcCBjb250ZW50cy5cbiYjNDM7ICAgIEZhaWx1cmUgdG8gb3BlbiBhIHJlZmVyZW5jZWQgaW5uZXIgbWFwIHN0b3BzIHRoZSBkdW1wIGFuZCByZXR1cm5zIGEgbm9uemVyb1xuJiM0MzsgICAgZXhpdCBzdGF0dXMuIE91dHB1dCBtYXkgY29udGFpbiBtYXBzIG9yIGVudHJpZXMgcHJpbnRlZCBiZWZvcmUgdGhlIGVycm9yLlxuJiM0MzsgICAgSW4gSlNPTiBtb2RlLCBhbiBlcnJvciBkdXJpbmcgdHJhdmVyc2FsIGlzIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgYW5kIHRoZVxuJiM0MzsgICAgZW5jbG9zaW5nIGFycmF5cyBhbmQgb2JqZWN0cyBhcmUgY2xvc2VkLlxuJiM0MztcbiBFWEFNUExFU1xuID09PT09PT09XG4gKiojIGJwZnRvb2wgbWFwIHNob3cqKlxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbmluZGV4IDc1Y2JjYjUxMmViYWUuLjQ1YzMzNmQ2M2JlMGEgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbkBAIC0yNjEsNyAmIzQzOzI2MSw3IEBAIF9icGZ0b29sKClcbiBcbiAgICAgIyBEZWFsIHdpdGggb3B0aW9uc1xuICAgICBpZiBbWyAke3dvcmRzW2N3b3JkXX0gPT0gLSogXV07IHRoZW5cbi0gICAgICAgIGxvY2FsIGM9JiMzOTstLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcXFxuJiM0MzsgICAgICAgIGxvY2FsIGM9JiMzOTstLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tcmVjdXJzaXZlIC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcXFxuICAgICAgICAgICAgIC0tdXNlLWxvYWRlciAtLWJhc2UtYnRmIC0tc2lnbiAtaSAtayYjMzk7XG4gICAgICAgICBDT01QUkVQTFk9KCAkKCBjb21wZ2VuIC1XIFwmIzM0OyRjXCYjMzQ7IC0tIFwmIzM0OyRjdXJcJiMzNDsgKSApXG4gICAgICAgICByZXR1cm4gMFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xuaW5kZXggYzkxZTFhNmUxYTFlYy4uMjkwMjFmNGRkNDUxOCAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jXG5AQCAtMjYsNiAmIzQzOzI2LDcgQEAgc3RhdGljIGludCAoKmxhc3RfZG9faGVscCkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTtcbiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcbiBib29sIHByZXR0eV9vdXRwdXQ7XG4gYm9vbCBqc29uX291dHB1dDtcbiYjNDM7Ym9vbCByZWN1cnNpdmU7XG4gYm9vbCBzaG93X3Bpbm5lZDtcbiBib29sIGJsb2NrX21vdW50O1xuIGJvb2wgdmVyaWZpZXJfbG9ncztcbkBAIC00NTIsNiAmIzQzOzQ1Myw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0eyBcJiMzNDtqc29uXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtqJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDtoZWxwXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtoJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDtwcmV0dHlcJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O3AmIzM5OyB9LFxuJiM0MztcdFx0eyBcJiMzNDtyZWN1cnNpdmVcJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O3ImIzM5OyB9LFxuIFx0XHR7IFwmIzM0O3ZlcnNpb25cJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O1YmIzM5OyB9LFxuIFx0XHR7IFwmIzM0O2JwZmZzXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtmJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDttYXBjb21wYXRcJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O20mIzM5OyB9LFxuQEAgLTQ4NSw3ICYjNDM7NDg3LDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0YmluX25hbWUgPSBcJiMzNDticGZ0b29sXCYjMzQ7O1xuIFxuIFx0b3B0ZXJyID0gMDtcbi1cdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXCYjMzQ7VmhwamZMbW5kU2k6azpCOmxcJiMzNDssXG4mIzQzO1x0d2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBcJiMzNDtWaHBqcmZMbW5kU2k6azpCOmxcJiMzNDssXG4gXHRcdFx0XHQgIG9wdGlvbnMsIE5VTEwpKSBcdTAwM2U9IDApIHtcbiBcdFx0c3dpdGNoIChvcHQpIHtcbiBcdFx0Y2FzZSAmIzM5O1YmIzM5OzpcbkBAIC01MDcsNiAmIzQzOzUwOSw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHR9XG4gXHRcdFx0anNvbndfcHJldHR5KGpzb25fd3RyLCBwcmV0dHlfb3V0cHV0KTtcbiBcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTtyJiMzOTs6XG4mIzQzO1x0XHRcdHJlY3Vyc2l2ZSA9IHRydWU7XG4mIzQzO1x0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICYjMzk7ZiYjMzk7OlxuIFx0XHRcdHNob3dfcGlubmVkID0gdHJ1ZTtcbiBcdFx0XHRicmVhaztcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmggYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbmluZGV4IDc4YjZlMGViYjg1ZDguLmI1ZGM3OTYwY2Y2ODIgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxuQEAgLTgzLDYgJiM0Mzs4Myw3IEBAIGV4dGVybiBjb25zdCBjaGFyICpiaW5fbmFtZTtcbiBcbiBleHRlcm4ganNvbl93cml0ZXJfdCAqanNvbl93dHI7XG4gZXh0ZXJuIGJvb2wganNvbl9vdXRwdXQ7XG4mIzQzO2V4dGVybiBib29sIHJlY3Vyc2l2ZTtcbiBleHRlcm4gYm9vbCBzaG93X3Bpbm5lZDtcbiBleHRlcm4gYm9vbCBzaG93X3BpZHM7XG4gZXh0ZXJuIGJvb2wgYmxvY2tfbW91bnQ7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuaW5kZXggNjg0YThmYjcyNDE0Ni4uODUzZjc3NWI3ZDUyOSAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuQEAgLTc0NSw4ICYjNDM7NzQ1LDEwIEBAIHN0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4gXHRcdFx0IGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXG4ge1xuIFx0aWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7XG4tXHRcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGVycm5vKTtcbi1cdFx0cmV0dXJuIC0xO1xuJiM0MztcdFx0aW50IGxvb2t1cF9lcnJubyA9IGVycm5vO1xuJiM0MztcbiYjNDM7XHRcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGxvb2t1cF9lcnJubyk7XG4mIzQzO1x0XHRyZXR1cm4gLWxvb2t1cF9lcnJubztcbiBcdH1cbiBcbiBcdGlmIChqc29uX291dHB1dCkge1xuQEAgLTgyNiwxMiAmIzQzOzgyOCw1MyBAQCBzdGF0aWMgdm9pZCBmcmVlX21hcF9rdl9idGYoc3RydWN0IGJ0ZiAqYnRmKVxuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiB9XG4gXG4mIzQzO3N0cnVjdCBtYXBfZHVtcF9jdHgge1xuJiM0MztcdHN0cnVjdCBoYXNobWFwICpzZWVuO1xuJiM0MztcdGludCAqKmZkcztcbiYjNDM7XHRpbnQgKm5iX2ZkcztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgY29sbGVjdF9pbm5lcl9tYXAoc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4LCBfX3UzMiBpZClcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9nZXRfZmRfYnlfaWRfb3B0cywgb3B0cyxcbiYjNDM7XHRcdC5vcGVuX2ZsYWdzID0gQlBGX0ZfUkRPTkxZLFxuJiM0MztcdCk7XG4mIzQzO1x0aW50ICpmZHMsIGZkLCBlcnI7XG4mIzQzO1xuJiM0MztcdGlmIChoYXNobWFwX19maW5kKGN0eC1cdTAwM2VzZWVuLCBpZCwgTlVMTCkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBicGZfbWFwX2dldF9mZF9ieV9pZF9vcHRzKGlkLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdHBfZXJyKFwmIzM0O2NhbiYjMzk7dCBvcGVuIGlubmVyIG1hcCBpZCAldTogJXNcJiMzNDssIGlkLCBzdHJlcnJvcihlcnJubykpO1xuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZmRzID0gcmVhbGxvYygqY3R4LVx1MDAzZWZkcywgKCpjdHgtXHUwMDNlbmJfZmRzICYjNDM7IDFVTEwpICogc2l6ZW9mKCpmZHMpKTtcbiYjNDM7XHRpZiAoIWZkcykge1xuJiM0MztcdFx0cF9lcnIoXCYjMzQ7bWVtIGFsbG9jIGZhaWxlZFwmIzM0Oyk7XG4mIzQzO1x0XHRjbG9zZShmZCk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcdCpjdHgtXHUwMDNlZmRzID0gZmRzO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBoYXNobWFwX19hZGQoY3R4LVx1MDAzZXNlZW4sIGlkLCAwKTtcbiYjNDM7XHRpZiAoZXJyKSB7XG4mIzQzO1x0XHRwX2VycihcJiMzNDtmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXNcJiMzNDssIGlkLCBzdHJlcnJvcigtZXJyKSk7XG4mIzQzO1x0XHRjbG9zZShmZCk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcdGZkc1soKmN0eC1cdTAwM2VuYl9mZHMpJiM0MzsmIzQzO10gPSBmZDtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgaW50XG4gbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4tXHQgYm9vbCBzaG93X2hlYWRlcilcbiYjNDM7XHQgYm9vbCBzaG93X2hlYWRlciwgc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4KVxuIHtcbiBcdHZvaWQgKmtleSwgKnZhbHVlLCAqcHJldl9rZXk7XG4gXHR1bnNpZ25lZCBpbnQgbnVtX2VsZW1zID0gMDtcbiYjNDM7XHRqc29uX3dyaXRlcl90ICpwbGFpbl9idGZfd3RyID0gTlVMTDtcbiBcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4gXHRpbnQgZXJyO1xuIFxuQEAgLTg0NSw2ICYjNDM7ODg4LDE3IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFxuIFx0cHJldl9rZXkgPSBOVUxMO1xuIFxuJiM0MztcdGlmIChjdHggXHUwMDI2XHUwMDI2ICF3dHIgXHUwMDI2XHUwMDI2IChpbmZvLVx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkIHx8XG4mIzQzO1x0XHRcdCAgICBpbmZvLVx1MDAzZWJ0Zl92bWxpbnV4X3ZhbHVlX3R5cGVfaWQpKSB7XG4mIzQzO1x0XHRwbGFpbl9idGZfd3RyID0gZ2V0X2J0Zl93cml0ZXIoKTtcbiYjNDM7XHRcdGlmIChwbGFpbl9idGZfd3RyKSB7XG4mIzQzO1x0XHRcdGlmIChzaG93X2hlYWRlcilcbiYjNDM7XHRcdFx0XHRzaG93X21hcF9oZWFkZXJfcGxhaW4oaW5mbyk7XG4mIzQzO1x0XHRcdHNob3dfaGVhZGVyID0gZmFsc2U7XG4mIzQzO1x0XHRcdHd0ciA9IHBsYWluX2J0Zl93dHI7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiBcdGlmICh3dHIpIHtcbiBcdFx0ZXJyID0gZ2V0X21hcF9rdl9idGYoaW5mbywgXHUwMDI2YnRmKTtcbiBcdFx0aWYgKGVycikge1xuQEAgLTg3NCwxMCAmIzQzOzkyOCwyMiBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdFx0aWYgKGVycikge1xuIFx0XHRcdGlmIChlcnJubyA9PSBFTk9FTlQpXG4gXHRcdFx0XHRlcnIgPSAwO1xuJiM0MztcdFx0XHRlbHNlIGlmIChjdHgpXG4mIzQzO1x0XHRcdFx0cF9lcnIoXCYjMzQ7Y2FuJiMzOTt0IGdldCBuZXh0IGtleSBmb3IgbWFwIGlkICV1OiAlc1wmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICAgICBpbmZvLVx1MDAzZWlkLCBzdHJlcnJvcihlcnJubykpO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHR9XG4tXHRcdGlmICghZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpKVxuJiM0MztcdFx0ZXJyID0gZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpO1xuJiM0MztcdFx0aWYgKCFlcnIpIHtcbiBcdFx0XHRudW1fZWxlbXMmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRpZiAoY3R4IFx1MDAyNlx1MDAyNiBtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cdTAwM2V0eXBlKSkge1xuJiM0MztcdFx0XHRcdGVyciA9IGNvbGxlY3RfaW5uZXJfbWFwKGN0eCwgKihfX3UzMiAqKXZhbHVlKTtcbiYjNDM7XHRcdFx0XHRpZiAoZXJyKVxuJiM0MztcdFx0XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH0gZWxzZSBpZiAoY3R4IFx1MDAyNlx1MDAyNiBlcnIgIT0gLUVOT0VOVCkge1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiBcdFx0cHJldl9rZXkgPSBrZXk7XG4gXHR9XG4gXG5AQCAtODk0LDYgJiM0Mzs5NjAsOCBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdGZyZWUoa2V5KTtcbiBcdGZyZWUodmFsdWUpO1xuIFx0ZnJlZV9tYXBfa3ZfYnRmKGJ0Zik7XG4mIzQzO1x0aWYgKHBsYWluX2J0Zl93dHIpXG4mIzQzO1x0XHRqc29ud19kZXN0cm95KFx1MDAyNnBsYWluX2J0Zl93dHIpO1xuIFxuIFx0cmV0dXJuIGVycjtcbiB9XG5AQCAtOTAyLDYgJiM0Mzs5NzAsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIHtcbiBcdGpzb25fd3JpdGVyX3QgKnd0ciA9IE5VTEwsICpidGZfd3RyID0gTlVMTDtcbiBcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuJiM0MztcdHN0cnVjdCBtYXBfZHVtcF9jdHggY3R4ID0ge307XG4gXHRpbnQgbmJfZmRzLCBpID0gMDtcbiBcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbiBcdGludCAqZmRzID0gTlVMTDtcbkBAIC05MTksOSAmIzQzOzk4OCwzNiBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0aWYgKG5iX2ZkcyBcdTAwM2MgMSlcbiBcdFx0Z290byBleGl0X2ZyZWU7XG4gXG4mIzQzO1x0aWYgKHJlY3Vyc2l2ZSkge1xuJiM0MztcdFx0Y3R4LnNlZW4gPSBoYXNobWFwX19uZXcoaGFzaF9mbl9mb3Jfa2V5X2FzX2lkLFxuJiM0MztcdFx0XHRcdFx0ZXF1YWxfZm5fZm9yX2tleV9hc19pZCwgTlVMTCk7XG4mIzQzO1x0XHRpZiAoSVNfRVJSKGN0eC5zZWVuKSkge1xuJiM0MztcdFx0XHRjdHguc2VlbiA9IE5VTEw7XG4mIzQzO1x0XHRcdHBfZXJyKFwmIzM0O2ZhaWxlZCB0byBjcmVhdGUgaGFzaG1hcCBmb3IgcmVjdXJzaXZlIGR1bXBcJiMzNDspO1xuJiM0MztcdFx0XHRnb3RvIGV4aXRfY2xvc2U7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRjdHguZmRzID0gXHUwMDI2ZmRzO1xuJiM0MztcdFx0Y3R4Lm5iX2ZkcyA9IFx1MDAyNm5iX2ZkcztcbiYjNDM7XHRcdC8qIFJlY29yZCB0aGUgc2VsZWN0ZWQgbWFwcyBiZWZvcmUgZGlzY292ZXJpbmcgYW55IGlubmVyIG1hcHMuICovXG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYl9mZHM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdGxlbiA9IHNpemVvZihpbmZvKTtcbiYjNDM7XHRcdFx0aWYgKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmRzW2ldLCBcdTAwMjZpbmZvLCBcdTAwMjZsZW4pKSB7XG4mIzQzO1x0XHRcdFx0cF9lcnIoXCYjMzQ7Y2FuJiMzOTt0IGdldCBtYXAgaW5mbzogJXNcJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0XHRcdFx0ZXJyID0gLTE7XG4mIzQzO1x0XHRcdFx0Z290byBleGl0X2Nsb3NlO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGVyciA9IGhhc2htYXBfX2FkZChjdHguc2VlbiwgaW5mby5pZCwgMCk7XG4mIzQzO1x0XHRcdGlmIChlcnIpIHtcbiYjNDM7XHRcdFx0XHRwX2VycihcJiMzNDtmYWlsZWQgdG8gcmVjb3JkIG1hcCBpZCAldTogJXNcJiMzNDssIGluZm8uaWQsXG4mIzQzO1x0XHRcdFx0ICAgICAgc3RyZXJyb3IoLWVycikpO1xuJiM0MztcdFx0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4gXHRpZiAoanNvbl9vdXRwdXQpIHtcbiBcdFx0d3RyID0ganNvbl93dHI7XG4tXHR9IGVsc2Uge1xuJiM0MztcdH0gZWxzZSBpZiAoIXJlY3Vyc2l2ZSkge1xuIFx0XHRpbnQgZG9fcGxhaW5fYnRmO1xuIFxuIFx0XHRkb19wbGFpbl9idGYgPSBtYXBzX2hhdmVfYnRmKGZkcywgbmJfZmRzKTtcbkBAIC05MzYsNyAmIzQzOzEwMzIsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR9XG4gXHR9XG4gXG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4mIzQzO1x0aWYgKHd0ciBcdTAwMjZcdTAwMjYgKG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmUpKVxuIFx0XHRqc29ud19zdGFydF9hcnJheSh3dHIpO1x0Lyogcm9vdCBhcnJheSAqL1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbmJfZmRzOyBpJiM0MzsmIzQzOykge1xuIFx0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFx1MDAyNmluZm8sIFx1MDAyNmxlbikpIHtcbkBAIC05NDQsMjIgJiM0MzsxMDQwLDI4IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdFx0ZXJyID0gLTE7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbi1cdFx0ZXJyID0gbWFwX2R1bXAoZmRzW2ldLCBcdTAwMjZpbmZvLCB3dHIsIG5iX2ZkcyBcdTAwM2UgMSk7XG4mIzQzO1x0XHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZSxcbiYjNDM7XHRcdFx0ICAgICAgIHJlY3Vyc2l2ZSA/IFx1MDAyNmN0eCA6IE5VTEwpO1xuIFx0XHRpZiAoIXd0ciBcdTAwMjZcdTAwMjYgaSAhPSBuYl9mZHMgLSAxKVxuIFx0XHRcdHByaW50ZihcJiMzNDtcXG5cJiMzNDspO1xuIFxuIFx0XHRpZiAoZXJyKVxuIFx0XHRcdGJyZWFrO1xuLVx0XHRjbG9zZShmZHNbaV0pO1xuJiM0MztcdFx0LyogS2VlcCBkaXNjb3ZlcmVkIG1hcHMgYWxpdmUgdW50aWwgdGhlIHJlY3Vyc2l2ZSBkdW1wIGlzIGNvbXBsZXRlLiAqL1xuJiM0MztcdFx0aWYgKCFyZWN1cnNpdmUpXG4mIzQzO1x0XHRcdGNsb3NlKGZkc1tpXSk7XG4gXHR9XG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4mIzQzO1x0aWYgKHd0ciBcdTAwMjZcdTAwMjYgKG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmUpKVxuIFx0XHRqc29ud19lbmRfYXJyYXkod3RyKTtcdC8qIHJvb3QgYXJyYXkgKi9cbiBcbiBcdGlmIChidGZfd3RyKVxuIFx0XHRqc29ud19kZXN0cm95KFx1MDAyNmJ0Zl93dHIpO1xuIGV4aXRfY2xvc2U6XG4mIzQzO1x0aWYgKHJlY3Vyc2l2ZSlcbiYjNDM7XHRcdGkgPSAwO1xuIFx0Zm9yICg7IGkgXHUwMDNjIG5iX2ZkczsgaSYjNDM7JiM0MzspXG4gXHRcdGNsb3NlKGZkc1tpXSk7XG4mIzQzO1x0aGFzaG1hcF9fZnJlZShjdHguc2Vlbik7XG4gZXhpdF9mcmVlOlxuIFx0ZnJlZShmZHMpO1xuIFx0ZnJlZV9idGZfdm1saW51eCgpO1xuQEAgLTE0ODQsNyAmIzQzOzE1ODYsNyBAQCBzdGF0aWMgaW50IGRvX2hlbHAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRcJiMzNDsgICAgICAgICAgICAgICAgIHRhc2tfc3RvcmFnZSB8IGJsb29tX2ZpbHRlciB8IHVzZXJfcmluZ2J1ZiB8IGNncnBfc3RvcmFnZSB8IGFyZW5hIHxcXG5cJiMzNDtcbiBcdFx0XCYjMzQ7ICAgICAgICAgICAgICAgICBpbnNuX2FycmF5IHwgcmhhc2ggfVxcblwmIzM0O1xuIFx0XHRcJiMzNDsgICAgICAgXCYjMzQ7IEhFTFBfU1BFQ19PUFRJT05TIFwmIzM0OyB8XFxuXCYjMzQ7XG4tXHRcdFwmIzM0OyAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfVxcblwmIzM0O1xuJiM0MztcdFx0XCYjMzQ7ICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB8IHstcnwtLXJlY3Vyc2l2ZX0gfVxcblwmIzM0O1xuIFx0XHRcJiMzNDtcJiMzNDssXG4gXHRcdGJpbl9uYW1lLCBhcmd2Wy0yXSk7XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uM2M0MjVkYmUyZDlkNFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jXG5AQCAtMCwwICYjNDM7MSwyNTIgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmdG9vbF9oZWxwZXJzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2J0Zi5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjZGVmaW5lIE9VVFBVVF9TSVpFIDgxOTJcbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGR1bXBfbWFwKF9fdTMyIGlkLCBjb25zdCBjaGFyICpvcHRpb25zLCBjaGFyICpvdXRwdXQpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCYjMzQ7JXMgbWFwIGR1bXAgaWQgJXVcJiMzNDssIG9wdGlvbnMsIGlkKTtcbiYjNDM7XHRtZW1zZXQob3V0cHV0LCAwLCBPVVRQVVRfU0laRSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBPVVRQVVRfU0laRSAtIDEpLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O2R1bXBfbWFwXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHQvKiBUaGUgaGVscGVyIGRvZXNuJiMzOTt0IHRlcm1pbmF0ZSBvciBzdHJpcCB0aGUgb3V0cHV0LiAqL1xuJiM0MztcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXCYjMzQ7XFxuXCYjMzQ7KV0gPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgX191MzIgbWFwX2lkKGludCBmZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuJiM0MztcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSwgXCYjMzQ7bWFwX2luZm9cJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0cmV0dXJuIGluZm8uaWQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgY291bnRfdG9rZW4oY29uc3QgY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICp0b2tlbilcbiYjNDM7e1xuJiM0MztcdGludCBjb3VudCA9IDA7XG4mIzQzO1xuJiM0MztcdHdoaWxlICgob3V0cHV0ID0gc3Ryc3RyKG91dHB1dCwgdG9rZW4pKSkge1xuJiM0MztcdFx0Y291bnQmIzQzOyYjNDM7O1xuJiM0MztcdFx0b3V0cHV0ICYjNDM7PSBzdHJsZW4odG9rZW4pO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gY291bnQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNoZWNrX3BsYWluKF9fdTMyIHJvb3RfaWQsIF9fdTMyIGlubmVyX2lkLCBjb25zdCBjaGFyICp0eXBlLFxuJiM0MztcdFx0XHRpbnQgZW50cmllcywgYm9vbCB0eXBlZClcbiYjNDM7e1xuJiM0MztcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgaGVhZGVyWzEyOF07XG4mIzQzO1x0Y2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge307XG4mIzQzO1x0Y29uc3QgY2hhciAqcm9vdCwgKmlubmVyO1xuJiM0MztcbiYjNDM7XHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwmIzM0Oy0tcmVjdXJzaXZlIG1hcCBkdW1wIGlkICV1XCYjMzQ7LCByb290X2lkKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksXG4mIzQzO1x0XHQgICAgICAgXCYjMzQ7cGxhaW5fZHVtcFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0c25wcmludGYoaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgXCYjMzQ7JXU6ICVzICBuYW1lIGR1bXBfb3V0ZXIgIFwmIzM0Oywgcm9vdF9pZCwgdHlwZSk7XG4mIzQzO1x0cm9vdCA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHJvb3QsIFwmIzM0O3BsYWluX3Jvb3RfaGVhZGVyXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRBU1NFUlRfRVEocm9vdCAtIG91dHB1dCwgMCwgXCYjMzQ7cGxhaW5fcm9vdF9maXJzdFwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXCYjMzQ7aW5uZXJfbWFwX2lkOlwmIzM0OyksIGVudHJpZXMsIFwmIzM0O3BsYWluX3JlZmVyZW5jZXNcJiMzNDspO1xuJiM0MztcdGlmIChlbnRyaWVzKSB7XG4mIzQzO1x0XHRzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCBcJiMzNDsldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICBcJiMzNDssIGlubmVyX2lkKTtcbiYjNDM7XHRcdGlubmVyID0gc3Ryc3RyKG91dHB1dCwgaGVhZGVyKTtcbiYjNDM7XHRcdGlmIChBU1NFUlRfT0tfUFRSKGlubmVyLCBcJiMzNDtwbGFpbl9pbm5lcl9oZWFkZXJcJiMzNDspKVxuJiM0MztcdFx0XHRBU1NFUlRfR1QoaW5uZXIgLSByb290LCAwLCBcJiMzNDtwbGFpbl9pbm5lcl9hZnRlcl9yb290XCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIGhlYWRlciksIDEsIFwmIzM0O3BsYWluX2lubmVyX29uY2VcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBcJiMzNDtGb3VuZCBcJiMzNDspLCBlbnRyaWVzIFx1MDAyNlx1MDAyNiAhdHlwZWQgPyAyIDogMSxcbiYjNDM7XHRcdCAgXCYjMzQ7cGxhaW5fbWFwX2NvdW50XCYjMzQ7KTtcbiYjNDM7XHRpZiAodHlwZWQpIHtcbiYjNDM7XHRcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgXCYjMzQ7XFxcJiMzNDtrZXlcXFwmIzM0OzogMFwmIzM0OywgXCYjMzQ7cGxhaW5fYnRmX2tleVwmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIFwmIzM0O1xcXCYjMzQ7dmFsdWVcXFwmIzM0OzogMTY4NDMwMDlcJiMzNDssIFwmIzM0O3BsYWluX2J0Zl92YWx1ZVwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X291dGVyKGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGludCBlbnRyaWVzLCBib29sIGVtcHR5X2lubmVyLFxuJiM0MztcdFx0ICAgICAgIGJvb2wgdHlwZWQpXG4mIzQzO3tcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBpbm5lcl9vcHRzKTtcbiYjNDM7XHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xuJiM0MztcdGNoYXIgb3V0ZXJbT1VUUFVUX1NJWkVdLCBpbm5lcltPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV07XG4mIzQzO1x0Y2hhciBleHBlY3RlZFtPVVRQVVRfU0laRSAqIDNdLCByZWZlcmVuY2VbNjRdO1xuJiM0MztcdGNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IGxpYmJwZl9icGZfbWFwX3R5cGVfc3RyKHR5cGUpO1xuJiM0MztcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xO1xuJiM0MztcdF9fdTMyIHJvb3RfaWQsIGlubmVyX2lkLCBrZXksIHZhbHVlID0gMHgwMTAxMDEwMTtcbiYjNDM7XG4mIzQzO1x0aWYgKHR5cGVkKSB7XG4mIzQzO1x0XHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCYjMzQ7Y3JlYXRlX2J0ZlwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhQVNTRVJUX0VRKGJ0Zl9fYWRkX2ludChidGYsIFwmIzM0O3Vuc2lnbmVkIGludFwmIzM0OywgNCwgMCksIDEsIFwmIzM0O2J0Zl9pbnRcJiMzNDspIHx8XG4mIzQzO1x0XHQgICAgIUFTU0VSVF9PSyhidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKSwgXCYjMzQ7bG9hZF9idGZcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGlubmVyX29wdHMuYnRmX2ZkID0gYnRmX19mZChidGYpO1xuJiM0MztcdFx0aW5uZXJfb3B0cy5idGZfa2V5X3R5cGVfaWQgPSAxO1xuJiM0MztcdFx0aW5uZXJfb3B0cy5idGZfdmFsdWVfdHlwZV9pZCA9IDE7XG4mIzQzO1x0fVxuJiM0MztcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwmIzM0O2R1bXBfaW5uZXJcJiMzNDssIHNpemVvZihrZXkpLFxuJiM0MztcdFx0XHRcdCAgc2l6ZW9mKHZhbHVlKSwgMiwgXHUwMDI2aW5uZXJfb3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFwmIzM0O2NyZWF0ZV9pbm5lclwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRrZXkgPSAwO1xuJiM0MztcdGlmICghZW1wdHlfaW5uZXIgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShpbm5lcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZ2YWx1ZSwgQlBGX0FOWSksXG4mIzQzO1x0XHQgICAgICAgXCYjMzQ7cG9wdWxhdGVfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcbiYjNDM7XHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsIFwmIzM0O2R1bXBfb3V0ZXJcJiMzNDssIHNpemVvZihrZXkpLCBzaXplb2YoX191MzIpLFxuJiM0MztcdFx0XHRcdCAzLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXCYjMzQ7Y3JlYXRlX291dGVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdC8qIFRoZSB1bnVzZWQgdGhpcmQgYXJyYXkgc2xvdCBhbHNvIGV4ZXJjaXNlcyBmYWlsZWQgbG9va3Vwcy4gKi9cbiYjNDM7XHRmb3IgKGtleSA9IDA7IGtleSBcdTAwM2MgZW50cmllczsga2V5JiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cG9wdWxhdGVfb3V0ZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTtcbiYjNDM7XHRpbm5lcl9pZCA9IG1hcF9pZChpbm5lcl9mZCk7XG4mIzQzO1x0aWYgKCFyb290X2lkIHx8ICFpbm5lcl9pZCB8fCAhZHVtcF9tYXAocm9vdF9pZCwgXCYjMzQ7LWpcJiMzNDssIG91dGVyKSB8fFxuJiM0MztcdCAgICAhZHVtcF9tYXAoaW5uZXJfaWQsIFwmIzM0Oy1qXCYjMzQ7LCBpbm5lcikpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX0VRKG91dGVyWzBdLCAmIzM5O1smIzM5OywgXCYjMzQ7ZGVmYXVsdF9hcnJheVwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCBcJiMzNDtcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6XCYjMzQ7KSwgMCwgXCYjMzQ7ZGVmYXVsdF9ub193cmFwcGVyXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFwmIzM0O1xcXCYjMzQ7aWRcXFwmIzM0OzpcJiMzNDspLCAwLCBcJiMzNDtkZWZhdWx0X25vX2hlYWRlclwmIzM0Oyk7XG4mIzQzO1x0c25wcmludGYocmVmZXJlbmNlLCBzaXplb2YocmVmZXJlbmNlKSwgXCYjMzQ7XFxcJiMzNDtpbm5lcl9tYXBfaWRcXFwmIzM0OzoldVwmIzM0OywgaW5uZXJfaWQpO1xuJiM0MztcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgcmVmZXJlbmNlKSwgZW50cmllcywgXCYjMzQ7ZGVmYXVsdF9yZWZlcmVuY2VzXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIWVudHJpZXMpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0ZXIsIFwmIzM0O1tdXCYjMzQ7LCBcJiMzNDtlbXB0eV9vdXRlcl9kZWZhdWx0XCYjMzQ7KTtcbiYjNDM7XHRpZiAoZW1wdHlfaW5uZXIpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEoaW5uZXIsIFwmIzM0O1tdXCYjMzQ7LCBcJiMzNDtlbXB0eV9pbm5lcl9kZWZhdWx0XCYjMzQ7KTtcbiYjNDM7XHRlbHNlIGlmICh0eXBlZClcbiYjNDM7XHRcdEFTU0VSVF9IQVNfU1VCU1RSKGlubmVyLCBcJiMzNDtcXFwmIzM0O2Zvcm1hdHRlZFxcXCYjMzQ7OntcXFwmIzM0O2tleVxcXCYjMzQ7OjAsXFxcJiMzNDt2YWx1ZVxcXCYjMzQ7OjE2ODQzMDA5fVwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgIFwmIzM0O3R5cGVkX2lubmVyXCYjMzQ7KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEoaW5uZXIsXG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7W3tcXFwmIzM0O2tleVxcXCYjMzQ7OltcXFwmIzM0OzB4MDBcXFwmIzM0OyxcXFwmIzM0OzB4MDBcXFwmIzM0OyxcXFwmIzM0OzB4MDBcXFwmIzM0OyxcXFwmIzM0OzB4MDBcXFwmIzM0O10sXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7XFxcJiMzNDt2YWx1ZVxcXCYjMzQ7OltcXFwmIzM0OzB4MDFcXFwmIzM0OyxcXFwmIzM0OzB4MDFcXFwmIzM0OyxcXFwmIzM0OzB4MDFcXFwmIzM0OyxcXFwmIzM0OzB4MDFcXFwmIzM0O119XVwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDtvcmRpbmFyeV9kZWZhdWx0XCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0LyogQ29tcGFyZSB0aGUgY29tcGxldGUgSlNPTiBkb2N1bWVudDogYSBmbGF0IGFycmF5IHdpdGggdGhlIHJvb3QgZmlyc3QsXG4mIzQzO1x0ICogb25lIGNvcHkgb2YgdGhlIHNoYXJlZCBpbm5lciBtYXAsIGFuZCB1bmNoYW5nZWQgZW50cnkgcmVwcmVzZW50YXRpb25zLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChlbnRyaWVzKVxuJiM0MztcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4mIzQzO1x0XHRcdCBcJiMzNDtbe1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0OyVzXFxcJiMzNDssXFxcJiMzNDtuYW1lXFxcJiMzNDs6XFxcJiMzNDtkdW1wX291dGVyXFxcJiMzNDssXCYjMzQ7XG4mIzQzO1x0XHRcdCBcJiMzNDtcXFwmIzM0O2ZsYWdzXFxcJiMzNDs6MCxcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6JXN9LHtcXFwmIzM0O2lkXFxcJiMzNDs6JXUsXFxcJiMzNDt0eXBlXFxcJiMzNDs6XFxcJiMzNDtoYXNoXFxcJiMzNDssXCYjMzQ7XG4mIzQzO1x0XHRcdCBcJiMzNDtcXFwmIzM0O25hbWVcXFwmIzM0OzpcXFwmIzM0O2R1bXBfaW5uZXJcXFwmIzM0OyxcXFwmIzM0O2ZsYWdzXFxcJiMzNDs6MCxcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6JXN9XVwmIzM0OyxcbiYjNDM7XHRcdFx0IHJvb3RfaWQsIHR5cGVfbmFtZSwgb3V0ZXIsIGlubmVyX2lkLCBpbm5lcik7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4mIzQzO1x0XHRcdCBcJiMzNDtbe1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0OyVzXFxcJiMzNDssXFxcJiMzNDtuYW1lXFxcJiMzNDs6XFxcJiMzNDtkdW1wX291dGVyXFxcJiMzNDssXCYjMzQ7XG4mIzQzO1x0XHRcdCBcJiMzNDtcXFwmIzM0O2ZsYWdzXFxcJiMzNDs6MCxcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6W119XVwmIzM0Oywgcm9vdF9pZCwgdHlwZV9uYW1lKTtcbiYjNDM7XHRpZiAoZHVtcF9tYXAocm9vdF9pZCwgXCYjMzQ7LWogLXJcJiMzNDssIG91dHB1dCkpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCYjMzQ7cmVjdXJzaXZlX2pzb25cJiMzNDspO1xuJiM0MztcdGlmIChkdW1wX21hcChyb290X2lkLCBcJiMzNDstLWpzb24gLS1yZWN1cnNpdmVcJiMzNDssIG91dHB1dCkpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCYjMzQ7cmVjdXJzaXZlX2xvbmdfb3B0aW9uc1wmIzM0Oyk7XG4mIzQzO1x0Y2hlY2tfcGxhaW4ocm9vdF9pZCwgaW5uZXJfaWQsIHR5cGVfbmFtZSwgZW50cmllcywgdHlwZWQpO1xuJiM0MztcbiYjNDM7XHQvKiBSZWN1cnNpb24gb24gYW4gb3JkaW5hcnkgbWFwIHN0aWxsIGVtaXRzIGEgc2luZ2xlIG1hcCBvYmplY3QuICovXG4mIzQzO1x0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4mIzQzO1x0XHQgXCYjMzQ7W3tcXFwmIzM0O2lkXFxcJiMzNDs6JXUsXFxcJiMzNDt0eXBlXFxcJiMzNDs6XFxcJiMzNDtoYXNoXFxcJiMzNDssXFxcJiMzNDtuYW1lXFxcJiMzNDs6XFxcJiMzNDtkdW1wX2lubmVyXFxcJiMzNDssXCYjMzQ7XG4mIzQzO1x0XHQgXCYjMzQ7XFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OiVzfV1cJiMzNDssIGlubmVyX2lkLCBpbm5lcik7XG4mIzQzO1x0aWYgKGR1bXBfbWFwKGlubmVyX2lkLCBcJiMzNDstaiAtclwmIzM0Oywgb3V0cHV0KSlcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcJiMzNDtvcmRpbmFyeV9yZWN1cnNpdmVcJiMzNDspO1xuJiM0MztvdXQ6XG4mIzQzO1x0aWYgKG91dGVyX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKG91dGVyX2ZkKTtcbiYjNDM7XHRpZiAoaW5uZXJfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UoaW5uZXJfZmQpO1xuJiM0MztcdGJ0Zl9fZnJlZShidGYpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X211bHRpcGxlX3Jvb3RzKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbiYjNDM7XHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIG5hbWVbQlBGX09CSl9OQU1FX0xFTl07XG4mIzQzO1x0Y2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge30sIGV4cGVjdGVkW09VVFBVVF9TSVpFICogNF0sIGVsZW1lbnRzW09VVFBVVF9TSVpFXTtcbiYjNDM7XHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHR5cGVzW10gPSB7IFwmIzM0O2hhc2hcJiMzNDssIFwmIzM0O2FycmF5X29mX21hcHNcJiMzNDssIFwmIzM0O2hhc2hfb2ZfbWFwc1wmIzM0OywgXCYjMzQ7aGFzaFwmIzM0OyB9O1xuJiM0MztcdGludCBmZHNbXSA9IHsgLTEsIC0xLCAtMSwgLTEgfTtcbiYjNDM7XHRfX3UzMiBpZHNbNF0sIGtleTtcbiYjNDM7XHRpbnQgaSwgbGVuID0gMDtcbiYjNDM7XG4mIzQzO1x0LyogU2VsZWN0IHRoZSBmaXJzdCBpbm5lciBtYXAgYW5kIGJvdGggb3V0ZXJzIGFzIHJvb3RzLiBUaGUgb3RoZXIgaW5uZXJcbiYjNDM7XHQgKiBtYXAgbXVzdCBiZSBhcHBlbmRlZCBhZnRlciBhbGwgdGhyZWUgcm9vdHMsIGV2ZW4gdGhvdWdoIGl0IGlzIGZvdW5kXG4mIzQzO1x0ICogd2hpbGUgZHVtcGluZyB0aGUgZmlyc3Qgb3V0ZXIuIEEgcHJvY2Vzcy1zcGVjaWZpYyBuYW1lIGF2b2lkcyBvdGhlclxuJiM0MztcdCAqIHRlc3RzJiMzOTsgbWFwcyBqb2luaW5nIHRoZSBzZWxlY3Rpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcJiMzNDtkdW1wXyV1XCYjMzQ7LCBnZXRwaWQoKSk7XG4mIzQzO1x0ZmRzWzBdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIG5hbWUsIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGZkc1swXSwgXCYjMzQ7Y3JlYXRlX3NlbGVjdGVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZkc1szXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcJiMzNDtkdW1wX2Rpc2NvdmVyZWRcJiMzNDssIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGZkc1szXSwgXCYjMzQ7Y3JlYXRlX2Rpc2NvdmVyZWRfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBmZHNbMF07XG4mIzQzO1x0ZmRzWzFdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIG5hbWUsIDQsIDQsIDIsIFx1MDAyNm9wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGZkc1sxXSwgXCYjMzQ7Y3JlYXRlX2FycmF5X3Jvb3RcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZmRzWzJdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXHUwMDI2b3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzJdLCBcJiMzNDtjcmVhdGVfaGFzaF9yb290XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZvciAoaSA9IDE7IGkgXHUwMDNjPSAyOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0a2V5ID0gMDtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCBcdTAwMjZrZXksIFx1MDAyNmZkc1swXSwgQlBGX0FOWSksXG4mIzQzO1x0XHRcdCAgICAgICBcJiMzNDtyZWZlcmVuY2Vfc2VsZWN0ZWRfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGtleSA9IDE7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXHUwMDI2a2V5LCBcdTAwMjZmZHNbM10sIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cmVmZXJlbmNlX2Rpc2NvdmVyZWRfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShmZHMpOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWRzW2ldID0gbWFwX2lkKGZkc1tpXSk7XG4mIzQzO1x0XHRpZiAoIWlkc1tpXSB8fCAhZHVtcF9tYXAoaWRzW2ldLCBcJiMzNDstalwmIzM0OywgZWxlbWVudHMpKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGxlbiAmIzQzOz0gc25wcmludGYoZXhwZWN0ZWQgJiM0MzsgbGVuLCBzaXplb2YoZXhwZWN0ZWQpIC0gbGVuLFxuJiM0MztcdFx0XHRcdFwmIzM0OyVze1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0OyVzXFxcJiMzNDssXFxcJiMzNDtuYW1lXFxcJiMzNDs6XFxcJiMzNDslc1xcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHRcdFwmIzM0O1xcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0Ozolc30lc1wmIzM0OyxcbiYjNDM7XHRcdFx0XHRpID8gXCYjMzQ7LFwmIzM0OyA6IFwmIzM0O1tcJiMzNDssIGlkc1tpXSwgdHlwZXNbaV0sXG4mIzQzO1x0XHRcdFx0aSA9PSAzID8gXCYjMzQ7ZHVtcF9kaXNjb3ZlcmVkXCYjMzQ7IDogbmFtZSwgZWxlbWVudHMsIGkgPT0gMyA/IFwmIzM0O11cJiMzNDsgOiBcJiMzNDtcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwmIzM0Oy1qIC1yIG1hcCBkdW1wIG5hbWUgJXNcJiMzNDssIG5hbWUpO1xuJiM0MztcdGlmIChBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxuJiM0MztcdFx0ICAgICAgXCYjMzQ7ZHVtcF9tdWx0aXBsZV9yb290c1wmIzM0OykpIHtcbiYjNDM7XHRcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXCYjMzQ7XFxuXCYjMzQ7KV0gPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwmIzM0O3Jvb3RzX2ZpcnN0X2FuZF9zZWVkX2RlZHVwXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO291dDpcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGZkcyk7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWYgKGZkc1tpXSBcdTAwM2U9IDApXG4mIzQzO1x0XHRcdGNsb3NlKGZkc1tpXSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9icGZ0b29sX21hcF9kdW1wKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDttdWx0aXBsZV9yb290c1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X211bHRpcGxlX3Jvb3RzKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7YXJyYXlfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2hhc2hfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7c2hhcmVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDIsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7ZW1wdHlfYXJyYXlfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2VtcHR5X2hhc2hfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7YnRmX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIHRydWUpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2VtcHR5X2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgdHJ1ZSwgZmFsc2UpO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDA6NTM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIGNvZGUgaW4gdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLCBhbmQgaXMgdGhlcmVmb3JlIG5vdCByZWxldmFudCBmb3Igc3l6a2FsbGVyIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYmRiNTZmMzQxZjIyNzI3NWIyOGQxYTEyNjEwYjFlYWQ1YjcyNDcwMgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDcgMDA6NTM6MzAgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdCBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0CmluZGV4IDVkYWYzZGU1Yzc0NDYuLmMxMzUzMzg2MDBlOGYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0CiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0CkBAIC0xNiw3ICYjNDM7MTYsNyBAQCBTWU5PUFNJUwogCiAqKmJwZnRvb2wqKiBbKk9QVElPTlMqXSAqKm1hcCoqICpDT01NQU5EKgogCi0qT1BUSU9OUyogOj0geyB8Q09NTU9OX09QVElPTlN8IHwgeyAqKi1mKiogfCAqKi0tYnBmZnMqKiB9IHwgeyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfQomIzQzOypPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfCB7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB8IHsgKiotcioqIHwgKiotLXJlY3Vyc2l2ZSoqIH0gfQogCiAqQ09NTUFORFMqIDo9CiB7ICoqc2hvdyoqIHwgKipsaXN0KiogfCAqKmNyZWF0ZSoqIHwgKipkdW1wKiogfCAqKnVwZGF0ZSoqIHwgKipsb29rdXAqKiB8ICoqZ2V0bmV4dCoqIHwKQEAgLTE3MCw2ICYjNDM7MTcwLDIzIEBAIE9QVElPTlMKICAgICBEbyBub3QgYXV0b21hdGljYWxseSBhdHRlbXB0IHRvIG1vdW50IGFueSB2aXJ0dWFsIGZpbGUgc3lzdGVtIChzdWNoIGFzCiAgICAgdHJhY2VmcyBvciBCUEYgdmlydHVhbCBmaWxlIHN5c3RlbSkgd2hlbiBuZWNlc3NhcnkuCiAKJiM0MzstciwgLS1yZWN1cnNpdmUKJiM0MzsgICAgQWxzbyBkdW1wIHRoZSBpbm5lciBtYXBzIHJlZmVyZW5jZWQgYnkgKiphcnJheV9vZl9tYXBzKiogYW5kICoqaGFzaF9vZl9tYXBzKioKJiM0MzsgICAgZW50cmllcyB3aGVuIHJ1bm5pbmcgKiptYXAgZHVtcCoqLiBFYWNoIG1hcCBpcyBkdW1wZWQgb25jZSwgZXZlbiBpZiBzZXZlcmFsCiYjNDM7ICAgIGVudHJpZXMgcmVmZXIgdG8gaXQuIFNlbGVjdGVkIG1hcHMgYXJlIGZvbGxvd2VkIGJ5IHRoZWlyIGlubmVyIG1hcHMuCiYjNDM7CiYjNDM7ICAgIFBsYWluIG91dHB1dCBpbmNsdWRlcyBhIGhlYWRlciBpZGVudGlmeWluZyBlYWNoIG1hcC4gT24gc3VjY2VzcywgSlNPTiBvdXRwdXQKJiM0MzsgICAgaXMgYWx3YXlzIGFuIGFycmF5IG9mIG1hcCBvYmplY3RzLCBlYWNoIGNvbnRhaW5pbmcgYW4gKippZCoqIGFuZCBhbgomIzQzOyAgICAqKmVsZW1lbnRzKiogYXJyYXksIGluY2x1ZGluZyB3aGVuIG9ubHkgb25lIG1hcCBpcyBkdW1wZWQuIE91dGVyIG1hcCBlbnRyaWVzCiYjNDM7ICAgIHJldGFpbiB0aGVpciAqKmlubmVyX21hcF9pZCoqIGZpZWxkLCB3aGljaCBpZGVudGlmaWVzIHRoZSBjb3JyZXNwb25kaW5nIGlubmVyCiYjNDM7ICAgIG1hcCBvYmplY3QuCiYjNDM7CiYjNDM7ICAgIFRoZSBkdW1wIGlzIG5vdCBhIHNuYXBzaG90OiBjb25jdXJyZW50IHVwZGF0ZXMgY2FuIGNoYW5nZSBtYXAgY29udGVudHMuCiYjNDM7ICAgIEZhaWx1cmUgdG8gb3BlbiBhIHJlZmVyZW5jZWQgaW5uZXIgbWFwIHN0b3BzIHRoZSBkdW1wIGFuZCByZXR1cm5zIGEgbm9uemVybwomIzQzOyAgICBleGl0IHN0YXR1cy4gT3V0cHV0IG1heSBjb250YWluIG1hcHMgb3IgZW50cmllcyBwcmludGVkIGJlZm9yZSB0aGUgZXJyb3IuCiYjNDM7ICAgIEluIEpTT04gbW9kZSwgYW4gZXJyb3IgZHVyaW5nIHRyYXZlcnNhbCBpcyBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGFuZCB0aGUKJiM0MzsgICAgZW5jbG9zaW5nIGFycmF5cyBhbmQgb2JqZWN0cyBhcmUgY2xvc2VkLgomIzQzOwogRVhBTVBMRVMKID09PT09PT09CiAqKiMgYnBmdG9vbCBtYXAgc2hvdyoqCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sCmluZGV4IDc1Y2JjYjUxMmViYWUuLjQ1YzMzNmQ2M2JlMGEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sCkBAIC0yNjEsNyAmIzQzOzI2MSw3IEBAIF9icGZ0b29sKCkKIAogICAgICMgRGVhbCB3aXRoIG9wdGlvbnMKICAgICBpZiBbWyAke3dvcmRzW2N3b3JkXX0gPT0gLSogXV07IHRoZW4KLSAgICAgICAgbG9jYWwgYz0mIzM5Oy0tdmVyc2lvbiAtLWpzb24gLS1wcmV0dHkgLS1icGZmcyAtLW1hcGNvbXBhdCAtLWRlYnVnIFwKJiM0MzsgICAgICAgIGxvY2FsIGM9JiMzOTstLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tcmVjdXJzaXZlIC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcCiAgICAgICAgICAgICAtLXVzZS1sb2FkZXIgLS1iYXNlLWJ0ZiAtLXNpZ24gLWkgLWsmIzM5OwogICAgICAgICBDT01QUkVQTFk9KCAkKCBjb21wZ2VuIC1XICYjMzQ7JGMmIzM0OyAtLSAmIzM0OyRjdXImIzM0OyApICkKICAgICAgICAgcmV0dXJuIDAKZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uYwppbmRleCBjOTFlMWE2ZTFhMWVjLi4yOTAyMWY0ZGQ0NTE4IDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jCkBAIC0yNiw2ICYjNDM7MjYsNyBAQCBzdGF0aWMgaW50ICgqbGFzdF9kb19oZWxwKShpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwoganNvbl93cml0ZXJfdCAqanNvbl93dHI7CiBib29sIHByZXR0eV9vdXRwdXQ7CiBib29sIGpzb25fb3V0cHV0OwomIzQzO2Jvb2wgcmVjdXJzaXZlOwogYm9vbCBzaG93X3Bpbm5lZDsKIGJvb2wgYmxvY2tfbW91bnQ7CiBib29sIHZlcmlmaWVyX2xvZ3M7CkBAIC00NTIsNiAmIzQzOzQ1Myw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJeyAmIzM0O2pzb24mIzM0OywJbm9fYXJndW1lbnQsCU5VTEwsCSYjMzk7aiYjMzk7IH0sCiAJCXsgJiMzNDtoZWxwJiMzNDssCW5vX2FyZ3VtZW50LAlOVUxMLAkmIzM5O2gmIzM5OyB9LAogCQl7ICYjMzQ7cHJldHR5JiMzNDssCW5vX2FyZ3VtZW50LAlOVUxMLAkmIzM5O3AmIzM5OyB9LAomIzQzOwkJeyAmIzM0O3JlY3Vyc2l2ZSYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTtyJiMzOTsgfSwKIAkJeyAmIzM0O3ZlcnNpb24mIzM0OywJbm9fYXJndW1lbnQsCU5VTEwsCSYjMzk7ViYjMzk7IH0sCiAJCXsgJiMzNDticGZmcyYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTtmJiMzOTsgfSwKIAkJeyAmIzM0O21hcGNvbXBhdCYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTttJiMzOTsgfSwKQEAgLTQ4NSw3ICYjNDM7NDg3LDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCWJpbl9uYW1lID0gJiMzNDticGZ0b29sJiMzNDs7CiAKIAlvcHRlcnIgPSAwOwotCXdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgJiMzNDtWaHBqZkxtbmRTaTprOkI6bCYjMzQ7LAomIzQzOwl3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICYjMzQ7VmhwanJmTG1uZFNpOms6QjpsJiMzNDssCiAJCQkJICBvcHRpb25zLCBOVUxMKSkgJmd0Oz0gMCkgewogCQlzd2l0Y2ggKG9wdCkgewogCQljYXNlICYjMzk7ViYjMzk7OgpAQCAtNTA3LDYgJiM0Mzs1MDksOSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCQl9CiAJCQlqc29ud19wcmV0dHkoanNvbl93dHIsIHByZXR0eV9vdXRwdXQpOwogCQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7ciYjMzk7OgomIzQzOwkJCXJlY3Vyc2l2ZSA9IHRydWU7CiYjNDM7CQkJYnJlYWs7CiAJCWNhc2UgJiMzOTtmJiMzOTs6CiAJCQlzaG93X3Bpbm5lZCA9IHRydWU7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaCBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaAppbmRleCA3OGI2ZTBlYmI4NWQ4Li5iNWRjNzk2MGNmNjgyIDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmgKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oCkBAIC04Myw2ICYjNDM7ODMsNyBAQCBleHRlcm4gY29uc3QgY2hhciAqYmluX25hbWU7CiAKIGV4dGVybiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjsKIGV4dGVybiBib29sIGpzb25fb3V0cHV0OwomIzQzO2V4dGVybiBib29sIHJlY3Vyc2l2ZTsKIGV4dGVybiBib29sIHNob3dfcGlubmVkOwogZXh0ZXJuIGJvb2wgc2hvd19waWRzOwogZXh0ZXJuIGJvb2wgYmxvY2tfbW91bnQ7CmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXAuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCmluZGV4IDY4NGE4ZmI3MjQxNDYuLjg1M2Y3NzViN2Q1MjkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCkBAIC03NDUsOCAmIzQzOzc0NSwxMCBAQCBzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAogCQkJIGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpCiB7CiAJaWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7Ci0JCXByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGVycm5vKTsKLQkJcmV0dXJuIC0xOwomIzQzOwkJaW50IGxvb2t1cF9lcnJubyA9IGVycm5vOwomIzQzOwomIzQzOwkJcHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgbG9va3VwX2Vycm5vKTsKJiM0MzsJCXJldHVybiAtbG9va3VwX2Vycm5vOwogCX0KIAogCWlmIChqc29uX291dHB1dCkgewpAQCAtODI2LDEyICYjNDM7ODI4LDUzIEBAIHN0YXRpYyB2b2lkIGZyZWVfbWFwX2t2X2J0ZihzdHJ1Y3QgYnRmICpidGYpCiAJCWJ0Zl9fZnJlZShidGYpOwogfQogCiYjNDM7c3RydWN0IG1hcF9kdW1wX2N0eCB7CiYjNDM7CXN0cnVjdCBoYXNobWFwICpzZWVuOwomIzQzOwlpbnQgKipmZHM7CiYjNDM7CWludCAqbmJfZmRzOwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGludCBjb2xsZWN0X2lubmVyX21hcChzdHJ1Y3QgbWFwX2R1bXBfY3R4ICpjdHgsIF9fdTMyIGlkKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX2dldF9mZF9ieV9pZF9vcHRzLCBvcHRzLAomIzQzOwkJLm9wZW5fZmxhZ3MgPSBCUEZfRl9SRE9OTFksCiYjNDM7CSk7CiYjNDM7CWludCAqZmRzLCBmZCwgZXJyOwomIzQzOwomIzQzOwlpZiAoaGFzaG1hcF9fZmluZChjdHgtJmd0O3NlZW4sIGlkLCBOVUxMKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlmZCA9IGJwZl9tYXBfZ2V0X2ZkX2J5X2lkX29wdHMoaWQsICZhbXA7b3B0cyk7CiYjNDM7CWlmIChmZCAmbHQ7IDApIHsKJiM0MzsJCXBfZXJyKCYjMzQ7Y2FuJiMzOTt0IG9wZW4gaW5uZXIgbWFwIGlkICV1OiAlcyYjMzQ7LCBpZCwgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwomIzQzOwlmZHMgPSByZWFsbG9jKCpjdHgtJmd0O2ZkcywgKCpjdHgtJmd0O25iX2ZkcyAmIzQzOyAxVUxMKSAqIHNpemVvZigqZmRzKSk7CiYjNDM7CWlmICghZmRzKSB7CiYjNDM7CQlwX2VycigmIzM0O21lbSBhbGxvYyBmYWlsZWQmIzM0Oyk7CiYjNDM7CQljbG9zZShmZCk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KJiM0MzsJKmN0eC0mZ3Q7ZmRzID0gZmRzOwomIzQzOwomIzQzOwllcnIgPSBoYXNobWFwX19hZGQoY3R4LSZndDtzZWVuLCBpZCwgMCk7CiYjNDM7CWlmIChlcnIpIHsKJiM0MzsJCXBfZXJyKCYjMzQ7ZmFpbGVkIHRvIHJlY29yZCBpbm5lciBtYXAgaWQgJXU6ICVzJiMzNDssIGlkLCBzdHJlcnJvcigtZXJyKSk7CiYjNDM7CQljbG9zZShmZCk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KJiM0MzsJZmRzWygqY3R4LSZndDtuYl9mZHMpJiM0MzsmIzQzO10gPSBmZDsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwogc3RhdGljIGludAogbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCi0JIGJvb2wgc2hvd19oZWFkZXIpCiYjNDM7CSBib29sIHNob3dfaGVhZGVyLCBzdHJ1Y3QgbWFwX2R1bXBfY3R4ICpjdHgpCiB7CiAJdm9pZCAqa2V5LCAqdmFsdWUsICpwcmV2X2tleTsKIAl1bnNpZ25lZCBpbnQgbnVtX2VsZW1zID0gMDsKJiM0MzsJanNvbl93cml0ZXJfdCAqcGxhaW5fYnRmX3d0ciA9IE5VTEw7CiAJc3RydWN0IGJ0ZiAqYnRmID0gTlVMTDsKIAlpbnQgZXJyOwogCkBAIC04NDUsNiAmIzQzOzg4OCwxNyBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0ciwKIAogCXByZXZfa2V5ID0gTlVMTDsKIAomIzQzOwlpZiAoY3R4ICZhbXA7JmFtcDsgIXd0ciAmYW1wOyZhbXA7IChpbmZvLSZndDtidGZfdmFsdWVfdHlwZV9pZCB8fAomIzQzOwkJCSAgICBpbmZvLSZndDtidGZfdm1saW51eF92YWx1ZV90eXBlX2lkKSkgewomIzQzOwkJcGxhaW5fYnRmX3d0ciA9IGdldF9idGZfd3JpdGVyKCk7CiYjNDM7CQlpZiAocGxhaW5fYnRmX3d0cikgewomIzQzOwkJCWlmIChzaG93X2hlYWRlcikKJiM0MzsJCQkJc2hvd19tYXBfaGVhZGVyX3BsYWluKGluZm8pOwomIzQzOwkJCXNob3dfaGVhZGVyID0gZmFsc2U7CiYjNDM7CQkJd3RyID0gcGxhaW5fYnRmX3d0cjsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwogCWlmICh3dHIpIHsKIAkJZXJyID0gZ2V0X21hcF9rdl9idGYoaW5mbywgJmFtcDtidGYpOwogCQlpZiAoZXJyKSB7CkBAIC04NzQsMTAgJiM0Mzs5MjgsMjIgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCiAJCWlmIChlcnIpIHsKIAkJCWlmIChlcnJubyA9PSBFTk9FTlQpCiAJCQkJZXJyID0gMDsKJiM0MzsJCQllbHNlIGlmIChjdHgpCiYjNDM7CQkJCXBfZXJyKCYjMzQ7Y2FuJiMzOTt0IGdldCBuZXh0IGtleSBmb3IgbWFwIGlkICV1OiAlcyYjMzQ7LAomIzQzOwkJCQkgICAgICBpbmZvLSZndDtpZCwgc3RyZXJyb3IoZXJybm8pKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmICghZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpKQomIzQzOwkJZXJyID0gZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpOwomIzQzOwkJaWYgKCFlcnIpIHsKIAkJCW51bV9lbGVtcyYjNDM7JiM0Mzs7CiYjNDM7CQkJaWYgKGN0eCAmYW1wOyZhbXA7IG1hcF9pc19tYXBfb2ZfbWFwcyhpbmZvLSZndDt0eXBlKSkgewomIzQzOwkJCQllcnIgPSBjb2xsZWN0X2lubmVyX21hcChjdHgsICooX191MzIgKil2YWx1ZSk7CiYjNDM7CQkJCWlmIChlcnIpCiYjNDM7CQkJCQlicmVhazsKJiM0MzsJCQl9CiYjNDM7CQl9IGVsc2UgaWYgKGN0eCAmYW1wOyZhbXA7IGVyciAhPSAtRU5PRU5UKSB7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiAJCXByZXZfa2V5ID0ga2V5OwogCX0KIApAQCAtODk0LDYgJiM0Mzs5NjAsOCBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0ciwKIAlmcmVlKGtleSk7CiAJZnJlZSh2YWx1ZSk7CiAJZnJlZV9tYXBfa3ZfYnRmKGJ0Zik7CiYjNDM7CWlmIChwbGFpbl9idGZfd3RyKQomIzQzOwkJanNvbndfZGVzdHJveSgmYW1wO3BsYWluX2J0Zl93dHIpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTkwMiw2ICYjNDM7OTcwLDcgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKIAlqc29uX3dyaXRlcl90ICp3dHIgPSBOVUxMLCAqYnRmX3d0ciA9IE5VTEw7CiAJc3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307CiYjNDM7CXN0cnVjdCBtYXBfZHVtcF9jdHggY3R4ID0ge307CiAJaW50IG5iX2ZkcywgaSA9IDA7CiAJX191MzIgbGVuID0gc2l6ZW9mKGluZm8pOwogCWludCAqZmRzID0gTlVMTDsKQEAgLTkxOSw5ICYjNDM7OTg4LDM2IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJaWYgKG5iX2ZkcyAmbHQ7IDEpCiAJCWdvdG8gZXhpdF9mcmVlOwogCiYjNDM7CWlmIChyZWN1cnNpdmUpIHsKJiM0MzsJCWN0eC5zZWVuID0gaGFzaG1hcF9fbmV3KGhhc2hfZm5fZm9yX2tleV9hc19pZCwKJiM0MzsJCQkJCWVxdWFsX2ZuX2Zvcl9rZXlfYXNfaWQsIE5VTEwpOwomIzQzOwkJaWYgKElTX0VSUihjdHguc2VlbikpIHsKJiM0MzsJCQljdHguc2VlbiA9IE5VTEw7CiYjNDM7CQkJcF9lcnIoJiMzNDtmYWlsZWQgdG8gY3JlYXRlIGhhc2htYXAgZm9yIHJlY3Vyc2l2ZSBkdW1wJiMzNDspOwomIzQzOwkJCWdvdG8gZXhpdF9jbG9zZTsKJiM0MzsJCX0KJiM0MzsJCWN0eC5mZHMgPSAmYW1wO2ZkczsKJiM0MzsJCWN0eC5uYl9mZHMgPSAmYW1wO25iX2ZkczsKJiM0MzsJCS8qIFJlY29yZCB0aGUgc2VsZWN0ZWQgbWFwcyBiZWZvcmUgZGlzY292ZXJpbmcgYW55IGlubmVyIG1hcHMuICovCiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgbmJfZmRzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWxlbiA9IHNpemVvZihpbmZvKTsKJiM0MzsJCQlpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sICZhbXA7aW5mbywgJmFtcDtsZW4pKSB7CiYjNDM7CQkJCXBfZXJyKCYjMzQ7Y2FuJiMzOTt0IGdldCBtYXAgaW5mbzogJXMmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJCQkJZXJyID0gLTE7CiYjNDM7CQkJCWdvdG8gZXhpdF9jbG9zZTsKJiM0MzsJCQl9CiYjNDM7CQkJZXJyID0gaGFzaG1hcF9fYWRkKGN0eC5zZWVuLCBpbmZvLmlkLCAwKTsKJiM0MzsJCQlpZiAoZXJyKSB7CiYjNDM7CQkJCXBfZXJyKCYjMzQ7ZmFpbGVkIHRvIHJlY29yZCBtYXAgaWQgJXU6ICVzJiMzNDssIGluZm8uaWQsCiYjNDM7CQkJCSAgICAgIHN0cmVycm9yKC1lcnIpKTsKJiM0MzsJCQkJZ290byBleGl0X2Nsb3NlOwomIzQzOwkJCX0KJiM0MzsJCX0KJiM0MzsJfQomIzQzOwogCWlmIChqc29uX291dHB1dCkgewogCQl3dHIgPSBqc29uX3d0cjsKLQl9IGVsc2UgewomIzQzOwl9IGVsc2UgaWYgKCFyZWN1cnNpdmUpIHsKIAkJaW50IGRvX3BsYWluX2J0ZjsKIAogCQlkb19wbGFpbl9idGYgPSBtYXBzX2hhdmVfYnRmKGZkcywgbmJfZmRzKTsKQEAgLTkzNiw3ICYjNDM7MTAzMiw3IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCX0KIAl9CiAKLQlpZiAod3RyICZhbXA7JmFtcDsgbmJfZmRzICZndDsgMSkKJiM0MzsJaWYgKHd0ciAmYW1wOyZhbXA7IChuYl9mZHMgJmd0OyAxIHx8IHJlY3Vyc2l2ZSkpCiAJCWpzb253X3N0YXJ0X2FycmF5KHd0cik7CS8qIHJvb3QgYXJyYXkgKi8KIAlmb3IgKGkgPSAwOyBpICZsdDsgbmJfZmRzOyBpJiM0MzsmIzQzOykgewogCQlpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sICZhbXA7aW5mbywgJmFtcDtsZW4pKSB7CkBAIC05NDQsMjIgJiM0MzsxMDQwLDI4IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCQllcnIgPSAtMTsKIAkJCWJyZWFrOwogCQl9Ci0JCWVyciA9IG1hcF9kdW1wKGZkc1tpXSwgJmFtcDtpbmZvLCB3dHIsIG5iX2ZkcyAmZ3Q7IDEpOwomIzQzOwkJZXJyID0gbWFwX2R1bXAoZmRzW2ldLCAmYW1wO2luZm8sIHd0ciwgbmJfZmRzICZndDsgMSB8fCByZWN1cnNpdmUsCiYjNDM7CQkJICAgICAgIHJlY3Vyc2l2ZSA/ICZhbXA7Y3R4IDogTlVMTCk7CiAJCWlmICghd3RyICZhbXA7JmFtcDsgaSAhPSBuYl9mZHMgLSAxKQogCQkJcHJpbnRmKCYjMzQ7XG4mIzM0Oyk7CiAKIAkJaWYgKGVycikKIAkJCWJyZWFrOwotCQljbG9zZShmZHNbaV0pOwomIzQzOwkJLyogS2VlcCBkaXNjb3ZlcmVkIG1hcHMgYWxpdmUgdW50aWwgdGhlIHJlY3Vyc2l2ZSBkdW1wIGlzIGNvbXBsZXRlLiAqLwomIzQzOwkJaWYgKCFyZWN1cnNpdmUpCiYjNDM7CQkJY2xvc2UoZmRzW2ldKTsKIAl9Ci0JaWYgKHd0ciAmYW1wOyZhbXA7IG5iX2ZkcyAmZ3Q7IDEpCiYjNDM7CWlmICh3dHIgJmFtcDsmYW1wOyAobmJfZmRzICZndDsgMSB8fCByZWN1cnNpdmUpKQogCQlqc29ud19lbmRfYXJyYXkod3RyKTsJLyogcm9vdCBhcnJheSAqLwogCiAJaWYgKGJ0Zl93dHIpCiAJCWpzb253X2Rlc3Ryb3koJmFtcDtidGZfd3RyKTsKIGV4aXRfY2xvc2U6CiYjNDM7CWlmIChyZWN1cnNpdmUpCiYjNDM7CQlpID0gMDsKIAlmb3IgKDsgaSAmbHQ7IG5iX2ZkczsgaSYjNDM7JiM0MzspCiAJCWNsb3NlKGZkc1tpXSk7CiYjNDM7CWhhc2htYXBfX2ZyZWUoY3R4LnNlZW4pOwogZXhpdF9mcmVlOgogCWZyZWUoZmRzKTsKIAlmcmVlX2J0Zl92bWxpbnV4KCk7CkBAIC0xNDg0LDcgJiM0MzsxNTg2LDcgQEAgc3RhdGljIGludCBkb19oZWxwKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJJiMzNDsgICAgICAgICAgICAgICAgIHRhc2tfc3RvcmFnZSB8IGJsb29tX2ZpbHRlciB8IHVzZXJfcmluZ2J1ZiB8IGNncnBfc3RvcmFnZSB8IGFyZW5hIHxcbiYjMzQ7CiAJCSYjMzQ7ICAgICAgICAgICAgICAgICBpbnNuX2FycmF5IHwgcmhhc2ggfVxuJiMzNDsKIAkJJiMzNDsgICAgICAgJiMzNDsgSEVMUF9TUEVDX09QVElPTlMgJiMzNDsgfFxuJiMzNDsKLQkJJiMzNDsgICAgICAgICAgICAgICAgICAgIHstZnwtLWJwZmZzfSB8IHstbnwtLW5vbW91bnR9IH1cbiYjMzQ7CiYjNDM7CQkmIzM0OyAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfCB7LXJ8LS1yZWN1cnNpdmV9IH1cbiYjMzQ7CiAJCSYjMzQ7JiMzNDssCiAJCWJpbl9uYW1lLCBhcmd2Wy0yXSk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4zYzQyNWRiZTJkOWQ0Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jCkBAIC0wLDAgJiM0MzsxLDI1MiBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGZ0b29sX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2J0Zi5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgT1VUUFVUX1NJWkUgODE5MgomIzQzOwomIzQzO3N0YXRpYyBib29sIGR1bXBfbWFwKF9fdTMyIGlkLCBjb25zdCBjaGFyICpvcHRpb25zLCBjaGFyICpvdXRwdXQpCiYjNDM7ewomIzQzOwljaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07CiYjNDM7CiYjNDM7CXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDslcyBtYXAgZHVtcCBpZCAldSYjMzQ7LCBvcHRpb25zLCBpZCk7CiYjNDM7CW1lbXNldChvdXRwdXQsIDAsIE9VVFBVVF9TSVpFKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBPVVRQVVRfU0laRSAtIDEpLAomIzQzOwkJICAgICAgICYjMzQ7ZHVtcF9tYXAmIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CS8qIFRoZSBoZWxwZXIgZG9lc24mIzM5O3QgdGVybWluYXRlIG9yIHN0cmlwIHRoZSBvdXRwdXQuICovCiYjNDM7CW91dHB1dFtzdHJjc3BuKG91dHB1dCwgJiMzNDtcbiYjMzQ7KV0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgX191MzIgbWFwX2lkKGludCBmZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9OwomIzQzOwlfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsICZhbXA7aW5mbywgJmFtcDtsZW4pLCAmIzM0O21hcF9pbmZvJiMzNDspKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CXJldHVybiBpbmZvLmlkOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGNvdW50X3Rva2VuKGNvbnN0IGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqdG9rZW4pCiYjNDM7ewomIzQzOwlpbnQgY291bnQgPSAwOwomIzQzOwomIzQzOwl3aGlsZSAoKG91dHB1dCA9IHN0cnN0cihvdXRwdXQsIHRva2VuKSkpIHsKJiM0MzsJCWNvdW50JiM0MzsmIzQzOzsKJiM0MzsJCW91dHB1dCAmIzQzOz0gc3RybGVuKHRva2VuKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gY291bnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNoZWNrX3BsYWluKF9fdTMyIHJvb3RfaWQsIF9fdTMyIGlubmVyX2lkLCBjb25zdCBjaGFyICp0eXBlLAomIzQzOwkJCWludCBlbnRyaWVzLCBib29sIHR5cGVkKQomIzQzO3sKJiM0MzsJY2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBoZWFkZXJbMTI4XTsKJiM0MzsJY2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge307CiYjNDM7CWNvbnN0IGNoYXIgKnJvb3QsICppbm5lcjsKJiM0MzsKJiM0MzsJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAmIzM0Oy0tcmVjdXJzaXZlIG1hcCBkdW1wIGlkICV1JiMzNDssIHJvb3RfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksCiYjNDM7CQkgICAgICAgJiMzNDtwbGFpbl9kdW1wJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCAmIzM0OyV1OiAlcyAgbmFtZSBkdW1wX291dGVyICAmIzM0Oywgcm9vdF9pZCwgdHlwZSk7CiYjNDM7CXJvb3QgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIocm9vdCwgJiMzNDtwbGFpbl9yb290X2hlYWRlciYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJQVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsICYjMzQ7cGxhaW5fcm9vdF9maXJzdCYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgJiMzNDtpbm5lcl9tYXBfaWQ6JiMzNDspLCBlbnRyaWVzLCAmIzM0O3BsYWluX3JlZmVyZW5jZXMmIzM0Oyk7CiYjNDM7CWlmIChlbnRyaWVzKSB7CiYjNDM7CQlzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCAmIzM0OyV1OiBoYXNoICBuYW1lIGR1bXBfaW5uZXIgICYjMzQ7LCBpbm5lcl9pZCk7CiYjNDM7CQlpbm5lciA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7CiYjNDM7CQlpZiAoQVNTRVJUX09LX1BUUihpbm5lciwgJiMzNDtwbGFpbl9pbm5lcl9oZWFkZXImIzM0OykpCiYjNDM7CQkJQVNTRVJUX0dUKGlubmVyIC0gcm9vdCwgMCwgJiMzNDtwbGFpbl9pbm5lcl9hZnRlcl9yb290JiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgaGVhZGVyKSwgMSwgJiMzNDtwbGFpbl9pbm5lcl9vbmNlJiMzNDspOwomIzQzOwl9CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsICYjMzQ7Rm91bmQgJiMzNDspLCBlbnRyaWVzICZhbXA7JmFtcDsgIXR5cGVkID8gMiA6IDEsCiYjNDM7CQkgICYjMzQ7cGxhaW5fbWFwX2NvdW50JiMzNDspOwomIzQzOwlpZiAodHlwZWQpIHsKJiM0MzsJCUFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgJiMzNDtcJiMzNDtrZXlcJiMzNDs6IDAmIzM0OywgJiMzNDtwbGFpbl9idGZfa2V5JiMzNDspOwomIzQzOwkJQVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCAmIzM0O1wmIzM0O3ZhbHVlXCYjMzQ7OiAxNjg0MzAwOSYjMzQ7LCAmIzM0O3BsYWluX2J0Zl92YWx1ZSYjMzQ7KTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X291dGVyKGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGludCBlbnRyaWVzLCBib29sIGVtcHR5X2lubmVyLAomIzQzOwkJICAgICAgIGJvb2wgdHlwZWQpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgaW5uZXJfb3B0cyk7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7CiYjNDM7CWNoYXIgb3V0ZXJbT1VUUFVUX1NJWkVdLCBpbm5lcltPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV07CiYjNDM7CWNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcmVmZXJlbmNlWzY0XTsKJiM0MzsJY29uc3QgY2hhciAqdHlwZV9uYW1lID0gbGliYnBmX2JwZl9tYXBfdHlwZV9zdHIodHlwZSk7CiYjNDM7CWludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xOwomIzQzOwlfX3UzMiByb290X2lkLCBpbm5lcl9pZCwga2V5LCB2YWx1ZSA9IDB4MDEwMTAxMDE7CiYjNDM7CiYjNDM7CWlmICh0eXBlZCkgewomIzQzOwkJYnRmID0gYnRmX19uZXdfZW1wdHkoKTsKJiM0MzsJCWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7Y3JlYXRlX2J0ZiYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgJiMzNDt1bnNpZ25lZCBpbnQmIzM0OywgNCwgMCksIDEsICYjMzQ7YnRmX2ludCYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksICYjMzQ7bG9hZF9idGYmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpbm5lcl9vcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTsKJiM0MzsJCWlubmVyX29wdHMuYnRmX2tleV90eXBlX2lkID0gMTsKJiM0MzsJCWlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxOwomIzQzOwl9CiYjNDM7CWlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsICYjMzQ7ZHVtcF9pbm5lciYjMzQ7LCBzaXplb2Yoa2V5KSwKJiM0MzsJCQkJICBzaXplb2YodmFsdWUpLCAyLCAmYW1wO2lubmVyX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgJiMzNDtjcmVhdGVfaW5uZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJa2V5ID0gMDsKJiM0MzsJaWYgKCFlbXB0eV9pbm5lciAmYW1wOyZhbXA7CiYjNDM7CSAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oaW5uZXJfZmQsICZhbXA7a2V5LCAmYW1wO3ZhbHVlLCBCUEZfQU5ZKSwKJiM0MzsJCSAgICAgICAmIzM0O3BvcHVsYXRlX2lubmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CW9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7CiYjNDM7CW91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUodHlwZSwgJiMzNDtkdW1wX291dGVyJiMzNDssIHNpemVvZihrZXkpLCBzaXplb2YoX191MzIpLAomIzQzOwkJCQkgMywgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQob3V0ZXJfZmQsICYjMzQ7Y3JlYXRlX291dGVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CS8qIFRoZSB1bnVzZWQgdGhpcmQgYXJyYXkgc2xvdCBhbHNvIGV4ZXJjaXNlcyBmYWlsZWQgbG9va3Vwcy4gKi8KJiM0MzsJZm9yIChrZXkgPSAwOyBrZXkgJmx0OyBlbnRyaWVzOyBrZXkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgJmFtcDtrZXksICZhbXA7aW5uZXJfZmQsIEJQRl9BTlkpLAomIzQzOwkJCSAgICAgICAmIzM0O3BvcHVsYXRlX291dGVyJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwlyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTsKJiM0MzsJaW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpOwomIzQzOwlpZiAoIXJvb3RfaWQgfHwgIWlubmVyX2lkIHx8ICFkdW1wX21hcChyb290X2lkLCAmIzM0Oy1qJiMzNDssIG91dGVyKSB8fAomIzQzOwkgICAgIWR1bXBfbWFwKGlubmVyX2lkLCAmIzM0Oy1qJiMzNDssIGlubmVyKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlBU1NFUlRfRVEob3V0ZXJbMF0sICYjMzk7WyYjMzk7LCAmIzM0O2RlZmF1bHRfYXJyYXkmIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgJiMzNDtcJiMzNDtlbGVtZW50c1wmIzM0OzomIzM0OyksIDAsICYjMzQ7ZGVmYXVsdF9ub193cmFwcGVyJiMzNDspOwomIzQzOwlBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsICYjMzQ7XCYjMzQ7aWRcJiMzNDs6JiMzNDspLCAwLCAmIzM0O2RlZmF1bHRfbm9faGVhZGVyJiMzNDspOwomIzQzOwlzbnByaW50ZihyZWZlcmVuY2UsIHNpemVvZihyZWZlcmVuY2UpLCAmIzM0O1wmIzM0O2lubmVyX21hcF9pZFwmIzM0OzoldSYjMzQ7LCBpbm5lcl9pZCk7CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgcmVmZXJlbmNlKSwgZW50cmllcywgJiMzNDtkZWZhdWx0X3JlZmVyZW5jZXMmIzM0Oyk7CiYjNDM7CWlmICghZW50cmllcykKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRlciwgJiMzNDtbXSYjMzQ7LCAmIzM0O2VtcHR5X291dGVyX2RlZmF1bHQmIzM0Oyk7CiYjNDM7CWlmIChlbXB0eV9pbm5lcikKJiM0MzsJCUFTU0VSVF9TVFJFUShpbm5lciwgJiMzNDtbXSYjMzQ7LCAmIzM0O2VtcHR5X2lubmVyX2RlZmF1bHQmIzM0Oyk7CiYjNDM7CWVsc2UgaWYgKHR5cGVkKQomIzQzOwkJQVNTRVJUX0hBU19TVUJTVFIoaW5uZXIsICYjMzQ7XCYjMzQ7Zm9ybWF0dGVkXCYjMzQ7OntcJiMzNDtrZXlcJiMzNDs6MCxcJiMzNDt2YWx1ZVwmIzM0OzoxNjg0MzAwOX0mIzM0OywKJiM0MzsJCQkJICAmIzM0O3R5cGVkX2lubmVyJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlBU1NFUlRfU1RSRVEoaW5uZXIsCiYjNDM7CQkJICAgICAmIzM0O1t7XCYjMzQ7a2V5XCYjMzQ7OltcJiMzNDsweDAwXCYjMzQ7LFwmIzM0OzB4MDBcJiMzNDssXCYjMzQ7MHgwMFwmIzM0OyxcJiMzNDsweDAwXCYjMzQ7XSwmIzM0OwomIzQzOwkJCSAgICAgJiMzNDtcJiMzNDt2YWx1ZVwmIzM0OzpbXCYjMzQ7MHgwMVwmIzM0OyxcJiMzNDsweDAxXCYjMzQ7LFwmIzM0OzB4MDFcJiMzNDssXCYjMzQ7MHgwMVwmIzM0O119XSYjMzQ7LAomIzQzOwkJCSAgICAgJiMzNDtvcmRpbmFyeV9kZWZhdWx0JiMzNDspOwomIzQzOwomIzQzOwkvKiBDb21wYXJlIHRoZSBjb21wbGV0ZSBKU09OIGRvY3VtZW50OiBhIGZsYXQgYXJyYXkgd2l0aCB0aGUgcm9vdCBmaXJzdCwKJiM0MzsJICogb25lIGNvcHkgb2YgdGhlIHNoYXJlZCBpbm5lciBtYXAsIGFuZCB1bmNoYW5nZWQgZW50cnkgcmVwcmVzZW50YXRpb25zLgomIzQzOwkgKi8KJiM0MzsJaWYgKGVudHJpZXMpCiYjNDM7CQlzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSwKJiM0MzsJCQkgJiMzNDtbe1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7JXNcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc30se1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7aGFzaFwmIzM0OywmIzM0OwomIzQzOwkJCSAmIzM0O1wmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF9pbm5lclwmIzM0OyxcJiMzNDtmbGFnc1wmIzM0OzowLFwmIzM0O2VsZW1lbnRzXCYjMzQ7OiVzfV0mIzM0OywKJiM0MzsJCQkgcm9vdF9pZCwgdHlwZV9uYW1lLCBvdXRlciwgaW5uZXJfaWQsIGlubmVyKTsKJiM0MzsJZWxzZQomIzQzOwkJc25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksCiYjNDM7CQkJICYjMzQ7W3tcJiMzNDtpZFwmIzM0OzoldSxcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0OyVzXCYjMzQ7LFwmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF9vdXRlclwmIzM0OywmIzM0OwomIzQzOwkJCSAmIzM0O1wmIzM0O2ZsYWdzXCYjMzQ7OjAsXCYjMzQ7ZWxlbWVudHNcJiMzNDs6W119XSYjMzQ7LCByb290X2lkLCB0eXBlX25hbWUpOwomIzQzOwlpZiAoZHVtcF9tYXAocm9vdF9pZCwgJiMzNDstaiAtciYjMzQ7LCBvdXRwdXQpKQomIzQzOwkJQVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsICYjMzQ7cmVjdXJzaXZlX2pzb24mIzM0Oyk7CiYjNDM7CWlmIChkdW1wX21hcChyb290X2lkLCAmIzM0Oy0tanNvbiAtLXJlY3Vyc2l2ZSYjMzQ7LCBvdXRwdXQpKQomIzQzOwkJQVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsICYjMzQ7cmVjdXJzaXZlX2xvbmdfb3B0aW9ucyYjMzQ7KTsKJiM0MzsJY2hlY2tfcGxhaW4ocm9vdF9pZCwgaW5uZXJfaWQsIHR5cGVfbmFtZSwgZW50cmllcywgdHlwZWQpOwomIzQzOwomIzQzOwkvKiBSZWN1cnNpb24gb24gYW4gb3JkaW5hcnkgbWFwIHN0aWxsIGVtaXRzIGEgc2luZ2xlIG1hcCBvYmplY3QuICovCiYjNDM7CXNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLAomIzQzOwkJICYjMzQ7W3tcJiMzNDtpZFwmIzM0OzoldSxcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0O2hhc2hcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX2lubmVyXCYjMzQ7LCYjMzQ7CiYjNDM7CQkgJiMzNDtcJiMzNDtmbGFnc1wmIzM0OzowLFwmIzM0O2VsZW1lbnRzXCYjMzQ7OiVzfV0mIzM0OywgaW5uZXJfaWQsIGlubmVyKTsKJiM0MzsJaWYgKGR1bXBfbWFwKGlubmVyX2lkLCAmIzM0Oy1qIC1yJiMzNDssIG91dHB1dCkpCiYjNDM7CQlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtvcmRpbmFyeV9yZWN1cnNpdmUmIzM0Oyk7CiYjNDM7b3V0OgomIzQzOwlpZiAob3V0ZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKG91dGVyX2ZkKTsKJiM0MzsJaWYgKGlubmVyX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShpbm5lcl9mZCk7CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X211bHRpcGxlX3Jvb3RzKHZvaWQpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTsKJiM0MzsJY2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBuYW1lW0JQRl9PQkpfTkFNRV9MRU5dOwomIzQzOwljaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fSwgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiA0XSwgZWxlbWVudHNbT1VUUFVUX1NJWkVdOwomIzQzOwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHR5cGVzW10gPSB7ICYjMzQ7aGFzaCYjMzQ7LCAmIzM0O2FycmF5X29mX21hcHMmIzM0OywgJiMzNDtoYXNoX29mX21hcHMmIzM0OywgJiMzNDtoYXNoJiMzNDsgfTsKJiM0MzsJaW50IGZkc1tdID0geyAtMSwgLTEsIC0xLCAtMSB9OwomIzQzOwlfX3UzMiBpZHNbNF0sIGtleTsKJiM0MzsJaW50IGksIGxlbiA9IDA7CiYjNDM7CiYjNDM7CS8qIFNlbGVjdCB0aGUgZmlyc3QgaW5uZXIgbWFwIGFuZCBib3RoIG91dGVycyBhcyByb290cy4gVGhlIG90aGVyIGlubmVyCiYjNDM7CSAqIG1hcCBtdXN0IGJlIGFwcGVuZGVkIGFmdGVyIGFsbCB0aHJlZSByb290cywgZXZlbiB0aG91Z2ggaXQgaXMgZm91bmQKJiM0MzsJICogd2hpbGUgZHVtcGluZyB0aGUgZmlyc3Qgb3V0ZXIuIEEgcHJvY2Vzcy1zcGVjaWZpYyBuYW1lIGF2b2lkcyBvdGhlcgomIzQzOwkgKiB0ZXN0cyYjMzk7IG1hcHMgam9pbmluZyB0aGUgc2VsZWN0aW9uLgomIzQzOwkgKi8KJiM0MzsJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAmIzM0O2R1bXBfJXUmIzM0OywgZ2V0cGlkKCkpOwomIzQzOwlmZHNbMF0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgbmFtZSwgNCwgNCwgMSwgTlVMTCk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGZkc1swXSwgJiMzNDtjcmVhdGVfc2VsZWN0ZWRfaW5uZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZmRzWzNdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsICYjMzQ7ZHVtcF9kaXNjb3ZlcmVkJiMzNDssIDQsIDQsIDEsIE5VTEwpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChmZHNbM10sICYjMzQ7Y3JlYXRlX2Rpc2NvdmVyZWRfaW5uZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJb3B0cy5pbm5lcl9tYXBfZmQgPSBmZHNbMF07CiYjNDM7CWZkc1sxXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBuYW1lLCA0LCA0LCAyLCAmYW1wO29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChmZHNbMV0sICYjMzQ7Y3JlYXRlX2FycmF5X3Jvb3QmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZmRzWzJdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoZmRzWzJdLCAmIzM0O2NyZWF0ZV9oYXNoX3Jvb3QmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZm9yIChpID0gMTsgaSAmbHQ7PSAyOyBpJiM0MzsmIzQzOykgewomIzQzOwkJa2V5ID0gMDsKJiM0MzsJCWlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCAmYW1wO2tleSwgJmFtcDtmZHNbMF0sIEJQRl9BTlkpLAomIzQzOwkJCSAgICAgICAmIzM0O3JlZmVyZW5jZV9zZWxlY3RlZF9pbm5lciYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWtleSA9IDE7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgJmFtcDtrZXksICZhbXA7ZmRzWzNdLCBCUEZfQU5ZKSwKJiM0MzsJCQkgICAgICAgJiMzNDtyZWZlcmVuY2VfZGlzY292ZXJlZF9pbm5lciYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShmZHMpOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWRzW2ldID0gbWFwX2lkKGZkc1tpXSk7CiYjNDM7CQlpZiAoIWlkc1tpXSB8fCAhZHVtcF9tYXAoaWRzW2ldLCAmIzM0Oy1qJiMzNDssIGVsZW1lbnRzKSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWxlbiAmIzQzOz0gc25wcmludGYoZXhwZWN0ZWQgJiM0MzsgbGVuLCBzaXplb2YoZXhwZWN0ZWQpIC0gbGVuLAomIzQzOwkJCQkmIzM0OyVze1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7JXNcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDslc1wmIzM0OywmIzM0OwomIzQzOwkJCQkmIzM0O1wmIzM0O2ZsYWdzXCYjMzQ7OjAsXCYjMzQ7ZWxlbWVudHNcJiMzNDs6JXN9JXMmIzM0OywKJiM0MzsJCQkJaSA/ICYjMzQ7LCYjMzQ7IDogJiMzNDtbJiMzNDssIGlkc1tpXSwgdHlwZXNbaV0sCiYjNDM7CQkJCWkgPT0gMyA/ICYjMzQ7ZHVtcF9kaXNjb3ZlcmVkJiMzNDsgOiBuYW1lLCBlbGVtZW50cywgaSA9PSAzID8gJiMzNDtdJiMzNDsgOiAmIzM0OyYjMzQ7KTsKJiM0MzsJfQomIzQzOwlzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksICYjMzQ7LWogLXIgbWFwIGR1bXAgbmFtZSAlcyYjMzQ7LCBuYW1lKTsKJiM0MzsJaWYgKEFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksCiYjNDM7CQkgICAgICAmIzM0O2R1bXBfbXVsdGlwbGVfcm9vdHMmIzM0OykpIHsKJiM0MzsJCW91dHB1dFtzdHJjc3BuKG91dHB1dCwgJiMzNDtcbiYjMzQ7KV0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CQlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtyb290c19maXJzdF9hbmRfc2VlZF9kZWR1cCYjMzQ7KTsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IEFSUkFZX1NJWkUoZmRzKTsgaSYjNDM7JiM0MzspCiYjNDM7CQlpZiAoZmRzW2ldICZndDs9IDApCiYjNDM7CQkJY2xvc2UoZmRzW2ldKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2R1bXAodm9pZCkKJiM0Mzt7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bXVsdGlwbGVfcm9vdHMmIzM0OykpCiYjNDM7CQl0ZXN0X211bHRpcGxlX3Jvb3RzKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7YXJyYXlfb2ZfbWFwcyYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7aGFzaF9vZl9tYXBzJiMzNDspKQomIzQzOwkJdGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3NoYXJlZF9pbm5lciYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDIsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7ZW1wdHlfYXJyYXlfb2ZfbWFwcyYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7ZW1wdHlfaGFzaF9vZl9tYXBzJiMzNDspKQomIzQzOwkJdGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2J0Zl9pbm5lciYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2VtcHR5X2lubmVyJiMzNDspKQomIzQzOwkJdGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCB0cnVlLCBmYWxzZSk7CiYjNDM7fQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMDo1MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDg2OQoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDM3MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFBhdGNoOiBXb3J0aEZ1enppbmc9ZmFsc2U/KioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIFRoZSBpbnN0cnVjdGlvbnMgYXJlIGNsZWFyOiB0aGUgY2hhbmdlcyBhcmUgKmFscmVhZHkqIGluIG15IHdvcmtzcGFjZSBhcyB0aGUgSEVBRCBjb21taXQuIE15IHRhc2sgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgcGF0Y2ggd2FycmFudHMgZnV6emluZyBvciBpZiBpdCBjYW4gYmUgc2FmZWx5IGlnbm9yZWQgKGkuZS4sIGBXb3J0aEZ1enppbmc9ZmFsc2VgKS4gU2VjdGlvbiAyIGRpY3RhdGVzIHdoZW4gd2UgY2FuIGJ5cGFzcyBmdXp6aW5nLiBUaGUga2V5IGNyaXRlcmlhIGZvciBgV29ydGhGdXp6aW5nPWZhbHNlYCBhcmUgbm9uLWtlcm5lbCwgbm9uLWV4ZWN1dGFibGUgY2hhbmdlcyB0aGF0IGRvbiYjMzk7dCBpbXBhY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZS4gVGhpcyBpbmNsdWRlcyBkb2N1bWVudGF0aW9uLCBjb21tZW50cywgdXNlci1zcGFjZSB0b29scywgYnVpbGQgc3lzdGVtIGNoYW5nZXMgdGhhdCBkb24mIzM5O3QgYWx0ZXIgdGhlIEMgbG9naWMsIHVucmVhY2hhYmxlIGhhcmR3YXJlLCBhbmQgdW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzLgoKTm93LCBsZXQmIzM5O3MgbG9vayBhdCB0aGUgZGlmZi4gSSBzZWUgdGhlIG1vZGlmaWVkIGZpbGVzIGFyZSBhbGwgbG9jYXRlZCBpbiBgdG9vbHMvYCwgc3BlY2lmaWNhbGx5IHdpdGhpbiBgdG9vbHMvYnBmL2JwZnRvb2wvYCBhbmQgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9gLiBOb3RoaW5nIGp1bXBzIG91dCBhcyBrZXJuZWwtbGV2ZWwgY29kZS4gIFdlIGhhdmUgZG9jdW1lbnRhdGlvbiAoYGJwZnRvb2wtbWFwLnJzdGApLCBzaGVsbCBjb21wbGV0aW9uIHNjcmlwdHMgKGBicGZ0b29sYCB3aXRoaW4gYGJhc2gtY29tcGxldGlvbmApLCB0aGUgbWFpbiBzb3VyY2UgZmlsZXMgKGBtYWluLmNgLCBgbWFpbi5oYCwgYW5kIGBtYXAuY2ApLCBhbmQgYSBzZWxmdGVzdCAoYGJwZnRvb2xfbWFwX2R1bXAuY2ApLiBJdCYjMzk7cyBhbGwgQlBGIHRvb2xpbmcsIHdoaWNoIGNvbmZpcm1zIG15IGluaXRpYWwgaW1wcmVzc2lvbi4gTm9uZSBvZiB0aGVzZSBmaWxlcyBkaXJlY3RseSBtb2RpZnkga2VybmVsIGNvZGUgb3IgdGhlIGtlcm5lbCBpbWFnZSBpdHNlbGYgKGB2bWxpbnV4YCkgb3Iga2VybmVsIG1vZHVsZXMuCgpKdXN0IHRvIGJlIGFic29sdXRlbHkgc3VyZSwgSSYjMzk7bGwgcXVpY2tseSBkb3VibGUtY2hlY2sgdGhhdCB0aGlzIEhFQUQgY29tbWl0ICpvbmx5KiBjb250YWlucyB0aGVzZSBmaWxlczsgbm8gc25lYWt5IGtlcm5lbCBjb2RlIGNyZWVwZWQgaW4uIEJhcnJpbmcgdGhhdCwgSSYjMzk7bSBjb25maWRlbnQgaW4gY2xhc3NpZnlpbmcgdGhpcyBhcyBgV29ydGhGdXp6aW5nPWZhbHNlYC4gVGhpcyBwYXRjaCBpcyBzYWZlIHRvIGlnbm9yZSBpbiB0ZXJtcyBvZiBmdXp6aW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDAwOjUzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0Oy4qJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7dG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7XG5GdWxsIG91dHB1dCBpcyB0b28gbG9uZywgc2hvd2luZyA1MDAgb3V0IG9mIDE2MjAgbGluZXMuXG5Vc2UgbW9yZSBwcmVjaXNlIGV4cHJlc3Npb24gaWYgcG9zc2libGUuXG5cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE6Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IChHUEwtMi4wLW9ubHkgT1IgQlNELTItQ2xhdXNlKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjovKiBDb3B5cmlnaHQgKEMpIDIwMTctMjAxOCBOZXRyb25vbWUgU3lzdGVtcywgSW5jLiAqL1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ6I2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTojaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2OiNpbmNsdWRlIFx1MDAzY2xpbnV4L2Vyci5oXHUwMDNlXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo3OiNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4OiNpbmNsdWRlIFx1MDAzY25ldC9pZi5oXHUwMDNlXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo5OiNpbmNsdWRlIFx1MDAzY3N0ZGJvb2wuaFx1MDAzZVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTA6I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTE6I2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEyOiNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMzojaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTQ6I2luY2x1ZGUgXHUwMDNjc3lzL3R5cGVzLmhcdTAwM2VcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE1OiNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTc6I2luY2x1ZGUgXHUwMDNjYnBmL2JwZi5oXHUwMDNlXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxODojaW5jbHVkZSBcdTAwM2NicGYvYnRmLmhcdTAwM2VcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5OiNpbmNsdWRlIFx1MDAzY2JwZi9oYXNobWFwLmhcdTAwM2VcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIwOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjE6I2luY2x1ZGUgXCYjMzQ7anNvbl93cml0ZXIuaFwmIzM0O1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjI6I2luY2x1ZGUgXCYjMzQ7bWFpbi5oXCYjMzQ7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMzpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI0OnN0YXRpYyBzdHJ1Y3QgaGFzaG1hcCAqbWFwX3RhYmxlO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjU6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNjpzdGF0aWMgYm9vbCBtYXBfaXNfcGVyX2NwdShfX3UzMiB0eXBlKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjc6e1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjg6XHRyZXR1cm4gdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0hBU0ggfHxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5Olx0ICAgICAgIHR5cGUgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSB8fFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzA6XHQgICAgICAgdHlwZSA9PSBCUEZfTUFQX1RZUEVfTFJVX1BFUkNQVV9IQVNIIHx8XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMTpcdCAgICAgICB0eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfQ0dST1VQX1NUT1JBR0U7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMjp9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMzpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0OnN0YXRpYyBib29sIG1hcF9pc19tYXBfb2ZfbWFwcyhfX3UzMiB0eXBlKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzU6e1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzY6XHRyZXR1cm4gdHlwZSA9PSBCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUyB8fFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzc6XHQgICAgICAgdHlwZSA9PSBCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzg6fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzk6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MDpzdGF0aWMgYm9vbCBtYXBfaXNfbWFwX29mX3Byb2dzKF9fdTMyIHR5cGUpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MTp7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MjpcdHJldHVybiB0eXBlID09IEJQRl9NQVBfVFlQRV9QUk9HX0FSUkFZO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDM6fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQ6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTpzdGF0aWMgaW50IG1hcF90eXBlX2Zyb21fc3RyKGNvbnN0IGNoYXIgKnR5cGUpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Njp7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NzpcdGNvbnN0IGNoYXIgKm1hcF90eXBlX3N0cjtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ4Olx0dW5zaWduZWQgaW50IGk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OTpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjUwOlx0Zm9yIChpID0gMDsgOyBpJiM0MzsmIzQzOykge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTE6XHRcdG1hcF90eXBlX3N0ciA9IGxpYmJwZl9icGZfbWFwX3R5cGVfc3RyKGkpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTI6XHRcdGlmICghbWFwX3R5cGVfc3RyKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTM6XHRcdFx0YnJlYWs7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo1NDpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjU1Olx0XHQvKiBEb24mIzM5O3QgYWxsb3cgcHJlZml4aW5nIGluIGNhc2Ugb2YgcG9zc2libGUgZnV0dXJlIHNoYWRvd2luZyAqL1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTY6XHRcdGlmICghc3RyY21wKG1hcF90eXBlX3N0ciwgdHlwZSkpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo1NzpcdFx0XHRyZXR1cm4gaTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjU4Olx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTk6XHRyZXR1cm4gLTE7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2MDp9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2MTpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjYyOnN0YXRpYyB2b2lkICphbGxvY192YWx1ZShzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NjM6e1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NjQ6XHRpZiAobWFwX2lzX3Blcl9jcHUoaW5mby1cdTAwM2V0eXBlKSlcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjY1Olx0XHRyZXR1cm4gbWFsbG9jKHJvdW5kX3VwKGluZm8tXHUwMDNldmFsdWVfc2l6ZSwgOCkgKlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NjY6XHRcdFx0ICAgICAgZ2V0X3Bvc3NpYmxlX2NwdXMoKSk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2NzpcdGVsc2VcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjY4Olx0XHRyZXR1cm4gbWFsbG9jKGluZm8tXHUwMDNldmFsdWVfc2l6ZSk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2OTp9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo3MDpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjcxOnN0YXRpYyBpbnQgZG9fZHVtcF9idGYoY29uc3Qgc3RydWN0IGJ0Zl9kdW1wZXIgKmQsXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo3MjpcdFx0ICAgICAgIHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCB2b2lkICprZXksXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo3MzpcdFx0ICAgICAgIHZvaWQgKnZhbHVlKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NzQ6e1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NzU6XHRfX3UzMiB2YWx1ZV9pZDtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjc2Olx0aW50IHJldCA9IDA7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo3NzpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjc4Olx0Lyogc3RhcnQgb2Yga2V5LXZhbHVlIHBhaXIgKi9cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjc5Olx0anNvbndfc3RhcnRfb2JqZWN0KGQtXHUwMDNlancpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6ODA6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4MTpcdGlmIChtYXBfaW5mby1cdTAwM2VidGZfa2V5X3R5cGVfaWQpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjgyOlx0XHRqc29ud19uYW1lKGQtXHUwMDNlancsIFwmIzM0O2tleVwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4MzpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjg0Olx0XHRyZXQgPSBidGZfZHVtcGVyX3R5cGUoZCwgbWFwX2luZm8tXHUwMDNlYnRmX2tleV90eXBlX2lkLCBrZXkpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6ODU6XHRcdGlmIChyZXQpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4NjpcdFx0XHRnb3RvIGVycl9lbmRfb2JqO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6ODc6XHR9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4ODpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjg5Olx0dmFsdWVfaWQgPSBtYXBfaW5mby1cdTAwM2VidGZfdm1saW51eF92YWx1ZV90eXBlX2lkID9cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjkwOlx0XHQ6IG1hcF9pbmZvLVx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6OTE6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo5MjpcdGlmICghbWFwX2lzX3Blcl9jcHUobWFwX2luZm8tXHUwMDNldHlwZSkpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjkzOlx0XHRqc29ud19uYW1lKGQtXHUwMDNlancsIFwmIzM0O3ZhbHVlXCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjk0Olx0XHRyZXQgPSBidGZfZHVtcGVyX3R5cGUoZCwgdmFsdWVfaWQsIHZhbHVlKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjk1Olx0fSBlbHNlIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjk2Olx0XHR1bnNpZ25lZCBpbnQgaSwgbiwgc3RlcDtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjk3OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6OTg6XHRcdGpzb253X25hbWUoZC1cdTAwM2VqdywgXCYjMzQ7dmFsdWVzXCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjk5Olx0XHRqc29ud19zdGFydF9hcnJheShkLVx1MDAzZWp3KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwMDpcdFx0biA9IGdldF9wb3NzaWJsZV9jcHVzKCk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMDE6XHRcdHN0ZXAgPSByb3VuZF91cChtYXBfaW5mby1cdTAwM2V2YWx1ZV9zaXplLCA4KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwMjpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSYjNDM7JiM0MzspIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwMzpcdFx0XHRqc29ud19zdGFydF9vYmplY3QoZC1cdTAwM2Vqdyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMDQ6XHRcdFx0anNvbndfaW50X2ZpZWxkKGQtXHUwMDNlancsIFwmIzM0O2NwdVwmIzM0OywgaSk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMDU6XHRcdFx0anNvbndfbmFtZShkLVx1MDAzZWp3LCBcJiMzNDt2YWx1ZVwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMDY6XHRcdFx0cmV0ID0gYnRmX2R1bXBlcl90eXBlKGQsIHZhbHVlX2lkLCB2YWx1ZSAmIzQzOyBpICogc3RlcCk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMDc6XHRcdFx0anNvbndfZW5kX29iamVjdChkLVx1MDAzZWp3KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwODpcdFx0XHRpZiAocmV0KVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTA5Olx0XHRcdFx0YnJlYWs7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMTA6XHRcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjExMTpcdFx0anNvbndfZW5kX2FycmF5KGQtXHUwMDNlancpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTEyOlx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTEzOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTE0OmVycl9lbmRfb2JqOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTE1Olx0LyogZW5kIG9mIGtleS12YWx1ZSBwYWlyICovXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMTY6XHRqc29ud19lbmRfb2JqZWN0KGQtXHUwMDNlancpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTE3OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTE4Olx0cmV0dXJuIHJldDtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjExOTp9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMjA6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMjE6c3RhdGljIGpzb25fd3JpdGVyX3QgKmdldF9idGZfd3JpdGVyKHZvaWQpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMjI6e1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTIzOlx0anNvbl93cml0ZXJfdCAqancgPSBqc29ud19uZXcoc3Rkb3V0KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEyNDpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEyNTpcdGlmICghancpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMjY6XHRcdHJldHVybiBOVUxMO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTI3Olx0anNvbndfcHJldHR5KGp3LCB0cnVlKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEyODpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEyOTpcdHJldHVybiBqdztcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEzMDp9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMzE6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMzI6c3RhdGljIHZvaWQgcHJpbnRfZW50cnlfanNvbihzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCB1bnNpZ25lZCBjaGFyICprZXksXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMzM6XHRcdFx0ICAgICB1bnNpZ25lZCBjaGFyICp2YWx1ZSwgc3RydWN0IGJ0ZiAqYnRmKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTM0OntcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEzNTpcdGpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMzY6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMzc6XHRpZiAoIW1hcF9pc19wZXJfY3B1KGluZm8tXHUwMDNldHlwZSkpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEzODpcdFx0anNvbndfbmFtZShqc29uX3d0ciwgXCYjMzQ7a2V5XCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEzOTpcdFx0cHJpbnRfaGV4X2RhdGFfanNvbihrZXksIGluZm8tXHUwMDNla2V5X3NpemUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTQwOlx0XHRqc29ud19uYW1lKGpzb25fd3RyLCBcJiMzNDt2YWx1ZVwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNDE6XHRcdHByaW50X2hleF9kYXRhX2pzb24odmFsdWUsIGluZm8tXHUwMDNldmFsdWVfc2l6ZSk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNDI6XHRcdGlmIChtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cdTAwM2V0eXBlKSlcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE0MzpcdFx0XHRqc29ud191aW50X2ZpZWxkKGpzb25fd3RyLCBcJiMzNDtpbm5lcl9tYXBfaWRcJiMzNDssXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNDQ6XHRcdFx0XHRcdCAqKHVuc2lnbmVkIGludCAqKXZhbHVlKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE0NTpcdFx0aWYgKGJ0Zikge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTQ2Olx0XHRcdHN0cnVjdCBidGZfZHVtcGVyIGQgPSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNDc6XHRcdFx0XHQuYnRmID0gYnRmLFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTQ4Olx0XHRcdFx0Lmp3ID0ganNvbl93dHIsXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNDk6XHRcdFx0XHQuaXNfcGxhaW5fdGV4dCA9IGZhbHNlLFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTUwOlx0XHRcdH07XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNTE6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNTI6XHRcdFx0anNvbndfbmFtZShqc29uX3d0ciwgXCYjMzQ7Zm9ybWF0dGVkXCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE1MzpcdFx0XHRkb19kdW1wX2J0ZihcdTAwMjZkLCBpbmZvLCBrZXksIHZhbHVlKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE1NDpcdFx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTU1Olx0fSBlbHNlIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE1NjpcdFx0dW5zaWduZWQgaW50IGksIG4sIHN0ZXA7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNTc6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNTg6XHRcdG4gPSBnZXRfcG9zc2libGVfY3B1cygpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTU5Olx0XHRzdGVwID0gcm91bmRfdXAoaW5mby1cdTAwM2V2YWx1ZV9zaXplLCA4KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2MDpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2MTpcdFx0anNvbndfbmFtZShqc29uX3d0ciwgXCYjMzQ7a2V5XCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2MjpcdFx0cHJpbnRfaGV4X2RhdGFfanNvbihrZXksIGluZm8tXHUwMDNla2V5X3NpemUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTYzOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTY0Olx0XHRqc29ud19uYW1lKGpzb25fd3RyLCBcJiMzNDt2YWx1ZXNcJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTY1Olx0XHRqc29ud19zdGFydF9hcnJheShqc29uX3d0cik7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNjY6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNjc6XHRcdFx0anNvbndfc3RhcnRfb2JqZWN0KGpzb25fd3RyKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2ODpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2OTpcdFx0XHRqc29ud19pbnRfZmllbGQoanNvbl93dHIsIFwmIzM0O2NwdVwmIzM0OywgaSk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzA6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzE6XHRcdFx0anNvbndfbmFtZShqc29uX3d0ciwgXCYjMzQ7dmFsdWVcJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTcyOlx0XHRcdHByaW50X2hleF9kYXRhX2pzb24odmFsdWUgJiM0MzsgaSAqIHN0ZXAsXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzM6XHRcdFx0XHRcdCAgICBpbmZvLVx1MDAzZXZhbHVlX3NpemUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTc0OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTc1Olx0XHRcdGpzb253X2VuZF9vYmplY3QoanNvbl93dHIpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTc2Olx0XHR9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzc6XHRcdGpzb253X2VuZF9hcnJheShqc29uX3d0cik7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzg6XHRcdGlmIChidGYpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE3OTpcdFx0XHRzdHJ1Y3QgYnRmX2R1bXBlciBkID0ge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTgwOlx0XHRcdFx0LmJ0ZiA9IGJ0ZixcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE4MTpcdFx0XHRcdC5qdyA9IGpzb25fd3RyLFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTgyOlx0XHRcdFx0LmlzX3BsYWluX3RleHQgPSBmYWxzZSxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE4MzpcdFx0XHR9O1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTg0OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTg1Olx0XHRcdGpzb253X25hbWUoanNvbl93dHIsIFwmIzM0O2Zvcm1hdHRlZFwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxODY6XHRcdFx0ZG9fZHVtcF9idGYoXHUwMDI2ZCwgaW5mbywga2V5LCB2YWx1ZSk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxODc6XHRcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE4ODpcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE4OTpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5MDpcdGpzb253X2VuZF9vYmplY3QoanNvbl93dHIpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTkxOn1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5MjpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5MzpzdGF0aWMgdm9pZFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTk0OnByaW50X2VudHJ5X2Vycm9yX21zZyhzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCB1bnNpZ25lZCBjaGFyICprZXksXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxOTU6XHRcdCAgICAgIGNvbnN0IGNoYXIgKmVycm9yX21zZylcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5Njp7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxOTc6XHRpbnQgbXNnX3NpemUgPSBzdHJsZW4oZXJyb3JfbXNnKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5ODpcdGJvb2wgc2luZ2xlX2xpbmUsIGJyZWFrX25hbWVzO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTk5OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjAwOlx0YnJlYWtfbmFtZXMgPSBpbmZvLVx1MDAzZWtleV9zaXplIFx1MDAzZSAxNiB8fCBtc2dfc2l6ZSBcdTAwM2UgMTY7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMDE6XHRzaW5nbGVfbGluZSA9IGluZm8tXHUwMDNla2V5X3NpemUgJiM0MzsgbXNnX3NpemUgXHUwMDNjPSAyNCBcdTAwMjZcdTAwMjYgIWJyZWFrX25hbWVzO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjAyOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjAzOlx0cHJpbnRmKFwmIzM0O2tleTolY1wmIzM0OywgYnJlYWtfbmFtZXMgPyAmIzM5O1xcbiYjMzk7IDogJiMzOTsgJiMzOTspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjA0Olx0ZnByaW50X2hleChzdGRvdXQsIGtleSwgaW5mby1cdTAwM2VrZXlfc2l6ZSwgXCYjMzQ7IFwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMDU6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMDY6XHRwcmludGYoc2luZ2xlX2xpbmUgPyBcJiMzNDsgIFwmIzM0OyA6IFwmIzM0O1xcblwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMDc6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMDg6XHRwcmludGYoXCYjMzQ7dmFsdWU6JWMlc1wmIzM0OywgYnJlYWtfbmFtZXMgPyAmIzM5O1xcbiYjMzk7IDogJiMzOTsgJiMzOTssIGVycm9yX21zZyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMDk6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMTA6XHRwcmludGYoXCYjMzQ7XFxuXCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIxMTp9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMTI6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMTM6c3RhdGljIHZvaWRcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIxNDpwcmludF9lbnRyeV9lcnJvcihzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgdm9pZCAqa2V5LCBpbnQgbG9va3VwX2Vycm5vKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjE1OntcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIxNjpcdC8qIEZvciBwcm9nX2FycmF5IG1hcHMgb3IgYXJyYXlzIG9mIG1hcHMsIGZhaWx1cmUgdG8gbG9va3VwIHRoZSB2YWx1ZVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjE3Olx0ICogbWVhbnMgdGhlcmUgaXMgbm8gZW50cnkgZm9yIHRoYXQga2V5LiBEbyBub3QgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjE4Olx0ICogaW4gdGhhdCBjYXNlLlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjE5Olx0ICovXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMjA6XHRpZiAoKG1hcF9pc19tYXBfb2ZfbWFwcyhtYXBfaW5mby1cdTAwM2V0eXBlKSB8fFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjIxOlx0ICAgICBtYXBfaXNfbWFwX29mX3Byb2dzKG1hcF9pbmZvLVx1MDAzZXR5cGUpKSBcdTAwMjZcdTAwMjYgbG9va3VwX2Vycm5vID09IEVOT0VOVClcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIyMjpcdFx0cmV0dXJuO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjIzOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjI0Olx0aWYgKGpzb25fb3V0cHV0KSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMjU6XHRcdGpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7XHQvKiBlbnRyeSAqL1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjI2Olx0XHRqc29ud19uYW1lKGpzb25fd3RyLCBcJiMzNDtrZXlcJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjI3Olx0XHRwcmludF9oZXhfZGF0YV9qc29uKGtleSwgbWFwX2luZm8tXHUwMDNla2V5X3NpemUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjI4Olx0XHRqc29ud19uYW1lKGpzb25fd3RyLCBcJiMzNDt2YWx1ZVwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMjk6XHRcdGpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7XHQvKiBlcnJvciAqL1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjMwOlx0XHRqc29ud19zdHJpbmdfZmllbGQoanNvbl93dHIsIFwmIzM0O2Vycm9yXCYjMzQ7LCBzdHJlcnJvcihsb29rdXBfZXJybm8pKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzMTpcdFx0anNvbndfZW5kX29iamVjdChqc29uX3d0cik7XHQvKiBlcnJvciAqL1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjMyOlx0XHRqc29ud19lbmRfb2JqZWN0KGpzb25fd3RyKTtcdC8qIGVudHJ5ICovXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMzM6XHR9IGVsc2Uge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjM0Olx0XHRjb25zdCBjaGFyICptc2cgPSBOVUxMO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjM1OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjM2Olx0XHRpZiAobG9va3VwX2Vycm5vID09IEVOT0VOVClcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzNzpcdFx0XHRtc2cgPSBcJiMzNDtcdTAwM2NubyBlbnRyeVx1MDAzZVwmIzM0OztcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzODpcdFx0ZWxzZSBpZiAobG9va3VwX2Vycm5vID09IEVOT1NQQyBcdTAwMjZcdTAwMjZcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzOTpcdFx0XHQgbWFwX2luZm8tXHUwMDNldHlwZSA9PSBCUEZfTUFQX1RZUEVfUkVVU0VQT1JUX1NPQ0tBUlJBWSlcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI0MDpcdFx0XHRtc2cgPSBcJiMzNDtcdTAwM2NjYW5ub3QgcmVhZFx1MDAzZVwmIzM0OztcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI0MTpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI0MjpcdFx0cHJpbnRfZW50cnlfZXJyb3JfbXNnKG1hcF9pbmZvLCBrZXksXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNDM6XHRcdFx0XHQgICAgICBtc2cgPyA6IHN0cmVycm9yKGxvb2t1cF9lcnJubykpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjQ0Olx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjQ1On1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI0NjpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI0NzpzdGF0aWMgdm9pZCBwcmludF9lbnRyeV9wbGFpbihzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCB1bnNpZ25lZCBjaGFyICprZXksXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNDg6XHRcdFx0ICAgICAgdW5zaWduZWQgY2hhciAqdmFsdWUpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNDk6e1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjUwOlx0aWYgKCFtYXBfaXNfcGVyX2NwdShpbmZvLVx1MDAzZXR5cGUpKSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNTE6XHRcdGJvb2wgc2luZ2xlX2xpbmUsIGJyZWFrX25hbWVzO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjUyOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjUzOlx0XHRicmVha19uYW1lcyA9IGluZm8tXHUwMDNla2V5X3NpemUgXHUwMDNlIDE2IHx8IGluZm8tXHUwMDNldmFsdWVfc2l6ZSBcdTAwM2UgMTY7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNTQ6XHRcdHNpbmdsZV9saW5lID0gaW5mby1cdTAwM2VrZXlfc2l6ZSAmIzQzOyBpbmZvLVx1MDAzZXZhbHVlX3NpemUgXHUwMDNjPSAyNCBcdTAwMjZcdTAwMjZcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI1NTpcdFx0XHQhYnJlYWtfbmFtZXM7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNTY6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNTc6XHRcdGlmIChpbmZvLVx1MDAzZWtleV9zaXplKSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNTg6XHRcdFx0cHJpbnRmKFwmIzM0O2tleTolY1wmIzM0OywgYnJlYWtfbmFtZXMgPyAmIzM5O1xcbiYjMzk7IDogJiMzOTsgJiMzOTspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjU5Olx0XHRcdGZwcmludF9oZXgoc3Rkb3V0LCBrZXksIGluZm8tXHUwMDNla2V5X3NpemUsIFwmIzM0OyBcJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjYwOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjYxOlx0XHRcdHByaW50ZihzaW5nbGVfbGluZSA/IFwmIzM0OyAgXCYjMzQ7IDogXCYjMzQ7XFxuXCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI2MjpcdFx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjYzOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjY0Olx0XHRpZiAoaW5mby1cdTAwM2V2YWx1ZV9zaXplKSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNjU6XHRcdFx0aWYgKG1hcF9pc19tYXBfb2ZfbWFwcyhpbmZvLVx1MDAzZXR5cGUpKSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNjY6XHRcdFx0XHRwcmludGYoXCYjMzQ7aW5uZXJfbWFwX2lkOiVjXCYjMzQ7LCBicmVha19uYW1lcyA/ICYjMzk7XFxuJiMzOTsgOiAmIzM5OyAmIzM5Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNjc6XHRcdFx0XHRwcmludGYoXCYjMzQ7JXUgXCYjMzQ7LCAqKHVuc2lnbmVkIGludCAqKXZhbHVlKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI2ODpcdFx0XHR9IGVsc2Uge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjY5Olx0XHRcdFx0cHJpbnRmKFwmIzM0O3ZhbHVlOiVjXCYjMzQ7LCBicmVha19uYW1lcyA/ICYjMzk7XFxuJiMzOTsgOiAmIzM5OyAmIzM5Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNzA6XHRcdFx0XHRmcHJpbnRfaGV4KHN0ZG91dCwgdmFsdWUsIGluZm8tXHUwMDNldmFsdWVfc2l6ZSwgXCYjMzQ7IFwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNzE6XHRcdFx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjcyOlx0XHR9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNzM6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNzQ6XHRcdHByaW50ZihcJiMzNDtcXG5cJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjc1Olx0fSBlbHNlIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI3NjpcdFx0dW5zaWduZWQgaW50IGksIG4sIHN0ZXA7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNzc6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNzg6XHRcdG4gPSBnZXRfcG9zc2libGVfY3B1cygpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjc5Olx0XHRzdGVwID0gcm91bmRfdXAoaW5mby1cdTAwM2V2YWx1ZV9zaXplLCA4KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI4MDpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI4MTpcdFx0aWYgKGluZm8tXHUwMDNla2V5X3NpemUpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI4MjpcdFx0XHRwcmludGYoXCYjMzQ7a2V5OlxcblwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyODM6XHRcdFx0ZnByaW50X2hleChzdGRvdXQsIGtleSwgaW5mby1cdTAwM2VrZXlfc2l6ZSwgXCYjMzQ7IFwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyODQ6XHRcdFx0cHJpbnRmKFwmIzM0O1xcblwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyODU6XHRcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI4NjpcdFx0aWYgKGluZm8tXHUwMDNldmFsdWVfc2l6ZSkge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjg3Olx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyODg6XHRcdFx0XHRwcmludGYoXCYjMzQ7dmFsdWUgKENQVSAlMDJ1KTolY1wmIzM0OyxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI4OTpcdFx0XHRcdCAgICAgICBpLCBpbmZvLVx1MDAzZXZhbHVlX3NpemUgXHUwMDNlIDE2ID8gJiMzOTtcXG4mIzM5OyA6ICYjMzk7ICYjMzk7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5MDpcdFx0XHRcdGZwcmludF9oZXgoc3Rkb3V0LCB2YWx1ZSAmIzQzOyBpICogc3RlcCxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5MTpcdFx0XHRcdFx0ICAgaW5mby1cdTAwM2V2YWx1ZV9zaXplLCBcJiMzNDsgXCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5MjpcdFx0XHRcdHByaW50ZihcJiMzNDtcXG5cJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjkzOlx0XHRcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5NDpcdFx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjk1Olx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjk2On1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5NzpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5ODpzdGF0aWMgY2hhciAqKnBhcnNlX2J5dGVzKGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBjaGFyICp2YWwsXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyOTk6XHRcdFx0ICB1bnNpZ25lZCBpbnQgbilcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMwMDp7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMDE6XHR1bnNpZ25lZCBpbnQgaSA9IDAsIGJhc2UgPSAwO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzAyOlx0Y2hhciAqZW5kcHRyO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzAzOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzA0Olx0aWYgKGlzX3ByZWZpeCgqYXJndiwgXCYjMzQ7aGV4XCYjMzQ7KSkge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzA1Olx0XHRiYXNlID0gMTY7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMDY6XHRcdGFyZ3YmIzQzOyYjNDM7O1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzA3Olx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzA4OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzA5Olx0d2hpbGUgKGkgXHUwMDNjIG4gXHUwMDI2XHUwMDI2IGFyZ3ZbaV0pIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMxMDpcdFx0dmFsW2ldID0gc3RydG91bChhcmd2W2ldLCBcdTAwMjZlbmRwdHIsIGJhc2UpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzExOlx0XHRpZiAoKmVuZHB0cikge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzEyOlx0XHRcdHBfZXJyKFwmIzM0O2Vycm9yIHBhcnNpbmcgYnl0ZTogJXNcJiMzNDssIGFyZ3ZbaV0pO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzEzOlx0XHRcdHJldHVybiBOVUxMO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzE0Olx0XHR9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMTU6XHRcdGkmIzQzOyYjNDM7O1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzE2Olx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzE3OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzE4Olx0aWYgKGkgIT0gbikge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzE5Olx0XHRwX2VycihcJiMzNDslcyBleHBlY3RlZCAldSBieXRlcyBnb3QgJXVcJiMzNDssIG5hbWUsIG4sIGkpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzIwOlx0XHRyZXR1cm4gTlVMTDtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMyMTpcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMyMjpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMyMzpcdHJldHVybiBhcmd2ICYjNDM7IGk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMjQ6fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzI1OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzI2Oi8qIG9uIHBlciBjcHUgbWFwcyB3ZSBtdXN0IGNvcHkgdGhlIHByb3ZpZGVkIHZhbHVlIG9uIGFsbCB2YWx1ZSBpbnN0YW5jZXMgKi9cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMyNzpzdGF0aWMgdm9pZCBmaWxsX3Blcl9jcHVfdmFsdWUoc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywgdm9pZCAqdmFsdWUpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMjg6e1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzI5Olx0dW5zaWduZWQgaW50IGksIG4sIHN0ZXA7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMzA6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMzE6XHRpZiAoIW1hcF9pc19wZXJfY3B1KGluZm8tXHUwMDNldHlwZSkpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMzI6XHRcdHJldHVybjtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMzMzpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMzNDpcdG4gPSBnZXRfcG9zc2libGVfY3B1cygpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzM1Olx0c3RlcCA9IHJvdW5kX3VwKGluZm8tXHUwMDNldmFsdWVfc2l6ZSwgOCk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMzY6XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBuOyBpJiM0MzsmIzQzOylcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMzNzpcdFx0bWVtY3B5KHZhbHVlICYjNDM7IGkgKiBzdGVwLCB2YWx1ZSwgaW5mby1cdTAwM2V2YWx1ZV9zaXplKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMzODp9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMzk6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNDA6c3RhdGljIGludCBwYXJzZV9lbGVtKGNoYXIgKiphcmd2LCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCB2b2lkICprZXksXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNDE6XHRcdCAgICAgIHZvaWQgKnZhbHVlLCBfX3UzMiBrZXlfc2l6ZSwgX191MzIgdmFsdWVfc2l6ZSxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0MjpcdFx0ICAgICAgX191MzIgKmZsYWdzLCBfX3UzMiAqKnZhbHVlX2ZkLCBfX3UzMiBvcGVuX2ZsYWdzKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzQzOntcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0NDpcdGlmICghKmFyZ3YpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0NTpcdFx0aWYgKCFrZXkgXHUwMDI2XHUwMDI2ICF2YWx1ZSlcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0NjpcdFx0XHRyZXR1cm4gMDtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0NzpcdFx0cF9lcnIoXCYjMzQ7ZGlkIG5vdCBmaW5kICVzXCYjMzQ7LCBrZXkgPyBcJiMzNDtrZXlcJiMzNDsgOiBcJiMzNDt2YWx1ZVwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNDg6XHRcdHJldHVybiAtMTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0OTpcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1MDpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1MTpcdGlmIChpc19wcmVmaXgoKmFyZ3YsIFwmIzM0O2tleVwmIzM0OykpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1MjpcdFx0aWYgKCFrZXkpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1MzpcdFx0XHRpZiAoa2V5X3NpemUpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNTQ6XHRcdFx0XHRwX2VycihcJiMzNDtkdXBsaWNhdGUga2V5XCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1NTpcdFx0XHRlbHNlXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNTY6XHRcdFx0XHRwX2VycihcJiMzNDt1bm5lY2Vzc2FyeSBrZXlcJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzU3Olx0XHRcdHJldHVybiAtMTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1ODpcdFx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzU5OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzYwOlx0XHRhcmd2ID0gcGFyc2VfYnl0ZXMoYXJndiAmIzQzOyAxLCBcJiMzNDtrZXlcJiMzNDssIGtleSwga2V5X3NpemUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzYxOlx0XHRpZiAoIWFyZ3YpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNjI6XHRcdFx0cmV0dXJuIC0xO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzYzOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzY0Olx0XHRyZXR1cm4gcGFyc2VfZWxlbShhcmd2LCBpbmZvLCBOVUxMLCB2YWx1ZSwga2V5X3NpemUsIHZhbHVlX3NpemUsXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNjU6XHRcdFx0XHQgIGZsYWdzLCB2YWx1ZV9mZCwgb3Blbl9mbGFncyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNjY6XHR9IGVsc2UgaWYgKGlzX3ByZWZpeCgqYXJndiwgXCYjMzQ7dmFsdWVcJiMzNDspKSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNjc6XHRcdGludCBmZDtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM2ODpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM2OTpcdFx0aWYgKCF2YWx1ZSkge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzcwOlx0XHRcdGlmICh2YWx1ZV9zaXplKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzcxOlx0XHRcdFx0cF9lcnIoXCYjMzQ7ZHVwbGljYXRlIHZhbHVlXCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM3MjpcdFx0XHRlbHNlXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNzM6XHRcdFx0XHRwX2VycihcJiMzNDt1bm5lY2Vzc2FyeSB2YWx1ZVwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNzQ6XHRcdFx0cmV0dXJuIC0xO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzc1Olx0XHR9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNzY6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNzc6XHRcdGFyZ3YmIzQzOyYjNDM7O1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzc4OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzc5Olx0XHRpZiAobWFwX2lzX21hcF9vZl9tYXBzKGluZm8tXHUwMDNldHlwZSkpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM4MDpcdFx0XHRpbnQgYXJnYyA9IDI7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozODE6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozODI6XHRcdFx0aWYgKHZhbHVlX3NpemUgIT0gNCkge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzgzOlx0XHRcdFx0cF9lcnIoXCYjMzQ7dmFsdWUgc21hbGxlciB0aGFuIDRCIGZvciBtYXAgaW4gbWFwP1wmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozODQ6XHRcdFx0XHRyZXR1cm4gLTE7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozODU6XHRcdFx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzg2Olx0XHRcdGlmICghYXJndlswXSB8fCAhYXJndlsxXSkge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzg3Olx0XHRcdFx0cF9lcnIoXCYjMzQ7bm90IGVub3VnaCB2YWx1ZSBhcmd1bWVudHMgZm9yIG1hcCBpbiBtYXBcJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzg4Olx0XHRcdFx0cmV0dXJuIC0xO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzg5Olx0XHRcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM5MDpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM5MTpcdFx0XHRmZCA9IG1hcF9wYXJzZV9mZChcdTAwMjZhcmdjLCBcdTAwMjZhcmd2LCBvcGVuX2ZsYWdzKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM5MjpcdFx0XHRpZiAoZmQgXHUwMDNjIDApXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozOTM6XHRcdFx0XHRyZXR1cm4gLTE7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozOTQ6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozOTU6XHRcdFx0KnZhbHVlX2ZkID0gdmFsdWU7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozOTY6XHRcdFx0Kip2YWx1ZV9mZCA9IGZkO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzk3Olx0XHR9IGVsc2UgaWYgKG1hcF9pc19tYXBfb2ZfcHJvZ3MoaW5mby1cdTAwM2V0eXBlKSkge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzk4Olx0XHRcdGludCBhcmdjID0gMjtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM5OTpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQwMDpcdFx0XHRpZiAodmFsdWVfc2l6ZSAhPSA0KSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MDE6XHRcdFx0XHRwX2VycihcJiMzNDt2YWx1ZSBzbWFsbGVyIHRoYW4gNEIgZm9yIG1hcCBvZiBwcm9ncz9cJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDAyOlx0XHRcdFx0cmV0dXJuIC0xO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDAzOlx0XHRcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQwNDpcdFx0XHRpZiAoIWFyZ3ZbMF0gfHwgIWFyZ3ZbMV0pIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQwNTpcdFx0XHRcdHBfZXJyKFwmIzM0O25vdCBlbm91Z2ggdmFsdWUgYXJndW1lbnRzIGZvciBtYXAgb2YgcHJvZ3NcJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDA2Olx0XHRcdFx0cmV0dXJuIC0xO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDA3Olx0XHRcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQwODpcdFx0XHRpZiAoaXNfcHJlZml4KCphcmd2LCBcJiMzNDtpZFwmIzM0OykpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MDk6XHRcdFx0XHRwX2luZm8oXCYjMzQ7V2FybmluZzogdXBkYXRpbmcgcHJvZ3JhbSBhcnJheSB2aWEgTUFQX0lELCBtYWtlIHN1cmUgdGhpcyBtYXAgaXMga2VwdCBvcGVuXFxuXCYjMzQ7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MTA6XHRcdFx0XHQgICAgICAgXCYjMzQ7ICAgICAgICAgYnkgc29tZSBwcm9jZXNzIG9yIHBpbm5lZCBvdGhlcndpc2UgdXBkYXRlIHdpbGwgYmUgbG9zdFwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MTE6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MTI6XHRcdFx0ZmQgPSBwcm9nX3BhcnNlX2ZkKFx1MDAyNmFyZ2MsIFx1MDAyNmFyZ3YpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDEzOlx0XHRcdGlmIChmZCBcdTAwM2MgMClcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQxNDpcdFx0XHRcdHJldHVybiAtMTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQxNTpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQxNjpcdFx0XHQqdmFsdWVfZmQgPSB2YWx1ZTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQxNzpcdFx0XHQqKnZhbHVlX2ZkID0gZmQ7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MTg6XHRcdH0gZWxzZSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MTk6XHRcdFx0YXJndiA9IHBhcnNlX2J5dGVzKGFyZ3YsIFwmIzM0O3ZhbHVlXCYjMzQ7LCB2YWx1ZSwgdmFsdWVfc2l6ZSk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MjA6XHRcdFx0aWYgKCFhcmd2KVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDIxOlx0XHRcdFx0cmV0dXJuIC0xO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDIyOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDIzOlx0XHRcdGZpbGxfcGVyX2NwdV92YWx1ZShpbmZvLCB2YWx1ZSk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MjQ6XHRcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQyNTpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQyNjpcdFx0cmV0dXJuIHBhcnNlX2VsZW0oYXJndiwgaW5mbywga2V5LCBOVUxMLCBrZXlfc2l6ZSwgdmFsdWVfc2l6ZSxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQyNzpcdFx0XHRcdCAgZmxhZ3MsIE5VTEwsIG9wZW5fZmxhZ3MpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDI4Olx0fSBlbHNlIGlmIChpc19wcmVmaXgoKmFyZ3YsIFwmIzM0O2FueVwmIzM0OykgfHwgaXNfcHJlZml4KCphcmd2LCBcJiMzNDtub2V4aXN0XCYjMzQ7KSB8fFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDI5Olx0XHQgICBpc19wcmVmaXgoKmFyZ3YsIFwmIzM0O2V4aXN0XCYjMzQ7KSkge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDMwOlx0XHRpZiAoIWZsYWdzKSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MzE6XHRcdFx0cF9lcnIoXCYjMzQ7ZmxhZ3Mgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzOiAlc1wmIzM0OywgKmFyZ3YpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDMyOlx0XHRcdHJldHVybiAtMTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQzMzpcdFx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDM0OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDM1Olx0XHRpZiAoaXNfcHJlZml4KCphcmd2LCBcJiMzNDthbnlcJiMzNDspKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDM2Olx0XHRcdCpmbGFncyA9IEJQRl9BTlk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Mzc6XHRcdGVsc2UgaWYgKGlzX3ByZWZpeCgqYXJndiwgXCYjMzQ7bm9leGlzdFwmIzM0OykpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Mzg6XHRcdFx0KmZsYWdzID0gQlBGX05PRVhJU1Q7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Mzk6XHRcdGVsc2UgaWYgKGlzX3ByZWZpeCgqYXJndiwgXCYjMzQ7ZXhpc3RcJiMzNDspKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQwOlx0XHRcdCpmbGFncyA9IEJQRl9FWElTVDtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ0MTpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ0MjpcdFx0cmV0dXJuIHBhcnNlX2VsZW0oYXJndiAmIzQzOyAxLCBpbmZvLCBrZXksIHZhbHVlLCBrZXlfc2l6ZSxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ0MzpcdFx0XHRcdCAgdmFsdWVfc2l6ZSwgTlVMTCwgdmFsdWVfZmQsIG9wZW5fZmxhZ3MpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQ0Olx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQ1OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQ2Olx0cF9lcnIoXCYjMzQ7ZXhwZWN0ZWQga2V5IG9yIHZhbHVlLCBnb3Q6ICVzXCYjMzQ7LCAqYXJndik7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NDc6XHRyZXR1cm4gLTE7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NDg6fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQ5OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDUwOnN0YXRpYyB2b2lkIHNob3dfbWFwX2hlYWRlcl9qc29uKHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cilcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ1MTp7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTI6XHRjb25zdCBjaGFyICptYXBfdHlwZV9zdHI7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTM6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTQ6XHRqc29ud191aW50X2ZpZWxkKHd0ciwgXCYjMzQ7aWRcJiMzNDssIGluZm8tXHUwMDNlaWQpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDU1Olx0bWFwX3R5cGVfc3RyID0gbGliYnBmX2JwZl9tYXBfdHlwZV9zdHIoaW5mby1cdTAwM2V0eXBlKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ1NjpcdGlmIChtYXBfdHlwZV9zdHIpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTc6XHRcdGpzb253X3N0cmluZ19maWVsZCh3dHIsIFwmIzM0O3R5cGVcJiMzNDssIG1hcF90eXBlX3N0cik7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTg6XHRlbHNlXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTk6XHRcdGpzb253X3VpbnRfZmllbGQod3RyLCBcJiMzNDt0eXBlXCYjMzQ7LCBpbmZvLVx1MDAzZXR5cGUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDYwOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDYxOlx0aWYgKCppbmZvLVx1MDAzZW5hbWUpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NjI6XHRcdGpzb253X3N0cmluZ19maWVsZCh3dHIsIFwmIzM0O25hbWVcJiMzNDssIGluZm8tXHUwMDNlbmFtZSk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NjM6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NjQ6XHRqc29ud19uYW1lKHd0ciwgXCYjMzQ7ZmxhZ3NcJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDY1Olx0anNvbndfcHJpbnRmKHd0ciwgXCYjMzQ7JXVcJiMzNDssIGluZm8tXHUwMDNlbWFwX2ZsYWdzKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ2Njp9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Njc6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Njg6c3RhdGljIGludCBzaG93X21hcF9jbG9zZV9qc29uKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbylcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ2OTp7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NzA6XHRjaGFyICptZW1sb2NrLCAqZnJvemVuX3N0cjtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ3MTpcdGludCBmcm96ZW4gPSAwO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDcyOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDczOlx0bWVtbG9jayA9IGdldF9mZGluZm8oZmQsIFwmIzM0O21lbWxvY2tcJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDc0Olx0ZnJvemVuX3N0ciA9IGdldF9mZGluZm8oZmQsIFwmIzM0O2Zyb3plblwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NzU6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NzY6XHRqc29ud19zdGFydF9vYmplY3QoanNvbl93dHIpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDc3OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDc4Olx0c2hvd19tYXBfaGVhZGVyX2pzb24oaW5mbywganNvbl93dHIpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDc5OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDgwOlx0cHJpbnRfZGV2X2pzb24oaW5mby1cdTAwM2VpZmluZGV4LCBpbmZvLVx1MDAzZW5ldG5zX2RldiwgaW5mby1cdTAwM2VuZXRuc19pbm8pO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDgxOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDgyOlx0anNvbndfdWludF9maWVsZChqc29uX3d0ciwgXCYjMzQ7Ynl0ZXNfa2V5XCYjMzQ7LCBpbmZvLVx1MDAzZWtleV9zaXplKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ4MzpcdGpzb253X3VpbnRfZmllbGQoanNvbl93dHIsIFwmIzM0O2J5dGVzX3ZhbHVlXCYjMzQ7LCBpbmZvLVx1MDAzZXZhbHVlX3NpemUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDg0Olx0anNvbndfdWludF9maWVsZChqc29uX3d0ciwgXCYjMzQ7bWF4X2VudHJpZXNcJiMzNDssIGluZm8tXHUwMDNlbWF4X2VudHJpZXMpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDg1OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDg2Olx0aWYgKG1lbWxvY2spXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0ODc6XHRcdGpzb253X2ludF9maWVsZChqc29uX3d0ciwgXCYjMzQ7Ynl0ZXNfbWVtbG9ja1wmIzM0OywgYXRvbGwobWVtbG9jaykpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDg4Olx0ZnJlZShtZW1sb2NrKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ4OTpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5MDpcdGlmIChpbmZvLVx1MDAzZXR5cGUgPT0gQlBGX01BUF9UWVBFX1BST0dfQVJSQVkpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5MTpcdFx0Y2hhciAqb3duZXJfcHJvZ190eXBlID0gZ2V0X2ZkaW5mbyhmZCwgXCYjMzQ7b3duZXJfcHJvZ190eXBlXCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5MjpcdFx0Y2hhciAqb3duZXJfaml0ZWQgPSBnZXRfZmRpbmZvKGZkLCBcJiMzNDtvd25lcl9qaXRlZFwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OTM6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OTQ6XHRcdGlmIChvd25lcl9wcm9nX3R5cGUpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5NTpcdFx0XHR1bnNpZ25lZCBpbnQgcHJvZ190eXBlID0gYXRvaShvd25lcl9wcm9nX3R5cGUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDk2Olx0XHRcdGNvbnN0IGNoYXIgKnByb2dfdHlwZV9zdHI7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OTc6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OTg6XHRcdFx0cHJvZ190eXBlX3N0ciA9IGxpYmJwZl9icGZfcHJvZ190eXBlX3N0cihwcm9nX3R5cGUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDk5Olx0XHRcdGlmIChwcm9nX3R5cGVfc3RyKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTAwOlx0XHRcdFx0anNvbndfc3RyaW5nX2ZpZWxkKGpzb25fd3RyLCBcJiMzNDtvd25lcl9wcm9nX3R5cGVcJiMzNDssXG5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMDo1MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNDk1MwoJCQkJCQkJb3V0cHV0OiA4OQoJCQkJCQkJdGhvdWdodHM6IDQzNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiB0aGUgQlBGIFRvb2wgQ2hhbmdlcyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGVzZSBjaGFuZ2VzIGFyZSBpc29sYXRlZCB0byB0aGUgYGJwZnRvb2xgIHV0aWxpdHkgYW5kIHJlbGF0ZWQgdGVzdGluZyBpbmZyYXN0cnVjdHVyZS4gU3BlY2lmaWNhbGx5LCBJJiMzOTttIGxvb2tpbmcgYXQgbW9kaWZpY2F0aW9ucyB3aXRoaW46CgoxLiAgYHRvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0YAoyLiAgYHRvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sYAozLiAgYHRvb2xzL2JwZi9icGZ0b29sL21haW4uY2AKNC4gIGB0b29scy9icGYvYnBmdG9vbC9tYWluLmhgCjUuICBgdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNgCjYuICBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jYAoKQmFzZWQgb24gdGhlIGVzdGFibGlzaGVkIGd1aWRlbGluZXMsIHRoaXMgaXMgcHJldHR5IGNsZWFyLWN1dC4gVGhlIGNyaXRlcmlhIGZvciByZXR1cm5pbmcgYFdvcnRoRnV6emluZz1mYWxzZWAgaXMgbWV0IGJlY2F1c2UgYWxsIHRoZSBjaGFuZ2VzIGFyZSBjb25maW5lZCB0byB1c2VyLXNwYWNlIHV0aWxpdGllcyBhbmQgc2VsZi10ZXN0cyB3aXRoaW4gdGhlIGB0b29scy9gIGRpcmVjdG9yeS4gVGhleSBhcmUgKm5vdCogdG91Y2hpbmcgYW55dGhpbmcgdGhhdCBkaXJlY3RseSBhZmZlY3RzIHRoZSBrZXJuZWwgaW1hZ2UgKGB2bWxpbnV4YCkgb3IgYW55IGxvYWRhYmxlIGtlcm5lbCBtb2R1bGVzLiBUaGVzZSBhcmUgbW9kaWZpY2F0aW9ucyB0byB0aGUgYGJwZnRvb2xgIHV0aWxpdHkgaXRzZWxmIGFuZCB0aGUgYXNzb2NpYXRlZCBzZWxmLXRlc3RzLgoKVGhlcmVmb3JlLCB0aGUgZnV6emluZy13b3J0aGluZXNzIGlzIGxvdy4gSSB3aWxsIHNldCB0aGUgcGFyYW1ldGVycyBmb3IgYHNldC1yZXN1bHRzYCBhY2NvcmRpbmdseS4gSSB3aWxsIGVuc3VyZSB0aGF0OgoKKiAgIGBXb3J0aEZ1enppbmdgIGlzIHNldCB0byBgZmFsc2VgLgoqICAgYEZvY3VzU3ltYm9sc2AgaXMgc2V0IHRvIGFuIGVtcHR5L251bGwgbGlzdCAoIGBbXWAgKS4KKiAgIGBFbmFibGVDb25maWdzYCBpcyBhbHNvIHNldCB0byBhbiBlbXB0eS9udWxsIGxpc3QgKCBgW11gICkuCiogICBUaGUgYFJlYXNvbmluZ2Agc2hvdWxkIGV4cGxpY2l0bHkgc3RhdGUgdGhhdCB0aGUgY2hhbmdlcyBhcmUgaXNvbGF0ZWQgdG8gdXNlci1zcGFjZSBgYnBmdG9vbGAgdXRpbGl0eSBhbmQgc2VsZi10ZXN0cyBsb2NhdGVkIHdpdGhpbiB0aGUgYHRvb2xzL2AgZGlyZWN0b3J5LCBhbmQgdGhhdCB0aGVzZSBkbyBub3QgaW1wYWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2Ugb3IgcnVudGltZSBrZXJuZWwgY29kZS4gVGhpcyBzaG91bGQgYmUgdmVyeSBjbGVhciBhbmQgY29uY2lzZSB0byBwcmV2ZW50IGFueSBjb25mdXNpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDA6NTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXItc3BhY2UgY29kZSBpbiB0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLiBJdCBkb2VzIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMsIGFuZCBpcyB0aGVyZWZvcmUgbm90IHJlbGV2YW50IGZvciBzeXprYWxsZXIgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlci1zcGFjZSBjb2RlIGluIHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYuIEl0IGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcywgYW5kIGlzIHRoZXJlZm9yZSBub3QgcmVsZXZhbnQgZm9yIHN5emthbGxlciBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMDo1MzwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDdUMDA6NTM6MzEuNjE2MDE1MjkzWiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODE5NjgyMDY4OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlci1zcGFjZSBjb2RlIGluIHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYuIEl0IGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcywgYW5kIGlzIHRoZXJlZm9yZSBub3QgcmVsZXZhbnQgZm9yIHN5emthbGxlciBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDA6NTM6MzEuNjE2MDQ0MTgzWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NjMyNDMwMTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBiZGI1NmYzNDFmMjI3Mjc1YjI4ZDFhMTI2MTBiMWVhZDViNzI0NzAyXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gU2VwIDcgMDA6NTM6MzAgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLmMxMzUzMzg2MDBlOGYgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbkBAIC0xNiw3ICsxNiw3IEBAIFNZTk9QU0lTXFxuIFxcbiAqKmJwZnRvb2wqKiBbKk9QVElPTlMqXSAqKm1hcCoqICpDT01NQU5EKlxcbiBcXG4tKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8IHsgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IH1cXG4rKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8IHsgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IHwgeyAqKi1yKiogfCAqKi0tcmVjdXJzaXZlKiogfSB9XFxuIFxcbiAqQ09NTUFORFMqIDo9XFxuIHsgKipzaG93KiogfCAqKmxpc3QqKiB8ICoqY3JlYXRlKiogfCAqKmR1bXAqKiB8ICoqdXBkYXRlKiogfCAqKmxvb2t1cCoqIHwgKipnZXRuZXh0KiogfFxcbkBAIC0xNzAsNiArMTcwLDIzIEBAIE9QVElPTlNcXG4gICAgIERvIG5vdCBhdXRvbWF0aWNhbGx5IGF0dGVtcHQgdG8gbW91bnQgYW55IHZpcnR1YWwgZmlsZSBzeXN0ZW0gKHN1Y2ggYXNcXG4gICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LlxcbiBcXG4rLXIsIC0tcmVjdXJzaXZlXFxuKyAgICBBbHNvIGR1bXAgdGhlIGlubmVyIG1hcHMgcmVmZXJlbmNlZCBieSAqKmFycmF5X29mX21hcHMqKiBhbmQgKipoYXNoX29mX21hcHMqKlxcbisgICAgZW50cmllcyB3aGVuIHJ1bm5pbmcgKiptYXAgZHVtcCoqLiBFYWNoIG1hcCBpcyBkdW1wZWQgb25jZSwgZXZlbiBpZiBzZXZlcmFsXFxuKyAgICBlbnRyaWVzIHJlZmVyIHRvIGl0LiBTZWxlY3RlZCBtYXBzIGFyZSBmb2xsb3dlZCBieSB0aGVpciBpbm5lciBtYXBzLlxcbitcXG4rICAgIFBsYWluIG91dHB1dCBpbmNsdWRlcyBhIGhlYWRlciBpZGVudGlmeWluZyBlYWNoIG1hcC4gT24gc3VjY2VzcywgSlNPTiBvdXRwdXRcXG4rICAgIGlzIGFsd2F5cyBhbiBhcnJheSBvZiBtYXAgb2JqZWN0cywgZWFjaCBjb250YWluaW5nIGFuICoqaWQqKiBhbmQgYW5cXG4rICAgICoqZWxlbWVudHMqKiBhcnJheSwgaW5jbHVkaW5nIHdoZW4gb25seSBvbmUgbWFwIGlzIGR1bXBlZC4gT3V0ZXIgbWFwIGVudHJpZXNcXG4rICAgIHJldGFpbiB0aGVpciAqKmlubmVyX21hcF9pZCoqIGZpZWxkLCB3aGljaCBpZGVudGlmaWVzIHRoZSBjb3JyZXNwb25kaW5nIGlubmVyXFxuKyAgICBtYXAgb2JqZWN0LlxcbitcXG4rICAgIFRoZSBkdW1wIGlzIG5vdCBhIHNuYXBzaG90OiBjb25jdXJyZW50IHVwZGF0ZXMgY2FuIGNoYW5nZSBtYXAgY29udGVudHMuXFxuKyAgICBGYWlsdXJlIHRvIG9wZW4gYSByZWZlcmVuY2VkIGlubmVyIG1hcCBzdG9wcyB0aGUgZHVtcCBhbmQgcmV0dXJucyBhIG5vbnplcm9cXG4rICAgIGV4aXQgc3RhdHVzLiBPdXRwdXQgbWF5IGNvbnRhaW4gbWFwcyBvciBlbnRyaWVzIHByaW50ZWQgYmVmb3JlIHRoZSBlcnJvci5cXG4rICAgIEluIEpTT04gbW9kZSwgYW4gZXJyb3IgZHVyaW5nIHRyYXZlcnNhbCBpcyBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGFuZCB0aGVcXG4rICAgIGVuY2xvc2luZyBhcnJheXMgYW5kIG9iamVjdHMgYXJlIGNsb3NlZC5cXG4rXFxuIEVYQU1QTEVTXFxuID09PT09PT09XFxuICoqIyBicGZ0b29sIG1hcCBzaG93KipcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxcbmluZGV4IDc1Y2JjYjUxMmViYWUuLjQ1YzMzNmQ2M2JlMGEgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxcbkBAIC0yNjEsNyArMjYxLDcgQEAgX2JwZnRvb2woKVxcbiBcXG4gICAgICMgRGVhbCB3aXRoIG9wdGlvbnNcXG4gICAgIGlmIFtbICR7d29yZHNbY3dvcmRdfSA9PSAtKiBdXTsgdGhlblxcbi0gICAgICAgIGxvY2FsIGM9Jy0tdmVyc2lvbiAtLWpzb24gLS1wcmV0dHkgLS1icGZmcyAtLW1hcGNvbXBhdCAtLWRlYnVnIFxcXFxcXG4rICAgICAgICBsb2NhbCBjPSctLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tcmVjdXJzaXZlIC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcXFxcXFxuICAgICAgICAgICAgIC0tdXNlLWxvYWRlciAtLWJhc2UtYnRmIC0tc2lnbiAtaSAtaydcXG4gICAgICAgICBDT01QUkVQTFk9KCAkKCBjb21wZ2VuIC1XIFxcXCIkY1xcXCIgLS0gXFxcIiRjdXJcXFwiICkgKVxcbiAgICAgICAgIHJldHVybiAwXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xcbmluZGV4IGM5MWUxYTZlMWExZWMuLjI5MDIxZjRkZDQ1MTggMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jXFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jXFxuQEAgLTI2LDYgKzI2LDcgQEAgc3RhdGljIGludCAoKmxhc3RfZG9faGVscCkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTtcXG4ganNvbl93cml0ZXJfdCAqanNvbl93dHI7XFxuIGJvb2wgcHJldHR5X291dHB1dDtcXG4gYm9vbCBqc29uX291dHB1dDtcXG4rYm9vbCByZWN1cnNpdmU7XFxuIGJvb2wgc2hvd19waW5uZWQ7XFxuIGJvb2wgYmxvY2tfbW91bnQ7XFxuIGJvb2wgdmVyaWZpZXJfbG9ncztcXG5AQCAtNDUyLDYgKzQ1Myw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0XFx0eyBcXFwianNvblxcXCIsXFx0bm9fYXJndW1lbnQsXFx0TlVMTCxcXHQnaicgfSxcXG4gXFx0XFx0eyBcXFwiaGVscFxcXCIsXFx0bm9fYXJndW1lbnQsXFx0TlVMTCxcXHQnaCcgfSxcXG4gXFx0XFx0eyBcXFwicHJldHR5XFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdwJyB9LFxcbitcXHRcXHR7IFxcXCJyZWN1cnNpdmVcXFwiLFxcdG5vX2FyZ3VtZW50LFxcdE5VTEwsXFx0J3InIH0sXFxuIFxcdFxcdHsgXFxcInZlcnNpb25cXFwiLFxcdG5vX2FyZ3VtZW50LFxcdE5VTEwsXFx0J1YnIH0sXFxuIFxcdFxcdHsgXFxcImJwZmZzXFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdmJyB9LFxcbiBcXHRcXHR7IFxcXCJtYXBjb21wYXRcXFwiLFxcdG5vX2FyZ3VtZW50LFxcdE5VTEwsXFx0J20nIH0sXFxuQEAgLTQ4NSw3ICs0ODcsNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdGJpbl9uYW1lID0gXFxcImJwZnRvb2xcXFwiO1xcbiBcXG4gXFx0b3B0ZXJyID0gMDtcXG4tXFx0d2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBcXFwiVmhwamZMbW5kU2k6azpCOmxcXFwiLFxcbitcXHR3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIFxcXCJWaHBqcmZMbW5kU2k6azpCOmxcXFwiLFxcbiBcXHRcXHRcXHRcXHQgIG9wdGlvbnMsIE5VTEwpKSBcXHUwMDNlPSAwKSB7XFxuIFxcdFxcdHN3aXRjaCAob3B0KSB7XFxuIFxcdFxcdGNhc2UgJ1YnOlxcbkBAIC01MDcsNiArNTA5LDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHRcXHR9XFxuIFxcdFxcdFxcdGpzb253X3ByZXR0eShqc29uX3d0ciwgcHJldHR5X291dHB1dCk7XFxuIFxcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlICdyJzpcXG4rXFx0XFx0XFx0cmVjdXJzaXZlID0gdHJ1ZTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGNhc2UgJ2YnOlxcbiBcXHRcXHRcXHRzaG93X3Bpbm5lZCA9IHRydWU7XFxuIFxcdFxcdFxcdGJyZWFrO1xcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmggYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcXG5pbmRleCA3OGI2ZTBlYmI4NWQ4Li5iNWRjNzk2MGNmNjgyIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxcbkBAIC04Myw2ICs4Myw3IEBAIGV4dGVybiBjb25zdCBjaGFyICpiaW5fbmFtZTtcXG4gXFxuIGV4dGVybiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcXG4gZXh0ZXJuIGJvb2wganNvbl9vdXRwdXQ7XFxuK2V4dGVybiBib29sIHJlY3Vyc2l2ZTtcXG4gZXh0ZXJuIGJvb2wgc2hvd19waW5uZWQ7XFxuIGV4dGVybiBib29sIHNob3dfcGlkcztcXG4gZXh0ZXJuIGJvb2wgYmxvY2tfbW91bnQ7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcXG5pbmRleCA2ODRhOGZiNzI0MTQ2Li44NTNmNzc1YjdkNTI5IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcXG5AQCAtNzQ1LDggKzc0NSwxMCBAQCBzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxcbiBcXHRcXHRcXHQganNvbl93cml0ZXJfdCAqYnRmX3d0cilcXG4ge1xcbiBcXHRpZiAoYnBmX21hcF9sb29rdXBfZWxlbShmZCwga2V5LCB2YWx1ZSkpIHtcXG4tXFx0XFx0cHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgZXJybm8pO1xcbi1cXHRcXHRyZXR1cm4gLTE7XFxuK1xcdFxcdGludCBsb29rdXBfZXJybm8gPSBlcnJubztcXG4rXFxuK1xcdFxcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGxvb2t1cF9lcnJubyk7XFxuK1xcdFxcdHJldHVybiAtbG9va3VwX2Vycm5vO1xcbiBcXHR9XFxuIFxcbiBcXHRpZiAoanNvbl9vdXRwdXQpIHtcXG5AQCAtODI2LDEyICs4MjgsNTMgQEAgc3RhdGljIHZvaWQgZnJlZV9tYXBfa3ZfYnRmKHN0cnVjdCBidGYgKmJ0ZilcXG4gXFx0XFx0YnRmX19mcmVlKGJ0Zik7XFxuIH1cXG4gXFxuK3N0cnVjdCBtYXBfZHVtcF9jdHgge1xcbitcXHRzdHJ1Y3QgaGFzaG1hcCAqc2VlbjtcXG4rXFx0aW50ICoqZmRzO1xcbitcXHRpbnQgKm5iX2ZkcztcXG4rfTtcXG4rXFxuK3N0YXRpYyBpbnQgY29sbGVjdF9pbm5lcl9tYXAoc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4LCBfX3UzMiBpZClcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfZ2V0X2ZkX2J5X2lkX29wdHMsIG9wdHMsXFxuK1xcdFxcdC5vcGVuX2ZsYWdzID0gQlBGX0ZfUkRPTkxZLFxcbitcXHQpO1xcbitcXHRpbnQgKmZkcywgZmQsIGVycjtcXG4rXFxuK1xcdGlmIChoYXNobWFwX19maW5kKGN0eC1cXHUwMDNlc2VlbiwgaWQsIE5VTEwpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdGZkID0gYnBmX21hcF9nZXRfZmRfYnlfaWRfb3B0cyhpZCwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoZmQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdHBfZXJyKFxcXCJjYW4ndCBvcGVuIGlubmVyIG1hcCBpZCAldTogJXNcXFwiLCBpZCwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHR9XFxuK1xcbitcXHRmZHMgPSByZWFsbG9jKCpjdHgtXFx1MDAzZWZkcywgKCpjdHgtXFx1MDAzZW5iX2ZkcyArIDFVTEwpICogc2l6ZW9mKCpmZHMpKTtcXG4rXFx0aWYgKCFmZHMpIHtcXG4rXFx0XFx0cF9lcnIoXFxcIm1lbSBhbGxvYyBmYWlsZWRcXFwiKTtcXG4rXFx0XFx0Y2xvc2UoZmQpO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFx0KmN0eC1cXHUwMDNlZmRzID0gZmRzO1xcbitcXG4rXFx0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC1cXHUwMDNlc2VlbiwgaWQsIDApO1xcbitcXHRpZiAoZXJyKSB7XFxuK1xcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXNcXFwiLCBpZCwgc3RyZXJyb3IoLWVycikpO1xcbitcXHRcXHRjbG9zZShmZCk7XFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0fVxcbitcXHRmZHNbKCpjdHgtXFx1MDAzZW5iX2ZkcykrK10gPSBmZDtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuIHN0YXRpYyBpbnRcXG4gbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuLVxcdCBib29sIHNob3dfaGVhZGVyKVxcbitcXHQgYm9vbCBzaG93X2hlYWRlciwgc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4KVxcbiB7XFxuIFxcdHZvaWQgKmtleSwgKnZhbHVlLCAqcHJldl9rZXk7XFxuIFxcdHVuc2lnbmVkIGludCBudW1fZWxlbXMgPSAwO1xcbitcXHRqc29uX3dyaXRlcl90ICpwbGFpbl9idGZfd3RyID0gTlVMTDtcXG4gXFx0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcXG4gXFx0aW50IGVycjtcXG4gXFxuQEAgLTg0NSw2ICs4ODgsMTcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuIFxcbiBcXHRwcmV2X2tleSA9IE5VTEw7XFxuIFxcbitcXHRpZiAoY3R4IFxcdTAwMjZcXHUwMDI2ICF3dHIgXFx1MDAyNlxcdTAwMjYgKGluZm8tXFx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkIHx8XFxuK1xcdFxcdFxcdCAgICBpbmZvLVxcdTAwM2VidGZfdm1saW51eF92YWx1ZV90eXBlX2lkKSkge1xcbitcXHRcXHRwbGFpbl9idGZfd3RyID0gZ2V0X2J0Zl93cml0ZXIoKTtcXG4rXFx0XFx0aWYgKHBsYWluX2J0Zl93dHIpIHtcXG4rXFx0XFx0XFx0aWYgKHNob3dfaGVhZGVyKVxcbitcXHRcXHRcXHRcXHRzaG93X21hcF9oZWFkZXJfcGxhaW4oaW5mbyk7XFxuK1xcdFxcdFxcdHNob3dfaGVhZGVyID0gZmFsc2U7XFxuK1xcdFxcdFxcdHd0ciA9IHBsYWluX2J0Zl93dHI7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4gXFx0aWYgKHd0cikge1xcbiBcXHRcXHRlcnIgPSBnZXRfbWFwX2t2X2J0ZihpbmZvLCBcXHUwMDI2YnRmKTtcXG4gXFx0XFx0aWYgKGVycikge1xcbkBAIC04NzQsMTAgKzkyOCwyMiBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcXG4gXFx0XFx0aWYgKGVycikge1xcbiBcXHRcXHRcXHRpZiAoZXJybm8gPT0gRU5PRU5UKVxcbiBcXHRcXHRcXHRcXHRlcnIgPSAwO1xcbitcXHRcXHRcXHRlbHNlIGlmIChjdHgpXFxuK1xcdFxcdFxcdFxcdHBfZXJyKFxcXCJjYW4ndCBnZXQgbmV4dCBrZXkgZm9yIG1hcCBpZCAldTogJXNcXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICBpbmZvLVxcdTAwM2VpZCwgc3RyZXJyb3IoZXJybm8pKTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdH1cXG4tXFx0XFx0aWYgKCFkdW1wX21hcF9lbGVtKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cikpXFxuK1xcdFxcdGVyciA9IGR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTtcXG4rXFx0XFx0aWYgKCFlcnIpIHtcXG4gXFx0XFx0XFx0bnVtX2VsZW1zKys7XFxuK1xcdFxcdFxcdGlmIChjdHggXFx1MDAyNlxcdTAwMjYgbWFwX2lzX21hcF9vZl9tYXBzKGluZm8tXFx1MDAzZXR5cGUpKSB7XFxuK1xcdFxcdFxcdFxcdGVyciA9IGNvbGxlY3RfaW5uZXJfbWFwKGN0eCwgKihfX3UzMiAqKXZhbHVlKTtcXG4rXFx0XFx0XFx0XFx0aWYgKGVycilcXG4rXFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fSBlbHNlIGlmIChjdHggXFx1MDAyNlxcdTAwMjYgZXJyICE9IC1FTk9FTlQpIHtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4gXFx0XFx0cHJldl9rZXkgPSBrZXk7XFxuIFxcdH1cXG4gXFxuQEAgLTg5NCw2ICs5NjAsOCBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcXG4gXFx0ZnJlZShrZXkpO1xcbiBcXHRmcmVlKHZhbHVlKTtcXG4gXFx0ZnJlZV9tYXBfa3ZfYnRmKGJ0Zik7XFxuK1xcdGlmIChwbGFpbl9idGZfd3RyKVxcbitcXHRcXHRqc29ud19kZXN0cm95KFxcdTAwMjZwbGFpbl9idGZfd3RyKTtcXG4gXFxuIFxcdHJldHVybiBlcnI7XFxuIH1cXG5AQCAtOTAyLDYgKzk3MCw3IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIHtcXG4gXFx0anNvbl93cml0ZXJfdCAqd3RyID0gTlVMTCwgKmJ0Zl93dHIgPSBOVUxMO1xcbiBcXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcXG4rXFx0c3RydWN0IG1hcF9kdW1wX2N0eCBjdHggPSB7fTtcXG4gXFx0aW50IG5iX2ZkcywgaSA9IDA7XFxuIFxcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcXG4gXFx0aW50ICpmZHMgPSBOVUxMO1xcbkBAIC05MTksOSArOTg4LDM2IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdGlmIChuYl9mZHMgXFx1MDAzYyAxKVxcbiBcXHRcXHRnb3RvIGV4aXRfZnJlZTtcXG4gXFxuK1xcdGlmIChyZWN1cnNpdmUpIHtcXG4rXFx0XFx0Y3R4LnNlZW4gPSBoYXNobWFwX19uZXcoaGFzaF9mbl9mb3Jfa2V5X2FzX2lkLFxcbitcXHRcXHRcXHRcXHRcXHRlcXVhbF9mbl9mb3Jfa2V5X2FzX2lkLCBOVUxMKTtcXG4rXFx0XFx0aWYgKElTX0VSUihjdHguc2VlbikpIHtcXG4rXFx0XFx0XFx0Y3R4LnNlZW4gPSBOVUxMO1xcbitcXHRcXHRcXHRwX2VycihcXFwiZmFpbGVkIHRvIGNyZWF0ZSBoYXNobWFwIGZvciByZWN1cnNpdmUgZHVtcFxcXCIpO1xcbitcXHRcXHRcXHRnb3RvIGV4aXRfY2xvc2U7XFxuK1xcdFxcdH1cXG4rXFx0XFx0Y3R4LmZkcyA9IFxcdTAwMjZmZHM7XFxuK1xcdFxcdGN0eC5uYl9mZHMgPSBcXHUwMDI2bmJfZmRzO1xcbitcXHRcXHQvKiBSZWNvcmQgdGhlIHNlbGVjdGVkIG1hcHMgYmVmb3JlIGRpc2NvdmVyaW5nIGFueSBpbm5lciBtYXBzLiAqL1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbmJfZmRzOyBpKyspIHtcXG4rXFx0XFx0XFx0bGVuID0gc2l6ZW9mKGluZm8pO1xcbitcXHRcXHRcXHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFxcdTAwMjZpbmZvLCBcXHUwMDI2bGVuKSkge1xcbitcXHRcXHRcXHRcXHRwX2VycihcXFwiY2FuJ3QgZ2V0IG1hcCBpbmZvOiAlc1xcXCIsIHN0cmVycm9yKGVycm5vKSk7XFxuK1xcdFxcdFxcdFxcdGVyciA9IC0xO1xcbitcXHRcXHRcXHRcXHRnb3RvIGV4aXRfY2xvc2U7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC5zZWVuLCBpbmZvLmlkLCAwKTtcXG4rXFx0XFx0XFx0aWYgKGVycikge1xcbitcXHRcXHRcXHRcXHRwX2VycihcXFwiZmFpbGVkIHRvIHJlY29yZCBtYXAgaWQgJXU6ICVzXFxcIiwgaW5mby5pZCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgc3RyZXJyb3IoLWVycikpO1xcbitcXHRcXHRcXHRcXHRnb3RvIGV4aXRfY2xvc2U7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbiBcXHRpZiAoanNvbl9vdXRwdXQpIHtcXG4gXFx0XFx0d3RyID0ganNvbl93dHI7XFxuLVxcdH0gZWxzZSB7XFxuK1xcdH0gZWxzZSBpZiAoIXJlY3Vyc2l2ZSkge1xcbiBcXHRcXHRpbnQgZG9fcGxhaW5fYnRmO1xcbiBcXG4gXFx0XFx0ZG9fcGxhaW5fYnRmID0gbWFwc19oYXZlX2J0ZihmZHMsIG5iX2Zkcyk7XFxuQEAgLTkzNiw3ICsxMDMyLDcgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0XFx0fVxcbiBcXHR9XFxuIFxcbi1cXHRpZiAod3RyIFxcdTAwMjZcXHUwMDI2IG5iX2ZkcyBcXHUwMDNlIDEpXFxuK1xcdGlmICh3dHIgXFx1MDAyNlxcdTAwMjYgKG5iX2ZkcyBcXHUwMDNlIDEgfHwgcmVjdXJzaXZlKSlcXG4gXFx0XFx0anNvbndfc3RhcnRfYXJyYXkod3RyKTtcXHQvKiByb290IGFycmF5ICovXFxuIFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuYl9mZHM7IGkrKykge1xcbiBcXHRcXHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFxcdTAwMjZpbmZvLCBcXHUwMDI2bGVuKSkge1xcbkBAIC05NDQsMjIgKzEwNDAsMjggQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0XFx0XFx0ZXJyID0gLTE7XFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHR9XFxuLVxcdFxcdGVyciA9IG1hcF9kdW1wKGZkc1tpXSwgXFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFxcdTAwM2UgMSk7XFxuK1xcdFxcdGVyciA9IG1hcF9kdW1wKGZkc1tpXSwgXFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFxcdTAwM2UgMSB8fCByZWN1cnNpdmUsXFxuK1xcdFxcdFxcdCAgICAgICByZWN1cnNpdmUgPyBcXHUwMDI2Y3R4IDogTlVMTCk7XFxuIFxcdFxcdGlmICghd3RyIFxcdTAwMjZcXHUwMDI2IGkgIT0gbmJfZmRzIC0gMSlcXG4gXFx0XFx0XFx0cHJpbnRmKFxcXCJcXFxcblxcXCIpO1xcbiBcXG4gXFx0XFx0aWYgKGVycilcXG4gXFx0XFx0XFx0YnJlYWs7XFxuLVxcdFxcdGNsb3NlKGZkc1tpXSk7XFxuK1xcdFxcdC8qIEtlZXAgZGlzY292ZXJlZCBtYXBzIGFsaXZlIHVudGlsIHRoZSByZWN1cnNpdmUgZHVtcCBpcyBjb21wbGV0ZS4gKi9cXG4rXFx0XFx0aWYgKCFyZWN1cnNpdmUpXFxuK1xcdFxcdFxcdGNsb3NlKGZkc1tpXSk7XFxuIFxcdH1cXG4tXFx0aWYgKHd0ciBcXHUwMDI2XFx1MDAyNiBuYl9mZHMgXFx1MDAzZSAxKVxcbitcXHRpZiAod3RyIFxcdTAwMjZcXHUwMDI2IChuYl9mZHMgXFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZSkpXFxuIFxcdFxcdGpzb253X2VuZF9hcnJheSh3dHIpO1xcdC8qIHJvb3QgYXJyYXkgKi9cXG4gXFxuIFxcdGlmIChidGZfd3RyKVxcbiBcXHRcXHRqc29ud19kZXN0cm95KFxcdTAwMjZidGZfd3RyKTtcXG4gZXhpdF9jbG9zZTpcXG4rXFx0aWYgKHJlY3Vyc2l2ZSlcXG4rXFx0XFx0aSA9IDA7XFxuIFxcdGZvciAoOyBpIFxcdTAwM2MgbmJfZmRzOyBpKyspXFxuIFxcdFxcdGNsb3NlKGZkc1tpXSk7XFxuK1xcdGhhc2htYXBfX2ZyZWUoY3R4LnNlZW4pO1xcbiBleGl0X2ZyZWU6XFxuIFxcdGZyZWUoZmRzKTtcXG4gXFx0ZnJlZV9idGZfdm1saW51eCgpO1xcbkBAIC0xNDg0LDcgKzE1ODYsNyBAQCBzdGF0aWMgaW50IGRvX2hlbHAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHRcXFwiICAgICAgICAgICAgICAgICB0YXNrX3N0b3JhZ2UgfCBibG9vbV9maWx0ZXIgfCB1c2VyX3JpbmdidWYgfCBjZ3JwX3N0b3JhZ2UgfCBhcmVuYSB8XFxcXG5cXFwiXFxuIFxcdFxcdFxcXCIgICAgICAgICAgICAgICAgIGluc25fYXJyYXkgfCByaGFzaCB9XFxcXG5cXFwiXFxuIFxcdFxcdFxcXCIgICAgICAgXFxcIiBIRUxQX1NQRUNfT1BUSU9OUyBcXFwiIHxcXFxcblxcXCJcXG4tXFx0XFx0XFxcIiAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfVxcXFxuXFxcIlxcbitcXHRcXHRcXFwiICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB8IHstcnwtLXJlY3Vyc2l2ZX0gfVxcXFxuXFxcIlxcbiBcXHRcXHRcXFwiXFxcIixcXG4gXFx0XFx0YmluX25hbWUsIGFyZ3ZbLTJdKTtcXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uM2M0MjVkYmUyZDlkNFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmNcXG5AQCAtMCwwICsxLDI1MiBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGZ0b29sX2hlbHBlcnMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9idGYuaFxcdTAwM2VcXG4rXFxuKyNkZWZpbmUgT1VUUFVUX1NJWkUgODE5MlxcbitcXG4rc3RhdGljIGJvb2wgZHVtcF9tYXAoX191MzIgaWQsIGNvbnN0IGNoYXIgKm9wdGlvbnMsIGNoYXIgKm91dHB1dClcXG4re1xcbitcXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07XFxuK1xcbitcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCIlcyBtYXAgZHVtcCBpZCAldVxcXCIsIG9wdGlvbnMsIGlkKTtcXG4rXFx0bWVtc2V0KG91dHB1dCwgMCwgT1VUUFVUX1NJWkUpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFIC0gMSksXFxuK1xcdFxcdCAgICAgICBcXFwiZHVtcF9tYXBcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHQvKiBUaGUgaGVscGVyIGRvZXNuJ3QgdGVybWluYXRlIG9yIHN0cmlwIHRoZSBvdXRwdXQuICovXFxuK1xcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXFxcIlxcXFxuXFxcIildID0gJ1xcXFwwJztcXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuK3N0YXRpYyBfX3UzMiBtYXBfaWQoaW50IGZkKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xcbitcXHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcXHUwMDI2aW5mbywgXFx1MDAyNmxlbiksIFxcXCJtYXBfaW5mb1xcXCIpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0cmV0dXJuIGluZm8uaWQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgY291bnRfdG9rZW4oY29uc3QgY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICp0b2tlbilcXG4re1xcbitcXHRpbnQgY291bnQgPSAwO1xcbitcXG4rXFx0d2hpbGUgKChvdXRwdXQgPSBzdHJzdHIob3V0cHV0LCB0b2tlbikpKSB7XFxuK1xcdFxcdGNvdW50Kys7XFxuK1xcdFxcdG91dHB1dCArPSBzdHJsZW4odG9rZW4pO1xcbitcXHR9XFxuK1xcdHJldHVybiBjb3VudDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY2hlY2tfcGxhaW4oX191MzIgcm9vdF9pZCwgX191MzIgaW5uZXJfaWQsIGNvbnN0IGNoYXIgKnR5cGUsXFxuK1xcdFxcdFxcdGludCBlbnRyaWVzLCBib29sIHR5cGVkKVxcbit7XFxuK1xcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgaGVhZGVyWzEyOF07XFxuK1xcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9O1xcbitcXHRjb25zdCBjaGFyICpyb290LCAqaW5uZXI7XFxuK1xcbitcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCItLXJlY3Vyc2l2ZSBtYXAgZHVtcCBpZCAldVxcXCIsIHJvb3RfaWQpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksXFxuK1xcdFxcdCAgICAgICBcXFwicGxhaW5fZHVtcFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFxcXCIldTogJXMgIG5hbWUgZHVtcF9vdXRlciAgXFxcIiwgcm9vdF9pZCwgdHlwZSk7XFxuK1xcdHJvb3QgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIocm9vdCwgXFxcInBsYWluX3Jvb3RfaGVhZGVyXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0QVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsIFxcXCJwbGFpbl9yb290X2ZpcnN0XFxcIik7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFxcXCJpbm5lcl9tYXBfaWQ6XFxcIiksIGVudHJpZXMsIFxcXCJwbGFpbl9yZWZlcmVuY2VzXFxcIik7XFxuK1xcdGlmIChlbnRyaWVzKSB7XFxuK1xcdFxcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFxcXCIldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICBcXFwiLCBpbm5lcl9pZCk7XFxuK1xcdFxcdGlubmVyID0gc3Ryc3RyKG91dHB1dCwgaGVhZGVyKTtcXG4rXFx0XFx0aWYgKEFTU0VSVF9PS19QVFIoaW5uZXIsIFxcXCJwbGFpbl9pbm5lcl9oZWFkZXJcXFwiKSlcXG4rXFx0XFx0XFx0QVNTRVJUX0dUKGlubmVyIC0gcm9vdCwgMCwgXFxcInBsYWluX2lubmVyX2FmdGVyX3Jvb3RcXFwiKTtcXG4rXFx0XFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgaGVhZGVyKSwgMSwgXFxcInBsYWluX2lubmVyX29uY2VcXFwiKTtcXG4rXFx0fVxcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBcXFwiRm91bmQgXFxcIiksIGVudHJpZXMgXFx1MDAyNlxcdTAwMjYgIXR5cGVkID8gMiA6IDEsXFxuK1xcdFxcdCAgXFxcInBsYWluX21hcF9jb3VudFxcXCIpO1xcbitcXHRpZiAodHlwZWQpIHtcXG4rXFx0XFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBcXFwiXFxcXFxcXCJrZXlcXFxcXFxcIjogMFxcXCIsIFxcXCJwbGFpbl9idGZfa2V5XFxcIik7XFxuK1xcdFxcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgXFxcIlxcXFxcXFwidmFsdWVcXFxcXFxcIjogMTY4NDMwMDlcXFwiLCBcXFwicGxhaW5fYnRmX3ZhbHVlXFxcIik7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9vdXRlcihlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBpbnQgZW50cmllcywgYm9vbCBlbXB0eV9pbm5lcixcXG4rXFx0XFx0ICAgICAgIGJvb2wgdHlwZWQpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIGlubmVyX29wdHMpO1xcbitcXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xcbitcXHRjaGFyIG91dGVyW09VVFBVVF9TSVpFXSwgaW5uZXJbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdO1xcbitcXHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHJlZmVyZW5jZVs2NF07XFxuK1xcdGNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IGxpYmJwZl9icGZfbWFwX3R5cGVfc3RyKHR5cGUpO1xcbitcXHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMTtcXG4rXFx0X191MzIgcm9vdF9pZCwgaW5uZXJfaWQsIGtleSwgdmFsdWUgPSAweDAxMDEwMTAxO1xcbitcXG4rXFx0aWYgKHR5cGVkKSB7XFxuK1xcdFxcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFxcXCJjcmVhdGVfYnRmXFxcIikgfHxcXG4rXFx0XFx0ICAgICFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgXFxcInVuc2lnbmVkIGludFxcXCIsIDQsIDApLCAxLCBcXFwiYnRmX2ludFxcXCIpIHx8XFxuK1xcdFxcdCAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcXFwibG9hZF9idGZcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdGlubmVyX29wdHMuYnRmX2ZkID0gYnRmX19mZChidGYpO1xcbitcXHRcXHRpbm5lcl9vcHRzLmJ0Zl9rZXlfdHlwZV9pZCA9IDE7XFxuK1xcdFxcdGlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxO1xcbitcXHR9XFxuK1xcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFxcXCJkdW1wX2lubmVyXFxcIiwgc2l6ZW9mKGtleSksXFxuK1xcdFxcdFxcdFxcdCAgc2l6ZW9mKHZhbHVlKSwgMiwgXFx1MDAyNmlubmVyX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXFxcImNyZWF0ZV9pbm5lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0a2V5ID0gMDtcXG4rXFx0aWYgKCFlbXB0eV9pbm5lciBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGlubmVyX2ZkLCBcXHUwMDI2a2V5LCBcXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxcbitcXHRcXHQgICAgICAgXFxcInBvcHVsYXRlX2lubmVyXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkO1xcbitcXHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsIFxcXCJkdW1wX291dGVyXFxcIiwgc2l6ZW9mKGtleSksIHNpemVvZihfX3UzMiksXFxuK1xcdFxcdFxcdFxcdCAzLCBcXHUwMDI2b3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcXFwiY3JlYXRlX291dGVyXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHQvKiBUaGUgdW51c2VkIHRoaXJkIGFycmF5IHNsb3QgYWxzbyBleGVyY2lzZXMgZmFpbGVkIGxvb2t1cHMuICovXFxuK1xcdGZvciAoa2V5ID0gMDsga2V5IFxcdTAwM2MgZW50cmllczsga2V5KyspXFxuK1xcdFxcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFxcdTAwMjZrZXksIFxcdTAwMjZpbm5lcl9mZCwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicG9wdWxhdGVfb3V0ZXJcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xcbitcXHRpbm5lcl9pZCA9IG1hcF9pZChpbm5lcl9mZCk7XFxuK1xcdGlmICghcm9vdF9pZCB8fCAhaW5uZXJfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsIFxcXCItalxcXCIsIG91dGVyKSB8fFxcbitcXHQgICAgIWR1bXBfbWFwKGlubmVyX2lkLCBcXFwiLWpcXFwiLCBpbm5lcikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0QVNTRVJUX0VRKG91dGVyWzBdLCAnWycsIFxcXCJkZWZhdWx0X2FycmF5XFxcIik7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgXFxcIlxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjpcXFwiKSwgMCwgXFxcImRlZmF1bHRfbm9fd3JhcHBlclxcXCIpO1xcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFxcXCJcXFxcXFxcImlkXFxcXFxcXCI6XFxcIiksIDAsIFxcXCJkZWZhdWx0X25vX2hlYWRlclxcXCIpO1xcbitcXHRzbnByaW50ZihyZWZlcmVuY2UsIHNpemVvZihyZWZlcmVuY2UpLCBcXFwiXFxcXFxcXCJpbm5lcl9tYXBfaWRcXFxcXFxcIjoldVxcXCIsIGlubmVyX2lkKTtcXG4rXFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCByZWZlcmVuY2UpLCBlbnRyaWVzLCBcXFwiZGVmYXVsdF9yZWZlcmVuY2VzXFxcIik7XFxuK1xcdGlmICghZW50cmllcylcXG4rXFx0XFx0QVNTRVJUX1NUUkVRKG91dGVyLCBcXFwiW11cXFwiLCBcXFwiZW1wdHlfb3V0ZXJfZGVmYXVsdFxcXCIpO1xcbitcXHRpZiAoZW1wdHlfaW5uZXIpXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShpbm5lciwgXFxcIltdXFxcIiwgXFxcImVtcHR5X2lubmVyX2RlZmF1bHRcXFwiKTtcXG4rXFx0ZWxzZSBpZiAodHlwZWQpXFxuK1xcdFxcdEFTU0VSVF9IQVNfU1VCU1RSKGlubmVyLCBcXFwiXFxcXFxcXCJmb3JtYXR0ZWRcXFxcXFxcIjp7XFxcXFxcXCJrZXlcXFxcXFxcIjowLFxcXFxcXFwidmFsdWVcXFxcXFxcIjoxNjg0MzAwOX1cXFwiLFxcbitcXHRcXHRcXHRcXHQgIFxcXCJ0eXBlZF9pbm5lclxcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShpbm5lcixcXG4rXFx0XFx0XFx0ICAgICBcXFwiW3tcXFxcXFxcImtleVxcXFxcXFwiOltcXFxcXFxcIjB4MDBcXFxcXFxcIixcXFxcXFxcIjB4MDBcXFxcXFxcIixcXFxcXFxcIjB4MDBcXFxcXFxcIixcXFxcXFxcIjB4MDBcXFxcXFxcIl0sXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCJcXFxcXFxcInZhbHVlXFxcXFxcXCI6W1xcXFxcXFwiMHgwMVxcXFxcXFwiLFxcXFxcXFwiMHgwMVxcXFxcXFwiLFxcXFxcXFwiMHgwMVxcXFxcXFwiLFxcXFxcXFwiMHgwMVxcXFxcXFwiXX1dXFxcIixcXG4rXFx0XFx0XFx0ICAgICBcXFwib3JkaW5hcnlfZGVmYXVsdFxcXCIpO1xcbitcXG4rXFx0LyogQ29tcGFyZSB0aGUgY29tcGxldGUgSlNPTiBkb2N1bWVudDogYSBmbGF0IGFycmF5IHdpdGggdGhlIHJvb3QgZmlyc3QsXFxuK1xcdCAqIG9uZSBjb3B5IG9mIHRoZSBzaGFyZWQgaW5uZXIgbWFwLCBhbmQgdW5jaGFuZ2VkIGVudHJ5IHJlcHJlc2VudGF0aW9ucy5cXG4rXFx0ICovXFxuK1xcdGlmIChlbnRyaWVzKVxcbitcXHRcXHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcXG4rXFx0XFx0XFx0IFxcXCJbe1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFxcXFxcInR5cGVcXFxcXFxcIjpcXFxcXFxcIiVzXFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX291dGVyXFxcXFxcXCIsXFxcIlxcbitcXHRcXHRcXHQgXFxcIlxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc30se1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFxcXFxcInR5cGVcXFxcXFxcIjpcXFxcXFxcImhhc2hcXFxcXFxcIixcXFwiXFxuK1xcdFxcdFxcdCBcXFwiXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX2lubmVyXFxcXFxcXCIsXFxcXFxcXCJmbGFnc1xcXFxcXFwiOjAsXFxcXFxcXCJlbGVtZW50c1xcXFxcXFwiOiVzfV1cXFwiLFxcbitcXHRcXHRcXHQgcm9vdF9pZCwgdHlwZV9uYW1lLCBvdXRlciwgaW5uZXJfaWQsIGlubmVyKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcXG4rXFx0XFx0XFx0IFxcXCJbe1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFxcXFxcInR5cGVcXFxcXFxcIjpcXFxcXFxcIiVzXFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX291dGVyXFxcXFxcXCIsXFxcIlxcbitcXHRcXHRcXHQgXFxcIlxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjpbXX1dXFxcIiwgcm9vdF9pZCwgdHlwZV9uYW1lKTtcXG4rXFx0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFxcXCItaiAtclxcXCIsIG91dHB1dCkpXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcXFwicmVjdXJzaXZlX2pzb25cXFwiKTtcXG4rXFx0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFxcXCItLWpzb24gLS1yZWN1cnNpdmVcXFwiLCBvdXRwdXQpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcInJlY3Vyc2l2ZV9sb25nX29wdGlvbnNcXFwiKTtcXG4rXFx0Y2hlY2tfcGxhaW4ocm9vdF9pZCwgaW5uZXJfaWQsIHR5cGVfbmFtZSwgZW50cmllcywgdHlwZWQpO1xcbitcXG4rXFx0LyogUmVjdXJzaW9uIG9uIGFuIG9yZGluYXJ5IG1hcCBzdGlsbCBlbWl0cyBhIHNpbmdsZSBtYXAgb2JqZWN0LiAqL1xcbitcXHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcXG4rXFx0XFx0IFxcXCJbe1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFxcXFxcInR5cGVcXFxcXFxcIjpcXFxcXFxcImhhc2hcXFxcXFxcIixcXFxcXFxcIm5hbWVcXFxcXFxcIjpcXFxcXFxcImR1bXBfaW5uZXJcXFxcXFxcIixcXFwiXFxuK1xcdFxcdCBcXFwiXFxcXFxcXCJmbGFnc1xcXFxcXFwiOjAsXFxcXFxcXCJlbGVtZW50c1xcXFxcXFwiOiVzfV1cXFwiLCBpbm5lcl9pZCwgaW5uZXIpO1xcbitcXHRpZiAoZHVtcF9tYXAoaW5uZXJfaWQsIFxcXCItaiAtclxcXCIsIG91dHB1dCkpXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcXFwib3JkaW5hcnlfcmVjdXJzaXZlXFxcIik7XFxuK291dDpcXG4rXFx0aWYgKG91dGVyX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKG91dGVyX2ZkKTtcXG4rXFx0aWYgKGlubmVyX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKGlubmVyX2ZkKTtcXG4rXFx0YnRmX19mcmVlKGJ0Zik7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfbXVsdGlwbGVfcm9vdHModm9pZClcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcXG4rXFx0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBuYW1lW0JQRl9PQkpfTkFNRV9MRU5dO1xcbitcXHRjaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fSwgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiA0XSwgZWxlbWVudHNbT1VUUFVUX1NJWkVdO1xcbitcXHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHR5cGVzW10gPSB7IFxcXCJoYXNoXFxcIiwgXFxcImFycmF5X29mX21hcHNcXFwiLCBcXFwiaGFzaF9vZl9tYXBzXFxcIiwgXFxcImhhc2hcXFwiIH07XFxuK1xcdGludCBmZHNbXSA9IHsgLTEsIC0xLCAtMSwgLTEgfTtcXG4rXFx0X191MzIgaWRzWzRdLCBrZXk7XFxuK1xcdGludCBpLCBsZW4gPSAwO1xcbitcXG4rXFx0LyogU2VsZWN0IHRoZSBmaXJzdCBpbm5lciBtYXAgYW5kIGJvdGggb3V0ZXJzIGFzIHJvb3RzLiBUaGUgb3RoZXIgaW5uZXJcXG4rXFx0ICogbWFwIG11c3QgYmUgYXBwZW5kZWQgYWZ0ZXIgYWxsIHRocmVlIHJvb3RzLCBldmVuIHRob3VnaCBpdCBpcyBmb3VuZFxcbitcXHQgKiB3aGlsZSBkdW1waW5nIHRoZSBmaXJzdCBvdXRlci4gQSBwcm9jZXNzLXNwZWNpZmljIG5hbWUgYXZvaWRzIG90aGVyXFxuK1xcdCAqIHRlc3RzJyBtYXBzIGpvaW5pbmcgdGhlIHNlbGVjdGlvbi5cXG4rXFx0ICovXFxuK1xcdHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgXFxcImR1bXBfJXVcXFwiLCBnZXRwaWQoKSk7XFxuK1xcdGZkc1swXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBuYW1lLCA0LCA0LCAxLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzBdLCBcXFwiY3JlYXRlX3NlbGVjdGVkX2lubmVyXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmZHNbM10gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXFxcImR1bXBfZGlzY292ZXJlZFxcXCIsIDQsIDQsIDEsIE5VTEwpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbM10sIFxcXCJjcmVhdGVfZGlzY292ZXJlZF9pbm5lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0b3B0cy5pbm5lcl9tYXBfZmQgPSBmZHNbMF07XFxuK1xcdGZkc1sxXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBuYW1lLCA0LCA0LCAyLCBcXHUwMDI2b3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKGZkc1sxXSwgXFxcImNyZWF0ZV9hcnJheV9yb290XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmZHNbMl0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCBuYW1lLCA0LCA0LCAyLCBcXHUwMDI2b3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKGZkc1syXSwgXFxcImNyZWF0ZV9oYXNoX3Jvb3RcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGZvciAoaSA9IDE7IGkgXFx1MDAzYz0gMjsgaSsrKSB7XFxuK1xcdFxcdGtleSA9IDA7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCBcXHUwMDI2a2V5LCBcXHUwMDI2ZmRzWzBdLCBCUEZfQU5ZKSxcXG4rXFx0XFx0XFx0ICAgICAgIFxcXCJyZWZlcmVuY2Vfc2VsZWN0ZWRfaW5uZXJcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdGtleSA9IDE7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCBcXHUwMDI2a2V5LCBcXHUwMDI2ZmRzWzNdLCBCUEZfQU5ZKSxcXG4rXFx0XFx0XFx0ICAgICAgIFxcXCJyZWZlcmVuY2VfZGlzY292ZXJlZF9pbm5lclxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQVJSQVlfU0laRShmZHMpOyBpKyspIHtcXG4rXFx0XFx0aWRzW2ldID0gbWFwX2lkKGZkc1tpXSk7XFxuK1xcdFxcdGlmICghaWRzW2ldIHx8ICFkdW1wX21hcChpZHNbaV0sIFxcXCItalxcXCIsIGVsZW1lbnRzKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdGxlbiArPSBzbnByaW50ZihleHBlY3RlZCArIGxlbiwgc2l6ZW9mKGV4cGVjdGVkKSAtIGxlbixcXG4rXFx0XFx0XFx0XFx0XFxcIiVze1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFxcXFxcInR5cGVcXFxcXFxcIjpcXFxcXFxcIiVzXFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXCJcXG4rXFx0XFx0XFx0XFx0XFxcIlxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc30lc1xcXCIsXFxuK1xcdFxcdFxcdFxcdGkgPyBcXFwiLFxcXCIgOiBcXFwiW1xcXCIsIGlkc1tpXSwgdHlwZXNbaV0sXFxuK1xcdFxcdFxcdFxcdGkgPT0gMyA/IFxcXCJkdW1wX2Rpc2NvdmVyZWRcXFwiIDogbmFtZSwgZWxlbWVudHMsIGkgPT0gMyA/IFxcXCJdXFxcIiA6IFxcXCJcXFwiKTtcXG4rXFx0fVxcbitcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCItaiAtciBtYXAgZHVtcCBuYW1lICVzXFxcIiwgbmFtZSk7XFxuK1xcdGlmIChBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxcbitcXHRcXHQgICAgICBcXFwiZHVtcF9tdWx0aXBsZV9yb290c1xcXCIpKSB7XFxuK1xcdFxcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXFxcIlxcXFxuXFxcIildID0gJ1xcXFwwJztcXG4rXFx0XFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFxcXCJyb290c19maXJzdF9hbmRfc2VlZF9kZWR1cFxcXCIpO1xcbitcXHR9XFxuK291dDpcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEFSUkFZX1NJWkUoZmRzKTsgaSsrKVxcbitcXHRcXHRpZiAoZmRzW2ldIFxcdTAwM2U9IDApXFxuK1xcdFxcdFxcdGNsb3NlKGZkc1tpXSk7XFxuK31cXG4rXFxuK3ZvaWQgdGVzdF9icGZ0b29sX21hcF9kdW1wKHZvaWQpXFxuK3tcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcIm11bHRpcGxlX3Jvb3RzXFxcIikpXFxuK1xcdFxcdHRlc3RfbXVsdGlwbGVfcm9vdHMoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImFycmF5X29mX21hcHNcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMSwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImhhc2hfb2ZfbWFwc1xcXCIpKVxcbitcXHRcXHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJzaGFyZWRfaW5uZXJcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMiwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImVtcHR5X2FycmF5X29mX21hcHNcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMCwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImVtcHR5X2hhc2hfb2ZfbWFwc1xcXCIpKVxcbitcXHRcXHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJidGZfaW5uZXJcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgdHJ1ZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJlbXB0eV9pbm5lclxcXCIpKVxcbitcXHRcXHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIHRydWUsIGZhbHNlKTtcXG4rfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwMDo1MzozMi40ODA1MTYzMDZaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjczMzIyOTk5NTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlci1zcGFjZSBjb2RlIGluIHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYuIEl0IGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcywgYW5kIGlzIHRoZXJlZm9yZSBub3QgcmVsZXZhbnQgZm9yIHN5emthbGxlciBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBiZGI1NmYzNDFmMjI3Mjc1YjI4ZDFhMTI2MTBiMWVhZDViNzI0NzAyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAwMDo1MzozMCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLmMxMzUzMzg2MDBlOGYgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbkBAIC0xNiw3ICsxNiw3IEBAIFNZTk9QU0lTXG4gXG4gKipicGZ0b29sKiogWypPUFRJT05TKl0gKiptYXAqKiAqQ09NTUFORCpcbiBcbi0qT1BUSU9OUyogOj0geyB8Q09NTU9OX09QVElPTlN8IHwgeyAqKi1mKiogfCAqKi0tYnBmZnMqKiB9IHwgeyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfVxuKypPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfCB7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB8IHsgKiotcioqIHwgKiotLXJlY3Vyc2l2ZSoqIH0gfVxuIFxuICpDT01NQU5EUyogOj1cbiB7ICoqc2hvdyoqIHwgKipsaXN0KiogfCAqKmNyZWF0ZSoqIHwgKipkdW1wKiogfCAqKnVwZGF0ZSoqIHwgKipsb29rdXAqKiB8ICoqZ2V0bmV4dCoqIHxcbkBAIC0xNzAsNiArMTcwLDIzIEBAIE9QVElPTlNcbiAgICAgRG8gbm90IGF1dG9tYXRpY2FsbHkgYXR0ZW1wdCB0byBtb3VudCBhbnkgdmlydHVhbCBmaWxlIHN5c3RlbSAoc3VjaCBhc1xuICAgICB0cmFjZWZzIG9yIEJQRiB2aXJ0dWFsIGZpbGUgc3lzdGVtKSB3aGVuIG5lY2Vzc2FyeS5cbiBcbistciwgLS1yZWN1cnNpdmVcbisgICAgQWxzbyBkdW1wIHRoZSBpbm5lciBtYXBzIHJlZmVyZW5jZWQgYnkgKiphcnJheV9vZl9tYXBzKiogYW5kICoqaGFzaF9vZl9tYXBzKipcbisgICAgZW50cmllcyB3aGVuIHJ1bm5pbmcgKiptYXAgZHVtcCoqLiBFYWNoIG1hcCBpcyBkdW1wZWQgb25jZSwgZXZlbiBpZiBzZXZlcmFsXG4rICAgIGVudHJpZXMgcmVmZXIgdG8gaXQuIFNlbGVjdGVkIG1hcHMgYXJlIGZvbGxvd2VkIGJ5IHRoZWlyIGlubmVyIG1hcHMuXG4rXG4rICAgIFBsYWluIG91dHB1dCBpbmNsdWRlcyBhIGhlYWRlciBpZGVudGlmeWluZyBlYWNoIG1hcC4gT24gc3VjY2VzcywgSlNPTiBvdXRwdXRcbisgICAgaXMgYWx3YXlzIGFuIGFycmF5IG9mIG1hcCBvYmplY3RzLCBlYWNoIGNvbnRhaW5pbmcgYW4gKippZCoqIGFuZCBhblxuKyAgICAqKmVsZW1lbnRzKiogYXJyYXksIGluY2x1ZGluZyB3aGVuIG9ubHkgb25lIG1hcCBpcyBkdW1wZWQuIE91dGVyIG1hcCBlbnRyaWVzXG4rICAgIHJldGFpbiB0aGVpciAqKmlubmVyX21hcF9pZCoqIGZpZWxkLCB3aGljaCBpZGVudGlmaWVzIHRoZSBjb3JyZXNwb25kaW5nIGlubmVyXG4rICAgIG1hcCBvYmplY3QuXG4rXG4rICAgIFRoZSBkdW1wIGlzIG5vdCBhIHNuYXBzaG90OiBjb25jdXJyZW50IHVwZGF0ZXMgY2FuIGNoYW5nZSBtYXAgY29udGVudHMuXG4rICAgIEZhaWx1cmUgdG8gb3BlbiBhIHJlZmVyZW5jZWQgaW5uZXIgbWFwIHN0b3BzIHRoZSBkdW1wIGFuZCByZXR1cm5zIGEgbm9uemVyb1xuKyAgICBleGl0IHN0YXR1cy4gT3V0cHV0IG1heSBjb250YWluIG1hcHMgb3IgZW50cmllcyBwcmludGVkIGJlZm9yZSB0aGUgZXJyb3IuXG4rICAgIEluIEpTT04gbW9kZSwgYW4gZXJyb3IgZHVyaW5nIHRyYXZlcnNhbCBpcyBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGFuZCB0aGVcbisgICAgZW5jbG9zaW5nIGFycmF5cyBhbmQgb2JqZWN0cyBhcmUgY2xvc2VkLlxuK1xuIEVYQU1QTEVTXG4gPT09PT09PT1cbiAqKiMgYnBmdG9vbCBtYXAgc2hvdyoqXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxuaW5kZXggNzVjYmNiNTEyZWJhZS4uNDVjMzM2ZDYzYmUwYSAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxuQEAgLTI2MSw3ICsyNjEsNyBAQCBfYnBmdG9vbCgpXG4gXG4gICAgICMgRGVhbCB3aXRoIG9wdGlvbnNcbiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuXG4tICAgICAgICBsb2NhbCBjPSctLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcXFxuKyAgICAgICAgbG9jYWwgYz0nLS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLXJlY3Vyc2l2ZSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcbiAgICAgICAgICAgICAtLXVzZS1sb2FkZXIgLS1iYXNlLWJ0ZiAtLXNpZ24gLWkgLWsnXG4gICAgICAgICBDT01QUkVQTFk9KCAkKCBjb21wZ2VuIC1XIFwiJGNcIiAtLSBcIiRjdXJcIiApIClcbiAgICAgICAgIHJldHVybiAwXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jXG5pbmRleCBjOTFlMWE2ZTFhMWVjLi4yOTAyMWY0ZGQ0NTE4IDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbkBAIC0yNiw2ICsyNiw3IEBAIHN0YXRpYyBpbnQgKCpsYXN0X2RvX2hlbHApKGludCBhcmdjLCBjaGFyICoqYXJndik7XG4ganNvbl93cml0ZXJfdCAqanNvbl93dHI7XG4gYm9vbCBwcmV0dHlfb3V0cHV0O1xuIGJvb2wganNvbl9vdXRwdXQ7XG4rYm9vbCByZWN1cnNpdmU7XG4gYm9vbCBzaG93X3Bpbm5lZDtcbiBib29sIGJsb2NrX21vdW50O1xuIGJvb2wgdmVyaWZpZXJfbG9ncztcbkBAIC00NTIsNiArNDUzLDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR7IFwianNvblwiLFx0bm9fYXJndW1lbnQsXHROVUxMLFx0J2onIH0sXG4gXHRcdHsgXCJoZWxwXCIsXHRub19hcmd1bWVudCxcdE5VTEwsXHQnaCcgfSxcbiBcdFx0eyBcInByZXR0eVwiLFx0bm9fYXJndW1lbnQsXHROVUxMLFx0J3AnIH0sXG4rXHRcdHsgXCJyZWN1cnNpdmVcIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdyJyB9LFxuIFx0XHR7IFwidmVyc2lvblwiLFx0bm9fYXJndW1lbnQsXHROVUxMLFx0J1YnIH0sXG4gXHRcdHsgXCJicGZmc1wiLFx0bm9fYXJndW1lbnQsXHROVUxMLFx0J2YnIH0sXG4gXHRcdHsgXCJtYXBjb21wYXRcIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdtJyB9LFxuQEAgLTQ4NSw3ICs0ODcsNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRiaW5fbmFtZSA9IFwiYnBmdG9vbFwiO1xuIFxuIFx0b3B0ZXJyID0gMDtcbi1cdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXCJWaHBqZkxtbmRTaTprOkI6bFwiLFxuK1x0d2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBcIlZocGpyZkxtbmRTaTprOkI6bFwiLFxuIFx0XHRcdFx0ICBvcHRpb25zLCBOVUxMKSkgXHUwMDNlPSAwKSB7XG4gXHRcdHN3aXRjaCAob3B0KSB7XG4gXHRcdGNhc2UgJ1YnOlxuQEAgLTUwNyw2ICs1MDksOSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdFx0fVxuIFx0XHRcdGpzb253X3ByZXR0eShqc29uX3d0ciwgcHJldHR5X291dHB1dCk7XG4gXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgJ3InOlxuK1x0XHRcdHJlY3Vyc2l2ZSA9IHRydWU7XG4rXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJ2YnOlxuIFx0XHRcdHNob3dfcGlubmVkID0gdHJ1ZTtcbiBcdFx0XHRicmVhaztcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmggYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbmluZGV4IDc4YjZlMGViYjg1ZDguLmI1ZGM3OTYwY2Y2ODIgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxuQEAgLTgzLDYgKzgzLDcgQEAgZXh0ZXJuIGNvbnN0IGNoYXIgKmJpbl9uYW1lO1xuIFxuIGV4dGVybiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcbiBleHRlcm4gYm9vbCBqc29uX291dHB1dDtcbitleHRlcm4gYm9vbCByZWN1cnNpdmU7XG4gZXh0ZXJuIGJvb2wgc2hvd19waW5uZWQ7XG4gZXh0ZXJuIGJvb2wgc2hvd19waWRzO1xuIGV4dGVybiBib29sIGJsb2NrX21vdW50O1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbmluZGV4IDY4NGE4ZmI3MjQxNDYuLjg1M2Y3NzViN2Q1MjkgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbkBAIC03NDUsOCArNzQ1LDEwIEBAIHN0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4gXHRcdFx0IGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXG4ge1xuIFx0aWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7XG4tXHRcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGVycm5vKTtcbi1cdFx0cmV0dXJuIC0xO1xuK1x0XHRpbnQgbG9va3VwX2Vycm5vID0gZXJybm87XG4rXG4rXHRcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGxvb2t1cF9lcnJubyk7XG4rXHRcdHJldHVybiAtbG9va3VwX2Vycm5vO1xuIFx0fVxuIFxuIFx0aWYgKGpzb25fb3V0cHV0KSB7XG5AQCAtODI2LDEyICs4MjgsNTMgQEAgc3RhdGljIHZvaWQgZnJlZV9tYXBfa3ZfYnRmKHN0cnVjdCBidGYgKmJ0ZilcbiBcdFx0YnRmX19mcmVlKGJ0Zik7XG4gfVxuIFxuK3N0cnVjdCBtYXBfZHVtcF9jdHgge1xuK1x0c3RydWN0IGhhc2htYXAgKnNlZW47XG4rXHRpbnQgKipmZHM7XG4rXHRpbnQgKm5iX2Zkcztcbit9O1xuK1xuK3N0YXRpYyBpbnQgY29sbGVjdF9pbm5lcl9tYXAoc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4LCBfX3UzMiBpZClcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfZ2V0X2ZkX2J5X2lkX29wdHMsIG9wdHMsXG4rXHRcdC5vcGVuX2ZsYWdzID0gQlBGX0ZfUkRPTkxZLFxuK1x0KTtcbitcdGludCAqZmRzLCBmZCwgZXJyO1xuK1xuK1x0aWYgKGhhc2htYXBfX2ZpbmQoY3R4LVx1MDAzZXNlZW4sIGlkLCBOVUxMKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRmZCA9IGJwZl9tYXBfZ2V0X2ZkX2J5X2lkX29wdHMoaWQsIFx1MDAyNm9wdHMpO1xuK1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4rXHRcdHBfZXJyKFwiY2FuJ3Qgb3BlbiBpbm5lciBtYXAgaWQgJXU6ICVzXCIsIGlkLCBzdHJlcnJvcihlcnJubykpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXG4rXHRmZHMgPSByZWFsbG9jKCpjdHgtXHUwMDNlZmRzLCAoKmN0eC1cdTAwM2VuYl9mZHMgKyAxVUxMKSAqIHNpemVvZigqZmRzKSk7XG4rXHRpZiAoIWZkcykge1xuK1x0XHRwX2VycihcIm1lbSBhbGxvYyBmYWlsZWRcIik7XG4rXHRcdGNsb3NlKGZkKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1x0KmN0eC1cdTAwM2VmZHMgPSBmZHM7XG4rXG4rXHRlcnIgPSBoYXNobWFwX19hZGQoY3R4LVx1MDAzZXNlZW4sIGlkLCAwKTtcbitcdGlmIChlcnIpIHtcbitcdFx0cF9lcnIoXCJmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXNcIiwgaWQsIHN0cmVycm9yKC1lcnIpKTtcbitcdFx0Y2xvc2UoZmQpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXHRmZHNbKCpjdHgtXHUwMDNlbmJfZmRzKSsrXSA9IGZkO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuIHN0YXRpYyBpbnRcbiBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbi1cdCBib29sIHNob3dfaGVhZGVyKVxuK1x0IGJvb2wgc2hvd19oZWFkZXIsIHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eClcbiB7XG4gXHR2b2lkICprZXksICp2YWx1ZSwgKnByZXZfa2V5O1xuIFx0dW5zaWduZWQgaW50IG51bV9lbGVtcyA9IDA7XG4rXHRqc29uX3dyaXRlcl90ICpwbGFpbl9idGZfd3RyID0gTlVMTDtcbiBcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4gXHRpbnQgZXJyO1xuIFxuQEAgLTg0NSw2ICs4ODgsMTcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXG4gXHRwcmV2X2tleSA9IE5VTEw7XG4gXG4rXHRpZiAoY3R4IFx1MDAyNlx1MDAyNiAhd3RyIFx1MDAyNlx1MDAyNiAoaW5mby1cdTAwM2VidGZfdmFsdWVfdHlwZV9pZCB8fFxuK1x0XHRcdCAgICBpbmZvLVx1MDAzZWJ0Zl92bWxpbnV4X3ZhbHVlX3R5cGVfaWQpKSB7XG4rXHRcdHBsYWluX2J0Zl93dHIgPSBnZXRfYnRmX3dyaXRlcigpO1xuK1x0XHRpZiAocGxhaW5fYnRmX3d0cikge1xuK1x0XHRcdGlmIChzaG93X2hlYWRlcilcbitcdFx0XHRcdHNob3dfbWFwX2hlYWRlcl9wbGFpbihpbmZvKTtcbitcdFx0XHRzaG93X2hlYWRlciA9IGZhbHNlO1xuK1x0XHRcdHd0ciA9IHBsYWluX2J0Zl93dHI7XG4rXHRcdH1cbitcdH1cbitcbiBcdGlmICh3dHIpIHtcbiBcdFx0ZXJyID0gZ2V0X21hcF9rdl9idGYoaW5mbywgXHUwMDI2YnRmKTtcbiBcdFx0aWYgKGVycikge1xuQEAgLTg3NCwxMCArOTI4LDIyIEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0XHRpZiAoZXJyKSB7XG4gXHRcdFx0aWYgKGVycm5vID09IEVOT0VOVClcbiBcdFx0XHRcdGVyciA9IDA7XG4rXHRcdFx0ZWxzZSBpZiAoY3R4KVxuK1x0XHRcdFx0cF9lcnIoXCJjYW4ndCBnZXQgbmV4dCBrZXkgZm9yIG1hcCBpZCAldTogJXNcIixcbitcdFx0XHRcdCAgICAgIGluZm8tXHUwMDNlaWQsIHN0cmVycm9yKGVycm5vKSk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbi1cdFx0aWYgKCFkdW1wX21hcF9lbGVtKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cikpXG4rXHRcdGVyciA9IGR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTtcbitcdFx0aWYgKCFlcnIpIHtcbiBcdFx0XHRudW1fZWxlbXMrKztcbitcdFx0XHRpZiAoY3R4IFx1MDAyNlx1MDAyNiBtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cdTAwM2V0eXBlKSkge1xuK1x0XHRcdFx0ZXJyID0gY29sbGVjdF9pbm5lcl9tYXAoY3R4LCAqKF9fdTMyICopdmFsdWUpO1xuK1x0XHRcdFx0aWYgKGVycilcbitcdFx0XHRcdFx0YnJlYWs7XG4rXHRcdFx0fVxuK1x0XHR9IGVsc2UgaWYgKGN0eCBcdTAwMjZcdTAwMjYgZXJyICE9IC1FTk9FTlQpIHtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuIFx0XHRwcmV2X2tleSA9IGtleTtcbiBcdH1cbiBcbkBAIC04OTQsNiArOTYwLDggQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXHRmcmVlKGtleSk7XG4gXHRmcmVlKHZhbHVlKTtcbiBcdGZyZWVfbWFwX2t2X2J0ZihidGYpO1xuK1x0aWYgKHBsYWluX2J0Zl93dHIpXG4rXHRcdGpzb253X2Rlc3Ryb3koXHUwMDI2cGxhaW5fYnRmX3d0cik7XG4gXG4gXHRyZXR1cm4gZXJyO1xuIH1cbkBAIC05MDIsNiArOTcwLDcgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiB7XG4gXHRqc29uX3dyaXRlcl90ICp3dHIgPSBOVUxMLCAqYnRmX3d0ciA9IE5VTEw7XG4gXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbitcdHN0cnVjdCBtYXBfZHVtcF9jdHggY3R4ID0ge307XG4gXHRpbnQgbmJfZmRzLCBpID0gMDtcbiBcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbiBcdGludCAqZmRzID0gTlVMTDtcbkBAIC05MTksOSArOTg4LDM2IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRpZiAobmJfZmRzIFx1MDAzYyAxKVxuIFx0XHRnb3RvIGV4aXRfZnJlZTtcbiBcbitcdGlmIChyZWN1cnNpdmUpIHtcbitcdFx0Y3R4LnNlZW4gPSBoYXNobWFwX19uZXcoaGFzaF9mbl9mb3Jfa2V5X2FzX2lkLFxuK1x0XHRcdFx0XHRlcXVhbF9mbl9mb3Jfa2V5X2FzX2lkLCBOVUxMKTtcbitcdFx0aWYgKElTX0VSUihjdHguc2VlbikpIHtcbitcdFx0XHRjdHguc2VlbiA9IE5VTEw7XG4rXHRcdFx0cF9lcnIoXCJmYWlsZWQgdG8gY3JlYXRlIGhhc2htYXAgZm9yIHJlY3Vyc2l2ZSBkdW1wXCIpO1xuK1x0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbitcdFx0fVxuK1x0XHRjdHguZmRzID0gXHUwMDI2ZmRzO1xuK1x0XHRjdHgubmJfZmRzID0gXHUwMDI2bmJfZmRzO1xuK1x0XHQvKiBSZWNvcmQgdGhlIHNlbGVjdGVkIG1hcHMgYmVmb3JlIGRpc2NvdmVyaW5nIGFueSBpbm5lciBtYXBzLiAqL1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYl9mZHM7IGkrKykge1xuK1x0XHRcdGxlbiA9IHNpemVvZihpbmZvKTtcbitcdFx0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFx1MDAyNmluZm8sIFx1MDAyNmxlbikpIHtcbitcdFx0XHRcdHBfZXJyKFwiY2FuJ3QgZ2V0IG1hcCBpbmZvOiAlc1wiLCBzdHJlcnJvcihlcnJubykpO1xuK1x0XHRcdFx0ZXJyID0gLTE7XG4rXHRcdFx0XHRnb3RvIGV4aXRfY2xvc2U7XG4rXHRcdFx0fVxuK1x0XHRcdGVyciA9IGhhc2htYXBfX2FkZChjdHguc2VlbiwgaW5mby5pZCwgMCk7XG4rXHRcdFx0aWYgKGVycikge1xuK1x0XHRcdFx0cF9lcnIoXCJmYWlsZWQgdG8gcmVjb3JkIG1hcCBpZCAldTogJXNcIiwgaW5mby5pZCxcbitcdFx0XHRcdCAgICAgIHN0cmVycm9yKC1lcnIpKTtcbitcdFx0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbitcdFx0XHR9XG4rXHRcdH1cbitcdH1cbitcbiBcdGlmIChqc29uX291dHB1dCkge1xuIFx0XHR3dHIgPSBqc29uX3d0cjtcbi1cdH0gZWxzZSB7XG4rXHR9IGVsc2UgaWYgKCFyZWN1cnNpdmUpIHtcbiBcdFx0aW50IGRvX3BsYWluX2J0ZjtcbiBcbiBcdFx0ZG9fcGxhaW5fYnRmID0gbWFwc19oYXZlX2J0ZihmZHMsIG5iX2Zkcyk7XG5AQCAtOTM2LDcgKzEwMzIsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR9XG4gXHR9XG4gXG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4rXHRpZiAod3RyIFx1MDAyNlx1MDAyNiAobmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZSkpXG4gXHRcdGpzb253X3N0YXJ0X2FycmF5KHd0cik7XHQvKiByb290IGFycmF5ICovXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYl9mZHM7IGkrKykge1xuIFx0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFx1MDAyNmluZm8sIFx1MDAyNmxlbikpIHtcbkBAIC05NDQsMjIgKzEwNDAsMjggQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHRlcnIgPSAtMTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuLVx0XHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFx1MDAzZSAxKTtcbitcdFx0ZXJyID0gbWFwX2R1bXAoZmRzW2ldLCBcdTAwMjZpbmZvLCB3dHIsIG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmUsXG4rXHRcdFx0ICAgICAgIHJlY3Vyc2l2ZSA/IFx1MDAyNmN0eCA6IE5VTEwpO1xuIFx0XHRpZiAoIXd0ciBcdTAwMjZcdTAwMjYgaSAhPSBuYl9mZHMgLSAxKVxuIFx0XHRcdHByaW50ZihcIlxcblwiKTtcbiBcbiBcdFx0aWYgKGVycilcbiBcdFx0XHRicmVhaztcbi1cdFx0Y2xvc2UoZmRzW2ldKTtcbitcdFx0LyogS2VlcCBkaXNjb3ZlcmVkIG1hcHMgYWxpdmUgdW50aWwgdGhlIHJlY3Vyc2l2ZSBkdW1wIGlzIGNvbXBsZXRlLiAqL1xuK1x0XHRpZiAoIXJlY3Vyc2l2ZSlcbitcdFx0XHRjbG9zZShmZHNbaV0pO1xuIFx0fVxuLVx0aWYgKHd0ciBcdTAwMjZcdTAwMjYgbmJfZmRzIFx1MDAzZSAxKVxuK1x0aWYgKHd0ciBcdTAwMjZcdTAwMjYgKG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmUpKVxuIFx0XHRqc29ud19lbmRfYXJyYXkod3RyKTtcdC8qIHJvb3QgYXJyYXkgKi9cbiBcbiBcdGlmIChidGZfd3RyKVxuIFx0XHRqc29ud19kZXN0cm95KFx1MDAyNmJ0Zl93dHIpO1xuIGV4aXRfY2xvc2U6XG4rXHRpZiAocmVjdXJzaXZlKVxuK1x0XHRpID0gMDtcbiBcdGZvciAoOyBpIFx1MDAzYyBuYl9mZHM7IGkrKylcbiBcdFx0Y2xvc2UoZmRzW2ldKTtcbitcdGhhc2htYXBfX2ZyZWUoY3R4LnNlZW4pO1xuIGV4aXRfZnJlZTpcbiBcdGZyZWUoZmRzKTtcbiBcdGZyZWVfYnRmX3ZtbGludXgoKTtcbkBAIC0xNDg0LDcgKzE1ODYsNyBAQCBzdGF0aWMgaW50IGRvX2hlbHAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRcIiAgICAgICAgICAgICAgICAgdGFza19zdG9yYWdlIHwgYmxvb21fZmlsdGVyIHwgdXNlcl9yaW5nYnVmIHwgY2dycF9zdG9yYWdlIHwgYXJlbmEgfFxcblwiXG4gXHRcdFwiICAgICAgICAgICAgICAgICBpbnNuX2FycmF5IHwgcmhhc2ggfVxcblwiXG4gXHRcdFwiICAgICAgIFwiIEhFTFBfU1BFQ19PUFRJT05TIFwiIHxcXG5cIlxuLVx0XHRcIiAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfVxcblwiXG4rXHRcdFwiICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB8IHstcnwtLXJlY3Vyc2l2ZX0gfVxcblwiXG4gXHRcdFwiXCIsXG4gXHRcdGJpbl9uYW1lLCBhcmd2Wy0yXSk7XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uM2M0MjVkYmUyZDlkNFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jXG5AQCAtMCwwICsxLDI1MiBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbisjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGZ0b29sX2hlbHBlcnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuK1xuKyNkZWZpbmUgT1VUUFVUX1NJWkUgODE5MlxuK1xuK3N0YXRpYyBib29sIGR1bXBfbWFwKF9fdTMyIGlkLCBjb25zdCBjaGFyICpvcHRpb25zLCBjaGFyICpvdXRwdXQpXG4re1xuK1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dO1xuK1xuK1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcIiVzIG1hcCBkdW1wIGlkICV1XCIsIG9wdGlvbnMsIGlkKTtcbitcdG1lbXNldChvdXRwdXQsIDAsIE9VVFBVVF9TSVpFKTtcbitcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUgLSAxKSxcbitcdFx0ICAgICAgIFwiZHVtcF9tYXBcIikpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdC8qIFRoZSBoZWxwZXIgZG9lc24ndCB0ZXJtaW5hdGUgb3Igc3RyaXAgdGhlIG91dHB1dC4gKi9cbitcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXCJcXG5cIildID0gJ1xcMCc7XG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rc3RhdGljIF9fdTMyIG1hcF9pZChpbnQgZmQpXG4re1xuK1x0c3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307XG4rXHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XG4rXG4rXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcdTAwMjZpbmZvLCBcdTAwMjZsZW4pLCBcIm1hcF9pbmZvXCIpKVxuK1x0XHRyZXR1cm4gMDtcbitcdHJldHVybiBpbmZvLmlkO1xuK31cbitcbitzdGF0aWMgaW50IGNvdW50X3Rva2VuKGNvbnN0IGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqdG9rZW4pXG4re1xuK1x0aW50IGNvdW50ID0gMDtcbitcbitcdHdoaWxlICgob3V0cHV0ID0gc3Ryc3RyKG91dHB1dCwgdG9rZW4pKSkge1xuK1x0XHRjb3VudCsrO1xuK1x0XHRvdXRwdXQgKz0gc3RybGVuKHRva2VuKTtcbitcdH1cbitcdHJldHVybiBjb3VudDtcbit9XG4rXG4rc3RhdGljIHZvaWQgY2hlY2tfcGxhaW4oX191MzIgcm9vdF9pZCwgX191MzIgaW5uZXJfaWQsIGNvbnN0IGNoYXIgKnR5cGUsXG4rXHRcdFx0aW50IGVudHJpZXMsIGJvb2wgdHlwZWQpXG4re1xuK1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBoZWFkZXJbMTI4XTtcbitcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9O1xuK1x0Y29uc3QgY2hhciAqcm9vdCwgKmlubmVyO1xuK1xuK1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcIi0tcmVjdXJzaXZlIG1hcCBkdW1wIGlkICV1XCIsIHJvb3RfaWQpO1xuK1x0aWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxuK1x0XHQgICAgICAgXCJwbGFpbl9kdW1wXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCBcIiV1OiAlcyAgbmFtZSBkdW1wX291dGVyICBcIiwgcm9vdF9pZCwgdHlwZSk7XG4rXHRyb290ID0gc3Ryc3RyKG91dHB1dCwgaGVhZGVyKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihyb290LCBcInBsYWluX3Jvb3RfaGVhZGVyXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRBU1NFUlRfRVEocm9vdCAtIG91dHB1dCwgMCwgXCJwbGFpbl9yb290X2ZpcnN0XCIpO1xuK1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXCJpbm5lcl9tYXBfaWQ6XCIpLCBlbnRyaWVzLCBcInBsYWluX3JlZmVyZW5jZXNcIik7XG4rXHRpZiAoZW50cmllcykge1xuK1x0XHRzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCBcIiV1OiBoYXNoICBuYW1lIGR1bXBfaW5uZXIgIFwiLCBpbm5lcl9pZCk7XG4rXHRcdGlubmVyID0gc3Ryc3RyKG91dHB1dCwgaGVhZGVyKTtcbitcdFx0aWYgKEFTU0VSVF9PS19QVFIoaW5uZXIsIFwicGxhaW5faW5uZXJfaGVhZGVyXCIpKVxuK1x0XHRcdEFTU0VSVF9HVChpbm5lciAtIHJvb3QsIDAsIFwicGxhaW5faW5uZXJfYWZ0ZXJfcm9vdFwiKTtcbitcdFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgaGVhZGVyKSwgMSwgXCJwbGFpbl9pbm5lcl9vbmNlXCIpO1xuK1x0fVxuK1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXCJGb3VuZCBcIiksIGVudHJpZXMgXHUwMDI2XHUwMDI2ICF0eXBlZCA/IDIgOiAxLFxuK1x0XHQgIFwicGxhaW5fbWFwX2NvdW50XCIpO1xuK1x0aWYgKHR5cGVkKSB7XG4rXHRcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgXCJcXFwia2V5XFxcIjogMFwiLCBcInBsYWluX2J0Zl9rZXlcIik7XG4rXHRcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgXCJcXFwidmFsdWVcXFwiOiAxNjg0MzAwOVwiLCBcInBsYWluX2J0Zl92YWx1ZVwiKTtcbitcdH1cbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9vdXRlcihlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBpbnQgZW50cmllcywgYm9vbCBlbXB0eV9pbm5lcixcbitcdFx0ICAgICAgIGJvb2wgdHlwZWQpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4rXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBpbm5lcl9vcHRzKTtcbitcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4rXHRjaGFyIG91dGVyW09VVFBVVF9TSVpFXSwgaW5uZXJbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdO1xuK1x0Y2hhciBleHBlY3RlZFtPVVRQVVRfU0laRSAqIDNdLCByZWZlcmVuY2VbNjRdO1xuK1x0Y29uc3QgY2hhciAqdHlwZV9uYW1lID0gbGliYnBmX2JwZl9tYXBfdHlwZV9zdHIodHlwZSk7XG4rXHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMTtcbitcdF9fdTMyIHJvb3RfaWQsIGlubmVyX2lkLCBrZXksIHZhbHVlID0gMHgwMTAxMDEwMTtcbitcbitcdGlmICh0eXBlZCkge1xuK1x0XHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xuK1x0XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcImNyZWF0ZV9idGZcIikgfHxcbitcdFx0ICAgICFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgXCJ1bnNpZ25lZCBpbnRcIiwgNCwgMCksIDEsIFwiYnRmX2ludFwiKSB8fFxuK1x0XHQgICAgIUFTU0VSVF9PSyhidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKSwgXCJsb2FkX2J0ZlwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0aW5uZXJfb3B0cy5idGZfZmQgPSBidGZfX2ZkKGJ0Zik7XG4rXHRcdGlubmVyX29wdHMuYnRmX2tleV90eXBlX2lkID0gMTtcbitcdFx0aW5uZXJfb3B0cy5idGZfdmFsdWVfdHlwZV9pZCA9IDE7XG4rXHR9XG4rXHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcImR1bXBfaW5uZXJcIiwgc2l6ZW9mKGtleSksXG4rXHRcdFx0XHQgIHNpemVvZih2YWx1ZSksIDIsIFx1MDAyNmlubmVyX29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFwiY3JlYXRlX2lubmVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGtleSA9IDA7XG4rXHRpZiAoIWVtcHR5X2lubmVyIFx1MDAyNlx1MDAyNlxuK1x0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShpbm5lcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZ2YWx1ZSwgQlBGX0FOWSksXG4rXHRcdCAgICAgICBcInBvcHVsYXRlX2lubmVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XG4rXHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsIFwiZHVtcF9vdXRlclwiLCBzaXplb2Yoa2V5KSwgc2l6ZW9mKF9fdTMyKSxcbitcdFx0XHRcdCAzLCBcdTAwMjZvcHRzKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcImNyZWF0ZV9vdXRlclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHQvKiBUaGUgdW51c2VkIHRoaXJkIGFycmF5IHNsb3QgYWxzbyBleGVyY2lzZXMgZmFpbGVkIGxvb2t1cHMuICovXG4rXHRmb3IgKGtleSA9IDA7IGtleSBcdTAwM2MgZW50cmllczsga2V5KyspXG4rXHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxuK1x0XHRcdCAgICAgICBcInBvcHVsYXRlX291dGVyXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0cm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7XG4rXHRpbm5lcl9pZCA9IG1hcF9pZChpbm5lcl9mZCk7XG4rXHRpZiAoIXJvb3RfaWQgfHwgIWlubmVyX2lkIHx8ICFkdW1wX21hcChyb290X2lkLCBcIi1qXCIsIG91dGVyKSB8fFxuK1x0ICAgICFkdW1wX21hcChpbm5lcl9pZCwgXCItalwiLCBpbm5lcikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0QVNTRVJUX0VRKG91dGVyWzBdLCAnWycsIFwiZGVmYXVsdF9hcnJheVwiKTtcbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgXCJcXFwiZWxlbWVudHNcXFwiOlwiKSwgMCwgXCJkZWZhdWx0X25vX3dyYXBwZXJcIik7XG4rXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFwiXFxcImlkXFxcIjpcIiksIDAsIFwiZGVmYXVsdF9ub19oZWFkZXJcIik7XG4rXHRzbnByaW50ZihyZWZlcmVuY2UsIHNpemVvZihyZWZlcmVuY2UpLCBcIlxcXCJpbm5lcl9tYXBfaWRcXFwiOiV1XCIsIGlubmVyX2lkKTtcbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgcmVmZXJlbmNlKSwgZW50cmllcywgXCJkZWZhdWx0X3JlZmVyZW5jZXNcIik7XG4rXHRpZiAoIWVudHJpZXMpXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRlciwgXCJbXVwiLCBcImVtcHR5X291dGVyX2RlZmF1bHRcIik7XG4rXHRpZiAoZW1wdHlfaW5uZXIpXG4rXHRcdEFTU0VSVF9TVFJFUShpbm5lciwgXCJbXVwiLCBcImVtcHR5X2lubmVyX2RlZmF1bHRcIik7XG4rXHRlbHNlIGlmICh0eXBlZClcbitcdFx0QVNTRVJUX0hBU19TVUJTVFIoaW5uZXIsIFwiXFxcImZvcm1hdHRlZFxcXCI6e1xcXCJrZXlcXFwiOjAsXFxcInZhbHVlXFxcIjoxNjg0MzAwOX1cIixcbitcdFx0XHRcdCAgXCJ0eXBlZF9pbm5lclwiKTtcbitcdGVsc2VcbitcdFx0QVNTRVJUX1NUUkVRKGlubmVyLFxuK1x0XHRcdCAgICAgXCJbe1xcXCJrZXlcXFwiOltcXFwiMHgwMFxcXCIsXFxcIjB4MDBcXFwiLFxcXCIweDAwXFxcIixcXFwiMHgwMFxcXCJdLFwiXG4rXHRcdFx0ICAgICBcIlxcXCJ2YWx1ZVxcXCI6W1xcXCIweDAxXFxcIixcXFwiMHgwMVxcXCIsXFxcIjB4MDFcXFwiLFxcXCIweDAxXFxcIl19XVwiLFxuK1x0XHRcdCAgICAgXCJvcmRpbmFyeV9kZWZhdWx0XCIpO1xuK1xuK1x0LyogQ29tcGFyZSB0aGUgY29tcGxldGUgSlNPTiBkb2N1bWVudDogYSBmbGF0IGFycmF5IHdpdGggdGhlIHJvb3QgZmlyc3QsXG4rXHQgKiBvbmUgY29weSBvZiB0aGUgc2hhcmVkIGlubmVyIG1hcCwgYW5kIHVuY2hhbmdlZCBlbnRyeSByZXByZXNlbnRhdGlvbnMuXG4rXHQgKi9cbitcdGlmIChlbnRyaWVzKVxuK1x0XHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbitcdFx0XHQgXCJbe1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCIlc1xcXCIsXFxcIm5hbWVcXFwiOlxcXCJkdW1wX291dGVyXFxcIixcIlxuK1x0XHRcdCBcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfSx7XFxcImlkXFxcIjoldSxcXFwidHlwZVxcXCI6XFxcImhhc2hcXFwiLFwiXG4rXHRcdFx0IFwiXFxcIm5hbWVcXFwiOlxcXCJkdW1wX2lubmVyXFxcIixcXFwiZmxhZ3NcXFwiOjAsXFxcImVsZW1lbnRzXFxcIjolc31dXCIsXG4rXHRcdFx0IHJvb3RfaWQsIHR5cGVfbmFtZSwgb3V0ZXIsIGlubmVyX2lkLCBpbm5lcik7XG4rXHRlbHNlXG4rXHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuK1x0XHRcdCBcIlt7XFxcImlkXFxcIjoldSxcXFwidHlwZVxcXCI6XFxcIiVzXFxcIixcXFwibmFtZVxcXCI6XFxcImR1bXBfb3V0ZXJcXFwiLFwiXG4rXHRcdFx0IFwiXFxcImZsYWdzXFxcIjowLFxcXCJlbGVtZW50c1xcXCI6W119XVwiLCByb290X2lkLCB0eXBlX25hbWUpO1xuK1x0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFwiLWogLXJcIiwgb3V0cHV0KSlcbitcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwicmVjdXJzaXZlX2pzb25cIik7XG4rXHRpZiAoZHVtcF9tYXAocm9vdF9pZCwgXCItLWpzb24gLS1yZWN1cnNpdmVcIiwgb3V0cHV0KSlcbitcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwicmVjdXJzaXZlX2xvbmdfb3B0aW9uc1wiKTtcbitcdGNoZWNrX3BsYWluKHJvb3RfaWQsIGlubmVyX2lkLCB0eXBlX25hbWUsIGVudHJpZXMsIHR5cGVkKTtcbitcbitcdC8qIFJlY3Vyc2lvbiBvbiBhbiBvcmRpbmFyeSBtYXAgc3RpbGwgZW1pdHMgYSBzaW5nbGUgbWFwIG9iamVjdC4gKi9cbitcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuK1x0XHQgXCJbe1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCJoYXNoXFxcIixcXFwibmFtZVxcXCI6XFxcImR1bXBfaW5uZXJcXFwiLFwiXG4rXHRcdCBcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfV1cIiwgaW5uZXJfaWQsIGlubmVyKTtcbitcdGlmIChkdW1wX21hcChpbm5lcl9pZCwgXCItaiAtclwiLCBvdXRwdXQpKVxuK1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCJvcmRpbmFyeV9yZWN1cnNpdmVcIik7XG4rb3V0OlxuK1x0aWYgKG91dGVyX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2Uob3V0ZXJfZmQpO1xuK1x0aWYgKGlubmVyX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoaW5uZXJfZmQpO1xuK1x0YnRmX19mcmVlKGJ0Zik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfbXVsdGlwbGVfcm9vdHModm9pZClcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbitcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgbmFtZVtCUEZfT0JKX05BTUVfTEVOXTtcbitcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9LCBleHBlY3RlZFtPVVRQVVRfU0laRSAqIDRdLCBlbGVtZW50c1tPVVRQVVRfU0laRV07XG4rXHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHR5cGVzW10gPSB7IFwiaGFzaFwiLCBcImFycmF5X29mX21hcHNcIiwgXCJoYXNoX29mX21hcHNcIiwgXCJoYXNoXCIgfTtcbitcdGludCBmZHNbXSA9IHsgLTEsIC0xLCAtMSwgLTEgfTtcbitcdF9fdTMyIGlkc1s0XSwga2V5O1xuK1x0aW50IGksIGxlbiA9IDA7XG4rXG4rXHQvKiBTZWxlY3QgdGhlIGZpcnN0IGlubmVyIG1hcCBhbmQgYm90aCBvdXRlcnMgYXMgcm9vdHMuIFRoZSBvdGhlciBpbm5lclxuK1x0ICogbWFwIG11c3QgYmUgYXBwZW5kZWQgYWZ0ZXIgYWxsIHRocmVlIHJvb3RzLCBldmVuIHRob3VnaCBpdCBpcyBmb3VuZFxuK1x0ICogd2hpbGUgZHVtcGluZyB0aGUgZmlyc3Qgb3V0ZXIuIEEgcHJvY2Vzcy1zcGVjaWZpYyBuYW1lIGF2b2lkcyBvdGhlclxuK1x0ICogdGVzdHMnIG1hcHMgam9pbmluZyB0aGUgc2VsZWN0aW9uLlxuK1x0ICovXG4rXHRzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksIFwiZHVtcF8ldVwiLCBnZXRwaWQoKSk7XG4rXHRmZHNbMF0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgbmFtZSwgNCwgNCwgMSwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMF0sIFwiY3JlYXRlX3NlbGVjdGVkX2lubmVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGZkc1szXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcImR1bXBfZGlzY292ZXJlZFwiLCA0LCA0LCAxLCBOVUxMKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGZkc1szXSwgXCJjcmVhdGVfZGlzY292ZXJlZF9pbm5lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRvcHRzLmlubmVyX21hcF9mZCA9IGZkc1swXTtcbitcdGZkc1sxXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBuYW1lLCA0LCA0LCAyLCBcdTAwMjZvcHRzKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGZkc1sxXSwgXCJjcmVhdGVfYXJyYXlfcm9vdFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmZHNbMl0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCBuYW1lLCA0LCA0LCAyLCBcdTAwMjZvcHRzKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGZkc1syXSwgXCJjcmVhdGVfaGFzaF9yb290XCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGZvciAoaSA9IDE7IGkgXHUwMDNjPSAyOyBpKyspIHtcbitcdFx0a2V5ID0gMDtcbitcdFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZHNbaV0sIFx1MDAyNmtleSwgXHUwMDI2ZmRzWzBdLCBCUEZfQU5ZKSxcbitcdFx0XHQgICAgICAgXCJyZWZlcmVuY2Vfc2VsZWN0ZWRfaW5uZXJcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGtleSA9IDE7XG4rXHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCBcdTAwMjZrZXksIFx1MDAyNmZkc1szXSwgQlBGX0FOWSksXG4rXHRcdFx0ICAgICAgIFwicmVmZXJlbmNlX2Rpc2NvdmVyZWRfaW5uZXJcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGZkcyk7IGkrKykge1xuK1x0XHRpZHNbaV0gPSBtYXBfaWQoZmRzW2ldKTtcbitcdFx0aWYgKCFpZHNbaV0gfHwgIWR1bXBfbWFwKGlkc1tpXSwgXCItalwiLCBlbGVtZW50cykpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGxlbiArPSBzbnByaW50ZihleHBlY3RlZCArIGxlbiwgc2l6ZW9mKGV4cGVjdGVkKSAtIGxlbixcbitcdFx0XHRcdFwiJXN7XFxcImlkXFxcIjoldSxcXFwidHlwZVxcXCI6XFxcIiVzXFxcIixcXFwibmFtZVxcXCI6XFxcIiVzXFxcIixcIlxuK1x0XHRcdFx0XCJcXFwiZmxhZ3NcXFwiOjAsXFxcImVsZW1lbnRzXFxcIjolc30lc1wiLFxuK1x0XHRcdFx0aSA/IFwiLFwiIDogXCJbXCIsIGlkc1tpXSwgdHlwZXNbaV0sXG4rXHRcdFx0XHRpID09IDMgPyBcImR1bXBfZGlzY292ZXJlZFwiIDogbmFtZSwgZWxlbWVudHMsIGkgPT0gMyA/IFwiXVwiIDogXCJcIik7XG4rXHR9XG4rXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwiLWogLXIgbWFwIGR1bXAgbmFtZSAlc1wiLCBuYW1lKTtcbitcdGlmIChBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxuK1x0XHQgICAgICBcImR1bXBfbXVsdGlwbGVfcm9vdHNcIikpIHtcbitcdFx0b3V0cHV0W3N0cmNzcG4ob3V0cHV0LCBcIlxcblwiKV0gPSAnXFwwJztcbitcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwicm9vdHNfZmlyc3RfYW5kX3NlZWRfZGVkdXBcIik7XG4rXHR9XG4rb3V0OlxuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShmZHMpOyBpKyspXG4rXHRcdGlmIChmZHNbaV0gXHUwMDNlPSAwKVxuK1x0XHRcdGNsb3NlKGZkc1tpXSk7XG4rfVxuK1xuK3ZvaWQgdGVzdF9icGZ0b29sX21hcF9kdW1wKHZvaWQpXG4re1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtdWx0aXBsZV9yb290c1wiKSlcbitcdFx0dGVzdF9tdWx0aXBsZV9yb290cygpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJhcnJheV9vZl9tYXBzXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJoYXNoX29mX21hcHNcIikpXG4rXHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwic2hhcmVkX2lubmVyXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAyLCBmYWxzZSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJlbXB0eV9hcnJheV9vZl9tYXBzXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJlbXB0eV9oYXNoX29mX21hcHNcIikpXG4rXHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMCwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiYnRmX2lubmVyXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCB0cnVlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiZW1wdHlfaW5uZXJcIikpXG4rXHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgdHJ1ZSwgZmFsc2UpO1xuK31cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDAwOjUzOjMyLjQ4MDUyMDU1NloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjM1NDkwMjkxNTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBQYXRjaDogV29ydGhGdXp6aW5nPWZhbHNlPyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhlIGluc3RydWN0aW9ucyBhcmUgY2xlYXI6IHRoZSBjaGFuZ2VzIGFyZSAqYWxyZWFkeSogaW4gbXkgd29ya3NwYWNlIGFzIHRoZSBIRUFEIGNvbW1pdC4gTXkgdGFzayBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCB3YXJyYW50cyBmdXp6aW5nIG9yIGlmIGl0IGNhbiBiZSBzYWZlbHkgaWdub3JlZCAoaS5lLiwgYFdvcnRoRnV6emluZz1mYWxzZWApLiBTZWN0aW9uIDIgZGljdGF0ZXMgd2hlbiB3ZSBjYW4gYnlwYXNzIGZ1enppbmcuIFRoZSBrZXkgY3JpdGVyaWEgZm9yIGBXb3J0aEZ1enppbmc9ZmFsc2VgIGFyZSBub24ta2VybmVsLCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzIHRoYXQgZG9uJ3QgaW1wYWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UuIFRoaXMgaW5jbHVkZXMgZG9jdW1lbnRhdGlvbiwgY29tbWVudHMsIHVzZXItc3BhY2UgdG9vbHMsIGJ1aWxkIHN5c3RlbSBjaGFuZ2VzIHRoYXQgZG9uJ3QgYWx0ZXIgdGhlIEMgbG9naWMsIHVucmVhY2hhYmxlIGhhcmR3YXJlLCBhbmQgdW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzLlxuXG5Ob3csIGxldCdzIGxvb2sgYXQgdGhlIGRpZmYuIEkgc2VlIHRoZSBtb2RpZmllZCBmaWxlcyBhcmUgYWxsIGxvY2F0ZWQgaW4gYHRvb2xzL2AsIHNwZWNpZmljYWxseSB3aXRoaW4gYHRvb2xzL2JwZi9icGZ0b29sL2AgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYC4gTm90aGluZyBqdW1wcyBvdXQgYXMga2VybmVsLWxldmVsIGNvZGUuICBXZSBoYXZlIGRvY3VtZW50YXRpb24gKGBicGZ0b29sLW1hcC5yc3RgKSwgc2hlbGwgY29tcGxldGlvbiBzY3JpcHRzIChgYnBmdG9vbGAgd2l0aGluIGBiYXNoLWNvbXBsZXRpb25gKSwgdGhlIG1haW4gc291cmNlIGZpbGVzIChgbWFpbi5jYCwgYG1haW4uaGAsIGFuZCBgbWFwLmNgKSwgYW5kIGEgc2VsZnRlc3QgKGBicGZ0b29sX21hcF9kdW1wLmNgKS4gSXQncyBhbGwgQlBGIHRvb2xpbmcsIHdoaWNoIGNvbmZpcm1zIG15IGluaXRpYWwgaW1wcmVzc2lvbi4gTm9uZSBvZiB0aGVzZSBmaWxlcyBkaXJlY3RseSBtb2RpZnkga2VybmVsIGNvZGUgb3IgdGhlIGtlcm5lbCBpbWFnZSBpdHNlbGYgKGB2bWxpbnV4YCkgb3Iga2VybmVsIG1vZHVsZXMuXG5cbkp1c3QgdG8gYmUgYWJzb2x1dGVseSBzdXJlLCBJJ2xsIHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoYXQgdGhpcyBIRUFEIGNvbW1pdCAqb25seSogY29udGFpbnMgdGhlc2UgZmlsZXM7IG5vIHNuZWFreSBrZXJuZWwgY29kZSBjcmVlcGVkIGluLiBCYXJyaW5nIHRoYXQsIEknbSBjb25maWRlbnQgaW4gY2xhc3NpZnlpbmcgdGhpcyBhcyBgV29ydGhGdXp6aW5nPWZhbHNlYC4gVGhpcyBwYXRjaCBpcyBzYWZlIHRvIGlnbm9yZSBpbiB0ZXJtcyBvZiBmdXp6aW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDg2OSwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM3MiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDAwOjUzOjM2LjAyOTU1MzAyN1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDEyNjc3NjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiLipcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwidG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiXFxuRnVsbCBvdXRwdXQgaXMgdG9vIGxvbmcsIHNob3dpbmcgNTAwIG91dCBvZiAxNjIwIGxpbmVzLlxcblVzZSBtb3JlIHByZWNpc2UgZXhwcmVzc2lvbiBpZiBwb3NzaWJsZS5cXG5cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxOi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiAoR1BMLTIuMC1vbmx5IE9SIEJTRC0yLUNsYXVzZSlcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyOi8qIENvcHlyaWdodCAoQykgMjAxNy0yMDE4IE5ldHJvbm9tZSBTeXN0ZW1zLCBJbmMuICovXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OiNpbmNsdWRlIFxcdTAwM2NlcnJuby5oXFx1MDAzZVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjU6I2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NjojaW5jbHVkZSBcXHUwMDNjbGludXgvZXJyLmhcXHUwMDNlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NzojaW5jbHVkZSBcXHUwMDNjbGludXgva2VybmVsLmhcXHUwMDNlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6ODojaW5jbHVkZSBcXHUwMDNjbmV0L2lmLmhcXHUwMDNlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6OTojaW5jbHVkZSBcXHUwMDNjc3RkYm9vbC5oXFx1MDAzZVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwOiNpbmNsdWRlIFxcdTAwM2NzdGRpby5oXFx1MDAzZVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjExOiNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMjojaW5jbHVkZSBcXHUwMDNjc3RyaW5nLmhcXHUwMDNlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTM6I2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE0OiNpbmNsdWRlIFxcdTAwM2NzeXMvdHlwZXMuaFxcdTAwM2VcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNTojaW5jbHVkZSBcXHUwMDNjc3lzL3N0YXQuaFxcdTAwM2VcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNjpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzojaW5jbHVkZSBcXHUwMDNjYnBmL2JwZi5oXFx1MDAzZVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE4OiNpbmNsdWRlIFxcdTAwM2NicGYvYnRmLmhcXHUwMDNlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTk6I2luY2x1ZGUgXFx1MDAzY2JwZi9oYXNobWFwLmhcXHUwMDNlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjA6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjE6I2luY2x1ZGUgXFxcImpzb25fd3JpdGVyLmhcXFwiXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjI6I2luY2x1ZGUgXFxcIm1haW4uaFxcXCJcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNDpzdGF0aWMgc3RydWN0IGhhc2htYXAgKm1hcF90YWJsZTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNjpzdGF0aWMgYm9vbCBtYXBfaXNfcGVyX2NwdShfX3UzMiB0eXBlKVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI3OntcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyODpcXHRyZXR1cm4gdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0hBU0ggfHxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyOTpcXHQgICAgICAgdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZIHx8XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzA6XFx0ICAgICAgIHR5cGUgPT0gQlBGX01BUF9UWVBFX0xSVV9QRVJDUFVfSEFTSCB8fFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMxOlxcdCAgICAgICB0eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfQ0dST1VQX1NUT1JBR0U7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzI6fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMzOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0OnN0YXRpYyBib29sIG1hcF9pc19tYXBfb2ZfbWFwcyhfX3UzMiB0eXBlKVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1OntcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNjpcXHRyZXR1cm4gdHlwZSA9PSBCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUyB8fFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM3OlxcdCAgICAgICB0eXBlID09IEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFM7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzg6fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM5OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQwOnN0YXRpYyBib29sIG1hcF9pc19tYXBfb2ZfcHJvZ3MoX191MzIgdHlwZSlcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MTp7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDI6XFx0cmV0dXJuIHR5cGUgPT0gQlBGX01BUF9UWVBFX1BST0dfQVJSQVk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDM6fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ0OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ1OnN0YXRpYyBpbnQgbWFwX3R5cGVfZnJvbV9zdHIoY29uc3QgY2hhciAqdHlwZSlcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Njp7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDc6XFx0Y29uc3QgY2hhciAqbWFwX3R5cGVfc3RyO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ4OlxcdHVuc2lnbmVkIGludCBpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjUwOlxcdGZvciAoaSA9IDA7IDsgaSsrKSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTE6XFx0XFx0bWFwX3R5cGVfc3RyID0gbGliYnBmX2JwZl9tYXBfdHlwZV9zdHIoaSk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTI6XFx0XFx0aWYgKCFtYXBfdHlwZV9zdHIpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTM6XFx0XFx0XFx0YnJlYWs7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTQ6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTU6XFx0XFx0LyogRG9uJ3QgYWxsb3cgcHJlZml4aW5nIGluIGNhc2Ugb2YgcG9zc2libGUgZnV0dXJlIHNoYWRvd2luZyAqL1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjU2OlxcdFxcdGlmICghc3RyY21wKG1hcF90eXBlX3N0ciwgdHlwZSkpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTc6XFx0XFx0XFx0cmV0dXJuIGk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTg6XFx0fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjU5OlxcdHJldHVybiAtMTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2MDp9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NjE6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NjI6c3RhdGljIHZvaWQgKmFsbG9jX3ZhbHVlKHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8pXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NjM6e1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjY0OlxcdGlmIChtYXBfaXNfcGVyX2NwdShpbmZvLVxcdTAwM2V0eXBlKSlcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2NTpcXHRcXHRyZXR1cm4gbWFsbG9jKHJvdW5kX3VwKGluZm8tXFx1MDAzZXZhbHVlX3NpemUsIDgpICpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2NjpcXHRcXHRcXHQgICAgICBnZXRfcG9zc2libGVfY3B1cygpKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2NzpcXHRlbHNlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Njg6XFx0XFx0cmV0dXJuIG1hbGxvYyhpbmZvLVxcdTAwM2V2YWx1ZV9zaXplKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2OTp9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NzA6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NzE6c3RhdGljIGludCBkb19kdW1wX2J0Zihjb25zdCBzdHJ1Y3QgYnRmX2R1bXBlciAqZCxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo3MjpcXHRcXHQgICAgICAgc3RydWN0IGJwZl9tYXBfaW5mbyAqbWFwX2luZm8sIHZvaWQgKmtleSxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo3MzpcXHRcXHQgICAgICAgdm9pZCAqdmFsdWUpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NzQ6e1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjc1OlxcdF9fdTMyIHZhbHVlX2lkO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjc2OlxcdGludCByZXQgPSAwO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjc3OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjc4OlxcdC8qIHN0YXJ0IG9mIGtleS12YWx1ZSBwYWlyICovXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Nzk6XFx0anNvbndfc3RhcnRfb2JqZWN0KGQtXFx1MDAzZWp3KTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4MDpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4MTpcXHRpZiAobWFwX2luZm8tXFx1MDAzZWJ0Zl9rZXlfdHlwZV9pZCkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjgyOlxcdFxcdGpzb253X25hbWUoZC1cXHUwMDNlancsIFxcXCJrZXlcXFwiKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4MzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4NDpcXHRcXHRyZXQgPSBidGZfZHVtcGVyX3R5cGUoZCwgbWFwX2luZm8tXFx1MDAzZWJ0Zl9rZXlfdHlwZV9pZCwga2V5KTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4NTpcXHRcXHRpZiAocmV0KVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjg2OlxcdFxcdFxcdGdvdG8gZXJyX2VuZF9vYmo7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6ODc6XFx0fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjg4OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjg5OlxcdHZhbHVlX2lkID0gbWFwX2luZm8tXFx1MDAzZWJ0Zl92bWxpbnV4X3ZhbHVlX3R5cGVfaWQgP1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjkwOlxcdFxcdDogbWFwX2luZm8tXFx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjkxOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjkyOlxcdGlmICghbWFwX2lzX3Blcl9jcHUobWFwX2luZm8tXFx1MDAzZXR5cGUpKSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6OTM6XFx0XFx0anNvbndfbmFtZShkLVxcdTAwM2VqdywgXFxcInZhbHVlXFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6OTQ6XFx0XFx0cmV0ID0gYnRmX2R1bXBlcl90eXBlKGQsIHZhbHVlX2lkLCB2YWx1ZSk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6OTU6XFx0fSBlbHNlIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo5NjpcXHRcXHR1bnNpZ25lZCBpbnQgaSwgbiwgc3RlcDtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo5NzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo5ODpcXHRcXHRqc29ud19uYW1lKGQtXFx1MDAzZWp3LCBcXFwidmFsdWVzXFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6OTk6XFx0XFx0anNvbndfc3RhcnRfYXJyYXkoZC1cXHUwMDNlancpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwMDpcXHRcXHRuID0gZ2V0X3Bvc3NpYmxlX2NwdXMoKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMDE6XFx0XFx0c3RlcCA9IHJvdW5kX3VwKG1hcF9pbmZvLVxcdTAwM2V2YWx1ZV9zaXplLCA4KTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMDI6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG47IGkrKykge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwMzpcXHRcXHRcXHRqc29ud19zdGFydF9vYmplY3QoZC1cXHUwMDNlancpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwNDpcXHRcXHRcXHRqc29ud19pbnRfZmllbGQoZC1cXHUwMDNlancsIFxcXCJjcHVcXFwiLCBpKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMDU6XFx0XFx0XFx0anNvbndfbmFtZShkLVxcdTAwM2VqdywgXFxcInZhbHVlXFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTA2OlxcdFxcdFxcdHJldCA9IGJ0Zl9kdW1wZXJfdHlwZShkLCB2YWx1ZV9pZCwgdmFsdWUgKyBpICogc3RlcCk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTA3OlxcdFxcdFxcdGpzb253X2VuZF9vYmplY3QoZC1cXHUwMDNlancpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwODpcXHRcXHRcXHRpZiAocmV0KVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwOTpcXHRcXHRcXHRcXHRicmVhaztcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMTA6XFx0XFx0fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjExMTpcXHRcXHRqc29ud19lbmRfYXJyYXkoZC1cXHUwMDNlancpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjExMjpcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTEzOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjExNDplcnJfZW5kX29iajpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMTU6XFx0LyogZW5kIG9mIGtleS12YWx1ZSBwYWlyICovXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTE2OlxcdGpzb253X2VuZF9vYmplY3QoZC1cXHUwMDNlancpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjExNzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMTg6XFx0cmV0dXJuIHJldDtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMTk6fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEyMDpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMjE6c3RhdGljIGpzb25fd3JpdGVyX3QgKmdldF9idGZfd3JpdGVyKHZvaWQpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTIyOntcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMjM6XFx0anNvbl93cml0ZXJfdCAqancgPSBqc29ud19uZXcoc3Rkb3V0KTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMjQ6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTI1OlxcdGlmICghancpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTI2OlxcdFxcdHJldHVybiBOVUxMO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEyNzpcXHRqc29ud19wcmV0dHkoancsIHRydWUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEyODpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMjk6XFx0cmV0dXJuIGp3O1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEzMDp9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTMxOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEzMjpzdGF0aWMgdm9pZCBwcmludF9lbnRyeV9qc29uKHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHVuc2lnbmVkIGNoYXIgKmtleSxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMzM6XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBjaGFyICp2YWx1ZSwgc3RydWN0IGJ0ZiAqYnRmKVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEzNDp7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTM1OlxcdGpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTM2OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEzNzpcXHRpZiAoIW1hcF9pc19wZXJfY3B1KGluZm8tXFx1MDAzZXR5cGUpKSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTM4OlxcdFxcdGpzb253X25hbWUoanNvbl93dHIsIFxcXCJrZXlcXFwiKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMzk6XFx0XFx0cHJpbnRfaGV4X2RhdGFfanNvbihrZXksIGluZm8tXFx1MDAzZWtleV9zaXplKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNDA6XFx0XFx0anNvbndfbmFtZShqc29uX3d0ciwgXFxcInZhbHVlXFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTQxOlxcdFxcdHByaW50X2hleF9kYXRhX2pzb24odmFsdWUsIGluZm8tXFx1MDAzZXZhbHVlX3NpemUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE0MjpcXHRcXHRpZiAobWFwX2lzX21hcF9vZl9tYXBzKGluZm8tXFx1MDAzZXR5cGUpKVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE0MzpcXHRcXHRcXHRqc29ud191aW50X2ZpZWxkKGpzb25fd3RyLCBcXFwiaW5uZXJfbWFwX2lkXFxcIixcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNDQ6XFx0XFx0XFx0XFx0XFx0ICoodW5zaWduZWQgaW50ICopdmFsdWUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE0NTpcXHRcXHRpZiAoYnRmKSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTQ2OlxcdFxcdFxcdHN0cnVjdCBidGZfZHVtcGVyIGQgPSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTQ3OlxcdFxcdFxcdFxcdC5idGYgPSBidGYsXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTQ4OlxcdFxcdFxcdFxcdC5qdyA9IGpzb25fd3RyLFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE0OTpcXHRcXHRcXHRcXHQuaXNfcGxhaW5fdGV4dCA9IGZhbHNlLFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE1MDpcXHRcXHRcXHR9O1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE1MTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNTI6XFx0XFx0XFx0anNvbndfbmFtZShqc29uX3d0ciwgXFxcImZvcm1hdHRlZFxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE1MzpcXHRcXHRcXHRkb19kdW1wX2J0ZihcXHUwMDI2ZCwgaW5mbywga2V5LCB2YWx1ZSk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTU0OlxcdFxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNTU6XFx0fSBlbHNlIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNTY6XFx0XFx0dW5zaWduZWQgaW50IGksIG4sIHN0ZXA7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTU3OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE1ODpcXHRcXHRuID0gZ2V0X3Bvc3NpYmxlX2NwdXMoKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNTk6XFx0XFx0c3RlcCA9IHJvdW5kX3VwKGluZm8tXFx1MDAzZXZhbHVlX3NpemUsIDgpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2MDpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNjE6XFx0XFx0anNvbndfbmFtZShqc29uX3d0ciwgXFxcImtleVxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2MjpcXHRcXHRwcmludF9oZXhfZGF0YV9qc29uKGtleSwgaW5mby1cXHUwMDNla2V5X3NpemUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2MzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNjQ6XFx0XFx0anNvbndfbmFtZShqc29uX3d0ciwgXFxcInZhbHVlc1xcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2NTpcXHRcXHRqc29ud19zdGFydF9hcnJheShqc29uX3d0cik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTY2OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuOyBpKyspIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNjc6XFx0XFx0XFx0anNvbndfc3RhcnRfb2JqZWN0KGpzb25fd3RyKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNjg6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTY5OlxcdFxcdFxcdGpzb253X2ludF9maWVsZChqc29uX3d0ciwgXFxcImNwdVxcXCIsIGkpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE3MDpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzE6XFx0XFx0XFx0anNvbndfbmFtZShqc29uX3d0ciwgXFxcInZhbHVlXFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTcyOlxcdFxcdFxcdHByaW50X2hleF9kYXRhX2pzb24odmFsdWUgKyBpICogc3RlcCxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzM6XFx0XFx0XFx0XFx0XFx0ICAgIGluZm8tXFx1MDAzZXZhbHVlX3NpemUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE3NDpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzU6XFx0XFx0XFx0anNvbndfZW5kX29iamVjdChqc29uX3d0cik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTc2OlxcdFxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzc6XFx0XFx0anNvbndfZW5kX2FycmF5KGpzb25fd3RyKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzg6XFx0XFx0aWYgKGJ0Zikge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE3OTpcXHRcXHRcXHRzdHJ1Y3QgYnRmX2R1bXBlciBkID0ge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE4MDpcXHRcXHRcXHRcXHQuYnRmID0gYnRmLFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE4MTpcXHRcXHRcXHRcXHQuancgPSBqc29uX3d0cixcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxODI6XFx0XFx0XFx0XFx0LmlzX3BsYWluX3RleHQgPSBmYWxzZSxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxODM6XFx0XFx0XFx0fTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxODQ6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTg1OlxcdFxcdFxcdGpzb253X25hbWUoanNvbl93dHIsIFxcXCJmb3JtYXR0ZWRcXFwiKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxODY6XFx0XFx0XFx0ZG9fZHVtcF9idGYoXFx1MDAyNmQsIGluZm8sIGtleSwgdmFsdWUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE4NzpcXHRcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTg4OlxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxODk6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTkwOlxcdGpzb253X2VuZF9vYmplY3QoanNvbl93dHIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5MTp9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTkyOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5MzpzdGF0aWMgdm9pZFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5NDpwcmludF9lbnRyeV9lcnJvcl9tc2coc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywgdW5zaWduZWQgY2hhciAqa2V5LFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5NTpcXHRcXHQgICAgICBjb25zdCBjaGFyICplcnJvcl9tc2cpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTk2OntcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxOTc6XFx0aW50IG1zZ19zaXplID0gc3RybGVuKGVycm9yX21zZyk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTk4OlxcdGJvb2wgc2luZ2xlX2xpbmUsIGJyZWFrX25hbWVzO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5OTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMDA6XFx0YnJlYWtfbmFtZXMgPSBpbmZvLVxcdTAwM2VrZXlfc2l6ZSBcXHUwMDNlIDE2IHx8IG1zZ19zaXplIFxcdTAwM2UgMTY7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjAxOlxcdHNpbmdsZV9saW5lID0gaW5mby1cXHUwMDNla2V5X3NpemUgKyBtc2dfc2l6ZSBcXHUwMDNjPSAyNCBcXHUwMDI2XFx1MDAyNiAhYnJlYWtfbmFtZXM7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjAyOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIwMzpcXHRwcmludGYoXFxcImtleTolY1xcXCIsIGJyZWFrX25hbWVzID8gJ1xcXFxuJyA6ICcgJyk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjA0OlxcdGZwcmludF9oZXgoc3Rkb3V0LCBrZXksIGluZm8tXFx1MDAzZWtleV9zaXplLCBcXFwiIFxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIwNTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMDY6XFx0cHJpbnRmKHNpbmdsZV9saW5lID8gXFxcIiAgXFxcIiA6IFxcXCJcXFxcblxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIwNzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMDg6XFx0cHJpbnRmKFxcXCJ2YWx1ZTolYyVzXFxcIiwgYnJlYWtfbmFtZXMgPyAnXFxcXG4nIDogJyAnLCBlcnJvcl9tc2cpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIwOTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMTA6XFx0cHJpbnRmKFxcXCJcXFxcblxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIxMTp9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjEyOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIxMzpzdGF0aWMgdm9pZFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIxNDpwcmludF9lbnRyeV9lcnJvcihzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgdm9pZCAqa2V5LCBpbnQgbG9va3VwX2Vycm5vKVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIxNTp7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjE2OlxcdC8qIEZvciBwcm9nX2FycmF5IG1hcHMgb3IgYXJyYXlzIG9mIG1hcHMsIGZhaWx1cmUgdG8gbG9va3VwIHRoZSB2YWx1ZVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIxNzpcXHQgKiBtZWFucyB0aGVyZSBpcyBubyBlbnRyeSBmb3IgdGhhdCBrZXkuIERvIG5vdCBwcmludCBhbiBlcnJvciBtZXNzYWdlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjE4OlxcdCAqIGluIHRoYXQgY2FzZS5cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMTk6XFx0ICovXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjIwOlxcdGlmICgobWFwX2lzX21hcF9vZl9tYXBzKG1hcF9pbmZvLVxcdTAwM2V0eXBlKSB8fFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIyMTpcXHQgICAgIG1hcF9pc19tYXBfb2ZfcHJvZ3MobWFwX2luZm8tXFx1MDAzZXR5cGUpKSBcXHUwMDI2XFx1MDAyNiBsb29rdXBfZXJybm8gPT0gRU5PRU5UKVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIyMjpcXHRcXHRyZXR1cm47XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjIzOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIyNDpcXHRpZiAoanNvbl9vdXRwdXQpIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMjU6XFx0XFx0anNvbndfc3RhcnRfb2JqZWN0KGpzb25fd3RyKTtcXHQvKiBlbnRyeSAqL1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIyNjpcXHRcXHRqc29ud19uYW1lKGpzb25fd3RyLCBcXFwia2V5XFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjI3OlxcdFxcdHByaW50X2hleF9kYXRhX2pzb24oa2V5LCBtYXBfaW5mby1cXHUwMDNla2V5X3NpemUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIyODpcXHRcXHRqc29ud19uYW1lKGpzb25fd3RyLCBcXFwidmFsdWVcXFwiKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMjk6XFx0XFx0anNvbndfc3RhcnRfb2JqZWN0KGpzb25fd3RyKTtcXHQvKiBlcnJvciAqL1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzMDpcXHRcXHRqc29ud19zdHJpbmdfZmllbGQoanNvbl93dHIsIFxcXCJlcnJvclxcXCIsIHN0cmVycm9yKGxvb2t1cF9lcnJubykpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzMTpcXHRcXHRqc29ud19lbmRfb2JqZWN0KGpzb25fd3RyKTtcXHQvKiBlcnJvciAqL1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzMjpcXHRcXHRqc29ud19lbmRfb2JqZWN0KGpzb25fd3RyKTtcXHQvKiBlbnRyeSAqL1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzMzpcXHR9IGVsc2Uge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzNDpcXHRcXHRjb25zdCBjaGFyICptc2cgPSBOVUxMO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzNTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMzY6XFx0XFx0aWYgKGxvb2t1cF9lcnJubyA9PSBFTk9FTlQpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjM3OlxcdFxcdFxcdG1zZyA9IFxcXCJcXHUwMDNjbm8gZW50cnlcXHUwMDNlXFxcIjtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMzg6XFx0XFx0ZWxzZSBpZiAobG9va3VwX2Vycm5vID09IEVOT1NQQyBcXHUwMDI2XFx1MDAyNlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzOTpcXHRcXHRcXHQgbWFwX2luZm8tXFx1MDAzZXR5cGUgPT0gQlBGX01BUF9UWVBFX1JFVVNFUE9SVF9TT0NLQVJSQVkpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjQwOlxcdFxcdFxcdG1zZyA9IFxcXCJcXHUwMDNjY2Fubm90IHJlYWRcXHUwMDNlXFxcIjtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNDE6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjQyOlxcdFxcdHByaW50X2VudHJ5X2Vycm9yX21zZyhtYXBfaW5mbywga2V5LFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI0MzpcXHRcXHRcXHRcXHQgICAgICBtc2cgPyA6IHN0cmVycm9yKGxvb2t1cF9lcnJubykpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI0NDpcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjQ1On1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNDY6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjQ3OnN0YXRpYyB2b2lkIHByaW50X2VudHJ5X3BsYWluKHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHVuc2lnbmVkIGNoYXIgKmtleSxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNDg6XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgY2hhciAqdmFsdWUpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjQ5OntcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNTA6XFx0aWYgKCFtYXBfaXNfcGVyX2NwdShpbmZvLVxcdTAwM2V0eXBlKSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI1MTpcXHRcXHRib29sIHNpbmdsZV9saW5lLCBicmVha19uYW1lcztcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNTI6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjUzOlxcdFxcdGJyZWFrX25hbWVzID0gaW5mby1cXHUwMDNla2V5X3NpemUgXFx1MDAzZSAxNiB8fCBpbmZvLVxcdTAwM2V2YWx1ZV9zaXplIFxcdTAwM2UgMTY7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjU0OlxcdFxcdHNpbmdsZV9saW5lID0gaW5mby1cXHUwMDNla2V5X3NpemUgKyBpbmZvLVxcdTAwM2V2YWx1ZV9zaXplIFxcdTAwM2M9IDI0IFxcdTAwMjZcXHUwMDI2XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjU1OlxcdFxcdFxcdCFicmVha19uYW1lcztcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNTY6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjU3OlxcdFxcdGlmIChpbmZvLVxcdTAwM2VrZXlfc2l6ZSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI1ODpcXHRcXHRcXHRwcmludGYoXFxcImtleTolY1xcXCIsIGJyZWFrX25hbWVzID8gJ1xcXFxuJyA6ICcgJyk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjU5OlxcdFxcdFxcdGZwcmludF9oZXgoc3Rkb3V0LCBrZXksIGluZm8tXFx1MDAzZWtleV9zaXplLCBcXFwiIFxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI2MDpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNjE6XFx0XFx0XFx0cHJpbnRmKHNpbmdsZV9saW5lID8gXFxcIiAgXFxcIiA6IFxcXCJcXFxcblxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI2MjpcXHRcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjYzOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI2NDpcXHRcXHRpZiAoaW5mby1cXHUwMDNldmFsdWVfc2l6ZSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI2NTpcXHRcXHRcXHRpZiAobWFwX2lzX21hcF9vZl9tYXBzKGluZm8tXFx1MDAzZXR5cGUpKSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjY2OlxcdFxcdFxcdFxcdHByaW50ZihcXFwiaW5uZXJfbWFwX2lkOiVjXFxcIiwgYnJlYWtfbmFtZXMgPyAnXFxcXG4nIDogJyAnKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNjc6XFx0XFx0XFx0XFx0cHJpbnRmKFxcXCIldSBcXFwiLCAqKHVuc2lnbmVkIGludCAqKXZhbHVlKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNjg6XFx0XFx0XFx0fSBlbHNlIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNjk6XFx0XFx0XFx0XFx0cHJpbnRmKFxcXCJ2YWx1ZTolY1xcXCIsIGJyZWFrX25hbWVzID8gJ1xcXFxuJyA6ICcgJyk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjcwOlxcdFxcdFxcdFxcdGZwcmludF9oZXgoc3Rkb3V0LCB2YWx1ZSwgaW5mby1cXHUwMDNldmFsdWVfc2l6ZSwgXFxcIiBcXFwiKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNzE6XFx0XFx0XFx0fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI3MjpcXHRcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjczOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI3NDpcXHRcXHRwcmludGYoXFxcIlxcXFxuXFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjc1OlxcdH0gZWxzZSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjc2OlxcdFxcdHVuc2lnbmVkIGludCBpLCBuLCBzdGVwO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI3NzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNzg6XFx0XFx0biA9IGdldF9wb3NzaWJsZV9jcHVzKCk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjc5OlxcdFxcdHN0ZXAgPSByb3VuZF91cChpbmZvLVxcdTAwM2V2YWx1ZV9zaXplLCA4KTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyODA6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjgxOlxcdFxcdGlmIChpbmZvLVxcdTAwM2VrZXlfc2l6ZSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI4MjpcXHRcXHRcXHRwcmludGYoXFxcImtleTpcXFxcblxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI4MzpcXHRcXHRcXHRmcHJpbnRfaGV4KHN0ZG91dCwga2V5LCBpbmZvLVxcdTAwM2VrZXlfc2l6ZSwgXFxcIiBcXFwiKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyODQ6XFx0XFx0XFx0cHJpbnRmKFxcXCJcXFxcblxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI4NTpcXHRcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjg2OlxcdFxcdGlmIChpbmZvLVxcdTAwM2V2YWx1ZV9zaXplKSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjg3OlxcdFxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuOyBpKyspIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyODg6XFx0XFx0XFx0XFx0cHJpbnRmKFxcXCJ2YWx1ZSAoQ1BVICUwMnUpOiVjXFxcIixcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyODk6XFx0XFx0XFx0XFx0ICAgICAgIGksIGluZm8tXFx1MDAzZXZhbHVlX3NpemUgXFx1MDAzZSAxNiA/ICdcXFxcbicgOiAnICcpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5MDpcXHRcXHRcXHRcXHRmcHJpbnRfaGV4KHN0ZG91dCwgdmFsdWUgKyBpICogc3RlcCxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyOTE6XFx0XFx0XFx0XFx0XFx0ICAgaW5mby1cXHUwMDNldmFsdWVfc2l6ZSwgXFxcIiBcXFwiKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyOTI6XFx0XFx0XFx0XFx0cHJpbnRmKFxcXCJcXFxcblxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5MzpcXHRcXHRcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjk0OlxcdFxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyOTU6XFx0fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5Njp9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjk3OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5ODpzdGF0aWMgY2hhciAqKnBhcnNlX2J5dGVzKGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBjaGFyICp2YWwsXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjk5OlxcdFxcdFxcdCAgdW5zaWduZWQgaW50IG4pXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzAwOntcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMDE6XFx0dW5zaWduZWQgaW50IGkgPSAwLCBiYXNlID0gMDtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMDI6XFx0Y2hhciAqZW5kcHRyO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMwMzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMDQ6XFx0aWYgKGlzX3ByZWZpeCgqYXJndiwgXFxcImhleFxcXCIpKSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzA1OlxcdFxcdGJhc2UgPSAxNjtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMDY6XFx0XFx0YXJndisrO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMwNzpcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzA4OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMwOTpcXHR3aGlsZSAoaSBcXHUwMDNjIG4gXFx1MDAyNlxcdTAwMjYgYXJndltpXSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMxMDpcXHRcXHR2YWxbaV0gPSBzdHJ0b3VsKGFyZ3ZbaV0sIFxcdTAwMjZlbmRwdHIsIGJhc2UpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMxMTpcXHRcXHRpZiAoKmVuZHB0cikge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMxMjpcXHRcXHRcXHRwX2VycihcXFwiZXJyb3IgcGFyc2luZyBieXRlOiAlc1xcXCIsIGFyZ3ZbaV0pO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMxMzpcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMTQ6XFx0XFx0fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMxNTpcXHRcXHRpKys7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzE2OlxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMTc6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzE4OlxcdGlmIChpICE9IG4pIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMTk6XFx0XFx0cF9lcnIoXFxcIiVzIGV4cGVjdGVkICV1IGJ5dGVzIGdvdCAldVxcXCIsIG5hbWUsIG4sIGkpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMyMDpcXHRcXHRyZXR1cm4gTlVMTDtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMjE6XFx0fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMyMjpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMjM6XFx0cmV0dXJuIGFyZ3YgKyBpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMyNDp9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzI1OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMyNjovKiBvbiBwZXIgY3B1IG1hcHMgd2UgbXVzdCBjb3B5IHRoZSBwcm92aWRlZCB2YWx1ZSBvbiBhbGwgdmFsdWUgaW5zdGFuY2VzICovXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzI3OnN0YXRpYyB2b2lkIGZpbGxfcGVyX2NwdV92YWx1ZShzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCB2b2lkICp2YWx1ZSlcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMjg6e1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMyOTpcXHR1bnNpZ25lZCBpbnQgaSwgbiwgc3RlcDtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMzA6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzMxOlxcdGlmICghbWFwX2lzX3Blcl9jcHUoaW5mby1cXHUwMDNldHlwZSkpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzMyOlxcdFxcdHJldHVybjtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMzM6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzM0OlxcdG4gPSBnZXRfcG9zc2libGVfY3B1cygpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMzNTpcXHRzdGVwID0gcm91bmRfdXAoaW5mby1cXHUwMDNldmFsdWVfc2l6ZSwgOCk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzM2OlxcdGZvciAoaSA9IDE7IGkgXFx1MDAzYyBuOyBpKyspXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzM3OlxcdFxcdG1lbWNweSh2YWx1ZSArIGkgKiBzdGVwLCB2YWx1ZSwgaW5mby1cXHUwMDNldmFsdWVfc2l6ZSk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzM4On1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMzk6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzQwOnN0YXRpYyBpbnQgcGFyc2VfZWxlbShjaGFyICoqYXJndiwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywgdm9pZCAqa2V5LFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0MTpcXHRcXHQgICAgICB2b2lkICp2YWx1ZSwgX191MzIga2V5X3NpemUsIF9fdTMyIHZhbHVlX3NpemUsXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzQyOlxcdFxcdCAgICAgIF9fdTMyICpmbGFncywgX191MzIgKip2YWx1ZV9mZCwgX191MzIgb3Blbl9mbGFncylcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNDM6e1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0NDpcXHRpZiAoISphcmd2KSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzQ1OlxcdFxcdGlmICgha2V5IFxcdTAwMjZcXHUwMDI2ICF2YWx1ZSlcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNDY6XFx0XFx0XFx0cmV0dXJuIDA7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzQ3OlxcdFxcdHBfZXJyKFxcXCJkaWQgbm90IGZpbmQgJXNcXFwiLCBrZXkgPyBcXFwia2V5XFxcIiA6IFxcXCJ2YWx1ZVxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0ODpcXHRcXHRyZXR1cm4gLTE7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzQ5OlxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNTA6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzUxOlxcdGlmIChpc19wcmVmaXgoKmFyZ3YsIFxcXCJrZXlcXFwiKSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1MjpcXHRcXHRpZiAoIWtleSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1MzpcXHRcXHRcXHRpZiAoa2V5X3NpemUpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzU0OlxcdFxcdFxcdFxcdHBfZXJyKFxcXCJkdXBsaWNhdGUga2V5XFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzU1OlxcdFxcdFxcdGVsc2VcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNTY6XFx0XFx0XFx0XFx0cF9lcnIoXFxcInVubmVjZXNzYXJ5IGtleVxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1NzpcXHRcXHRcXHRyZXR1cm4gLTE7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzU4OlxcdFxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNTk6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzYwOlxcdFxcdGFyZ3YgPSBwYXJzZV9ieXRlcyhhcmd2ICsgMSwgXFxcImtleVxcXCIsIGtleSwga2V5X3NpemUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM2MTpcXHRcXHRpZiAoIWFyZ3YpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzYyOlxcdFxcdFxcdHJldHVybiAtMTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNjM6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzY0OlxcdFxcdHJldHVybiBwYXJzZV9lbGVtKGFyZ3YsIGluZm8sIE5VTEwsIHZhbHVlLCBrZXlfc2l6ZSwgdmFsdWVfc2l6ZSxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNjU6XFx0XFx0XFx0XFx0ICBmbGFncywgdmFsdWVfZmQsIG9wZW5fZmxhZ3MpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM2NjpcXHR9IGVsc2UgaWYgKGlzX3ByZWZpeCgqYXJndiwgXFxcInZhbHVlXFxcIikpIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNjc6XFx0XFx0aW50IGZkO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM2ODpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNjk6XFx0XFx0aWYgKCF2YWx1ZSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM3MDpcXHRcXHRcXHRpZiAodmFsdWVfc2l6ZSlcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNzE6XFx0XFx0XFx0XFx0cF9lcnIoXFxcImR1cGxpY2F0ZSB2YWx1ZVxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM3MjpcXHRcXHRcXHRlbHNlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzczOlxcdFxcdFxcdFxcdHBfZXJyKFxcXCJ1bm5lY2Vzc2FyeSB2YWx1ZVxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM3NDpcXHRcXHRcXHRyZXR1cm4gLTE7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzc1OlxcdFxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNzY6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzc3OlxcdFxcdGFyZ3YrKztcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNzg6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzc5OlxcdFxcdGlmIChtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cXHUwMDNldHlwZSkpIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozODA6XFx0XFx0XFx0aW50IGFyZ2MgPSAyO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM4MTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozODI6XFx0XFx0XFx0aWYgKHZhbHVlX3NpemUgIT0gNCkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM4MzpcXHRcXHRcXHRcXHRwX2VycihcXFwidmFsdWUgc21hbGxlciB0aGFuIDRCIGZvciBtYXAgaW4gbWFwP1xcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM4NDpcXHRcXHRcXHRcXHRyZXR1cm4gLTE7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzg1OlxcdFxcdFxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozODY6XFx0XFx0XFx0aWYgKCFhcmd2WzBdIHx8ICFhcmd2WzFdKSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzg3OlxcdFxcdFxcdFxcdHBfZXJyKFxcXCJub3QgZW5vdWdoIHZhbHVlIGFyZ3VtZW50cyBmb3IgbWFwIGluIG1hcFxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM4ODpcXHRcXHRcXHRcXHRyZXR1cm4gLTE7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzg5OlxcdFxcdFxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozOTA6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzkxOlxcdFxcdFxcdGZkID0gbWFwX3BhcnNlX2ZkKFxcdTAwMjZhcmdjLCBcXHUwMDI2YXJndiwgb3Blbl9mbGFncyk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzkyOlxcdFxcdFxcdGlmIChmZCBcXHUwMDNjIDApXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzkzOlxcdFxcdFxcdFxcdHJldHVybiAtMTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozOTQ6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzk1OlxcdFxcdFxcdCp2YWx1ZV9mZCA9IHZhbHVlO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM5NjpcXHRcXHRcXHQqKnZhbHVlX2ZkID0gZmQ7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzk3OlxcdFxcdH0gZWxzZSBpZiAobWFwX2lzX21hcF9vZl9wcm9ncyhpbmZvLVxcdTAwM2V0eXBlKSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM5ODpcXHRcXHRcXHRpbnQgYXJnYyA9IDI7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzk5OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQwMDpcXHRcXHRcXHRpZiAodmFsdWVfc2l6ZSAhPSA0KSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDAxOlxcdFxcdFxcdFxcdHBfZXJyKFxcXCJ2YWx1ZSBzbWFsbGVyIHRoYW4gNEIgZm9yIG1hcCBvZiBwcm9ncz9cXFwiKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MDI6XFx0XFx0XFx0XFx0cmV0dXJuIC0xO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQwMzpcXHRcXHRcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDA0OlxcdFxcdFxcdGlmICghYXJndlswXSB8fCAhYXJndlsxXSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQwNTpcXHRcXHRcXHRcXHRwX2VycihcXFwibm90IGVub3VnaCB2YWx1ZSBhcmd1bWVudHMgZm9yIG1hcCBvZiBwcm9nc1xcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQwNjpcXHRcXHRcXHRcXHRyZXR1cm4gLTE7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDA3OlxcdFxcdFxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MDg6XFx0XFx0XFx0aWYgKGlzX3ByZWZpeCgqYXJndiwgXFxcImlkXFxcIikpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDA5OlxcdFxcdFxcdFxcdHBfaW5mbyhcXFwiV2FybmluZzogdXBkYXRpbmcgcHJvZ3JhbSBhcnJheSB2aWEgTUFQX0lELCBtYWtlIHN1cmUgdGhpcyBtYXAgaXMga2VwdCBvcGVuXFxcXG5cXFwiXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDEwOlxcdFxcdFxcdFxcdCAgICAgICBcXFwiICAgICAgICAgYnkgc29tZSBwcm9jZXNzIG9yIHBpbm5lZCBvdGhlcndpc2UgdXBkYXRlIHdpbGwgYmUgbG9zdFxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQxMTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MTI6XFx0XFx0XFx0ZmQgPSBwcm9nX3BhcnNlX2ZkKFxcdTAwMjZhcmdjLCBcXHUwMDI2YXJndik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDEzOlxcdFxcdFxcdGlmIChmZCBcXHUwMDNjIDApXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDE0OlxcdFxcdFxcdFxcdHJldHVybiAtMTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MTU6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDE2OlxcdFxcdFxcdCp2YWx1ZV9mZCA9IHZhbHVlO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQxNzpcXHRcXHRcXHQqKnZhbHVlX2ZkID0gZmQ7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDE4OlxcdFxcdH0gZWxzZSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDE5OlxcdFxcdFxcdGFyZ3YgPSBwYXJzZV9ieXRlcyhhcmd2LCBcXFwidmFsdWVcXFwiLCB2YWx1ZSwgdmFsdWVfc2l6ZSk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDIwOlxcdFxcdFxcdGlmICghYXJndilcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MjE6XFx0XFx0XFx0XFx0cmV0dXJuIC0xO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQyMjpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MjM6XFx0XFx0XFx0ZmlsbF9wZXJfY3B1X3ZhbHVlKGluZm8sIHZhbHVlKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MjQ6XFx0XFx0fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQyNTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MjY6XFx0XFx0cmV0dXJuIHBhcnNlX2VsZW0oYXJndiwgaW5mbywga2V5LCBOVUxMLCBrZXlfc2l6ZSwgdmFsdWVfc2l6ZSxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Mjc6XFx0XFx0XFx0XFx0ICBmbGFncywgTlVMTCwgb3Blbl9mbGFncyk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDI4OlxcdH0gZWxzZSBpZiAoaXNfcHJlZml4KCphcmd2LCBcXFwiYW55XFxcIikgfHwgaXNfcHJlZml4KCphcmd2LCBcXFwibm9leGlzdFxcXCIpIHx8XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDI5OlxcdFxcdCAgIGlzX3ByZWZpeCgqYXJndiwgXFxcImV4aXN0XFxcIikpIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MzA6XFx0XFx0aWYgKCFmbGFncykge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQzMTpcXHRcXHRcXHRwX2VycihcXFwiZmxhZ3Mgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzOiAlc1xcXCIsICphcmd2KTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MzI6XFx0XFx0XFx0cmV0dXJuIC0xO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQzMzpcXHRcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDM0OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQzNTpcXHRcXHRpZiAoaXNfcHJlZml4KCphcmd2LCBcXFwiYW55XFxcIikpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDM2OlxcdFxcdFxcdCpmbGFncyA9IEJQRl9BTlk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDM3OlxcdFxcdGVsc2UgaWYgKGlzX3ByZWZpeCgqYXJndiwgXFxcIm5vZXhpc3RcXFwiKSlcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Mzg6XFx0XFx0XFx0KmZsYWdzID0gQlBGX05PRVhJU1Q7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDM5OlxcdFxcdGVsc2UgaWYgKGlzX3ByZWZpeCgqYXJndiwgXFxcImV4aXN0XFxcIikpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQwOlxcdFxcdFxcdCpmbGFncyA9IEJQRl9FWElTVDtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NDE6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQyOlxcdFxcdHJldHVybiBwYXJzZV9lbGVtKGFyZ3YgKyAxLCBpbmZvLCBrZXksIHZhbHVlLCBrZXlfc2l6ZSxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NDM6XFx0XFx0XFx0XFx0ICB2YWx1ZV9zaXplLCBOVUxMLCB2YWx1ZV9mZCwgb3Blbl9mbGFncyk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQ0OlxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NDU6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQ2OlxcdHBfZXJyKFxcXCJleHBlY3RlZCBrZXkgb3IgdmFsdWUsIGdvdDogJXNcXFwiLCAqYXJndik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQ3OlxcdHJldHVybiAtMTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NDg6fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ0OTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTA6c3RhdGljIHZvaWQgc2hvd19tYXBfaGVhZGVyX2pzb24oc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyKVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ1MTp7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDUyOlxcdGNvbnN0IGNoYXIgKm1hcF90eXBlX3N0cjtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTM6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDU0OlxcdGpzb253X3VpbnRfZmllbGQod3RyLCBcXFwiaWRcXFwiLCBpbmZvLVxcdTAwM2VpZCk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDU1OlxcdG1hcF90eXBlX3N0ciA9IGxpYmJwZl9icGZfbWFwX3R5cGVfc3RyKGluZm8tXFx1MDAzZXR5cGUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ1NjpcXHRpZiAobWFwX3R5cGVfc3RyKVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ1NzpcXHRcXHRqc29ud19zdHJpbmdfZmllbGQod3RyLCBcXFwidHlwZVxcXCIsIG1hcF90eXBlX3N0cik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDU4OlxcdGVsc2VcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTk6XFx0XFx0anNvbndfdWludF9maWVsZCh3dHIsIFxcXCJ0eXBlXFxcIiwgaW5mby1cXHUwMDNldHlwZSk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDYwOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ2MTpcXHRpZiAoKmluZm8tXFx1MDAzZW5hbWUpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDYyOlxcdFxcdGpzb253X3N0cmluZ19maWVsZCh3dHIsIFxcXCJuYW1lXFxcIiwgaW5mby1cXHUwMDNlbmFtZSk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDYzOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ2NDpcXHRqc29ud19uYW1lKHd0ciwgXFxcImZsYWdzXFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDY1OlxcdGpzb253X3ByaW50Zih3dHIsIFxcXCIldVxcXCIsIGluZm8tXFx1MDAzZW1hcF9mbGFncyk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDY2On1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Njc6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDY4OnN0YXRpYyBpbnQgc2hvd19tYXBfY2xvc2VfanNvbihpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8pXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDY5OntcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NzA6XFx0Y2hhciAqbWVtbG9jaywgKmZyb3plbl9zdHI7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDcxOlxcdGludCBmcm96ZW4gPSAwO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ3MjpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NzM6XFx0bWVtbG9jayA9IGdldF9mZGluZm8oZmQsIFxcXCJtZW1sb2NrXFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDc0OlxcdGZyb3plbl9zdHIgPSBnZXRfZmRpbmZvKGZkLCBcXFwiZnJvemVuXFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDc1OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ3NjpcXHRqc29ud19zdGFydF9vYmplY3QoanNvbl93dHIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ3NzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Nzg6XFx0c2hvd19tYXBfaGVhZGVyX2pzb24oaW5mbywganNvbl93dHIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ3OTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0ODA6XFx0cHJpbnRfZGV2X2pzb24oaW5mby1cXHUwMDNlaWZpbmRleCwgaW5mby1cXHUwMDNlbmV0bnNfZGV2LCBpbmZvLVxcdTAwM2VuZXRuc19pbm8pO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ4MTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0ODI6XFx0anNvbndfdWludF9maWVsZChqc29uX3d0ciwgXFxcImJ5dGVzX2tleVxcXCIsIGluZm8tXFx1MDAzZWtleV9zaXplKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0ODM6XFx0anNvbndfdWludF9maWVsZChqc29uX3d0ciwgXFxcImJ5dGVzX3ZhbHVlXFxcIiwgaW5mby1cXHUwMDNldmFsdWVfc2l6ZSk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDg0OlxcdGpzb253X3VpbnRfZmllbGQoanNvbl93dHIsIFxcXCJtYXhfZW50cmllc1xcXCIsIGluZm8tXFx1MDAzZW1heF9lbnRyaWVzKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0ODU6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDg2OlxcdGlmIChtZW1sb2NrKVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ4NzpcXHRcXHRqc29ud19pbnRfZmllbGQoanNvbl93dHIsIFxcXCJieXRlc19tZW1sb2NrXFxcIiwgYXRvbGwobWVtbG9jaykpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ4ODpcXHRmcmVlKG1lbWxvY2spO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ4OTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OTA6XFx0aWYgKGluZm8tXFx1MDAzZXR5cGUgPT0gQlBGX01BUF9UWVBFX1BST0dfQVJSQVkpIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OTE6XFx0XFx0Y2hhciAqb3duZXJfcHJvZ190eXBlID0gZ2V0X2ZkaW5mbyhmZCwgXFxcIm93bmVyX3Byb2dfdHlwZVxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5MjpcXHRcXHRjaGFyICpvd25lcl9qaXRlZCA9IGdldF9mZGluZm8oZmQsIFxcXCJvd25lcl9qaXRlZFxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5MzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OTQ6XFx0XFx0aWYgKG93bmVyX3Byb2dfdHlwZSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5NTpcXHRcXHRcXHR1bnNpZ25lZCBpbnQgcHJvZ190eXBlID0gYXRvaShvd25lcl9wcm9nX3R5cGUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5NjpcXHRcXHRcXHRjb25zdCBjaGFyICpwcm9nX3R5cGVfc3RyO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5NzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OTg6XFx0XFx0XFx0cHJvZ190eXBlX3N0ciA9IGxpYmJwZl9icGZfcHJvZ190eXBlX3N0cihwcm9nX3R5cGUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5OTpcXHRcXHRcXHRpZiAocHJvZ190eXBlX3N0cilcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo1MDA6XFx0XFx0XFx0XFx0anNvbndfc3RyaW5nX2ZpZWxkKGpzb25fd3RyLCBcXFwib3duZXJfcHJvZ190eXBlXFxcIixcXG5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDA6NTM6MzYuMTMwODI2NjA1WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzY4MTk1NTAyOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiB0aGUgQlBGIFRvb2wgQ2hhbmdlcyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHRoYXQgdGhlc2UgY2hhbmdlcyBhcmUgaXNvbGF0ZWQgdG8gdGhlIGBicGZ0b29sYCB1dGlsaXR5IGFuZCByZWxhdGVkIHRlc3RpbmcgaW5mcmFzdHJ1Y3R1cmUuIFNwZWNpZmljYWxseSwgSSdtIGxvb2tpbmcgYXQgbW9kaWZpY2F0aW9ucyB3aXRoaW46XG5cbjEuICBgdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RgXG4yLiAgYHRvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sYFxuMy4gIGB0b29scy9icGYvYnBmdG9vbC9tYWluLmNgXG40LiAgYHRvb2xzL2JwZi9icGZ0b29sL21haW4uaGBcbjUuICBgdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNgXG42LiAgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY2BcblxuQmFzZWQgb24gdGhlIGVzdGFibGlzaGVkIGd1aWRlbGluZXMsIHRoaXMgaXMgcHJldHR5IGNsZWFyLWN1dC4gVGhlIGNyaXRlcmlhIGZvciByZXR1cm5pbmcgYFdvcnRoRnV6emluZz1mYWxzZWAgaXMgbWV0IGJlY2F1c2UgYWxsIHRoZSBjaGFuZ2VzIGFyZSBjb25maW5lZCB0byB1c2VyLXNwYWNlIHV0aWxpdGllcyBhbmQgc2VsZi10ZXN0cyB3aXRoaW4gdGhlIGB0b29scy9gIGRpcmVjdG9yeS4gVGhleSBhcmUgKm5vdCogdG91Y2hpbmcgYW55dGhpbmcgdGhhdCBkaXJlY3RseSBhZmZlY3RzIHRoZSBrZXJuZWwgaW1hZ2UgKGB2bWxpbnV4YCkgb3IgYW55IGxvYWRhYmxlIGtlcm5lbCBtb2R1bGVzLiBUaGVzZSBhcmUgbW9kaWZpY2F0aW9ucyB0byB0aGUgYGJwZnRvb2xgIHV0aWxpdHkgaXRzZWxmIGFuZCB0aGUgYXNzb2NpYXRlZCBzZWxmLXRlc3RzLlxuXG5UaGVyZWZvcmUsIHRoZSBmdXp6aW5nLXdvcnRoaW5lc3MgaXMgbG93LiBJIHdpbGwgc2V0IHRoZSBwYXJhbWV0ZXJzIGZvciBgc2V0LXJlc3VsdHNgIGFjY29yZGluZ2x5LiBJIHdpbGwgZW5zdXJlIHRoYXQ6XG5cbiogICBgV29ydGhGdXp6aW5nYCBpcyBzZXQgdG8gYGZhbHNlYC5cbiogICBgRm9jdXNTeW1ib2xzYCBpcyBzZXQgdG8gYW4gZW1wdHkvbnVsbCBsaXN0ICggYFtdYCApLlxuKiAgIGBFbmFibGVDb25maWdzYCBpcyBhbHNvIHNldCB0byBhbiBlbXB0eS9udWxsIGxpc3QgKCBgW11gICkuXG4qICAgVGhlIGBSZWFzb25pbmdgIHNob3VsZCBleHBsaWNpdGx5IHN0YXRlIHRoYXQgdGhlIGNoYW5nZXMgYXJlIGlzb2xhdGVkIHRvIHVzZXItc3BhY2UgYGJwZnRvb2xgIHV0aWxpdHkgYW5kIHNlbGYtdGVzdHMgbG9jYXRlZCB3aXRoaW4gdGhlIGB0b29scy9gIGRpcmVjdG9yeSwgYW5kIHRoYXQgdGhlc2UgZG8gbm90IGltcGFjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlIG9yIHJ1bnRpbWUga2VybmVsIGNvZGUuIFRoaXMgc2hvdWxkIGJlIHZlcnkgY2xlYXIgYW5kIGNvbmNpc2UgdG8gcHJldmVudCBhbnkgY29uZnVzaW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDk1MywiT3V0cHV0VG9rZW5zIjo4OSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQzNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwMDo1MzozOS44MTI3ODYyNDJaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI2OTMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlci1zcGFjZSBjb2RlIGluIHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYuIEl0IGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcywgYW5kIGlzIHRoZXJlZm9yZSBub3QgcmVsZXZhbnQgZm9yIHN5emthbGxlciBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIGNvZGUgaW4gdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLCBhbmQgaXMgdGhlcmVmb3JlIG5vdCByZWxldmFudCBmb3Igc3l6a2FsbGVyIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwMDo1MzozOS44MTI4MTk5OTJaIiwiU2VxIjo3LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDE0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },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-workflowj26ln[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-07 00:30:33 +0000 UTC FinishedAt: 2026-09-07 00:53:41 +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+CgkJCTx0ZD4yMDI2LzA5LzA3IDAwOjUzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIGNvZGUgaW4gdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLCBhbmQgaXMgdGhlcmVmb3JlIG5vdCByZWxldmFudCBmb3Igc3l6a2FsbGVyIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDAwOjUzPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYmRiNTZmMzQxZjIyNzI3NWIyOGQxYTEyNjEwYjFlYWQ1YjcyNDcwMlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDcgMDA6NTM6MzAgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuaW5kZXggNWRhZjNkZTVjNzQ0Ni4uYzEzNTMzODYwMGU4ZiAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuQEAgLTE2LDcgJiM0MzsxNiw3IEBAIFNZTk9QU0lTXG4gXG4gKipicGZ0b29sKiogWypPUFRJT05TKl0gKiptYXAqKiAqQ09NTUFORCpcbiBcbi0qT1BUSU9OUyogOj0geyB8Q09NTU9OX09QVElPTlN8IHwgeyAqKi1mKiogfCAqKi0tYnBmZnMqKiB9IHwgeyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfVxuJiM0MzsqT1BUSU9OUyogOj0geyB8Q09NTU9OX09QVElPTlN8IHwgeyAqKi1mKiogfCAqKi0tYnBmZnMqKiB9IHwgeyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfCB7ICoqLXIqKiB8ICoqLS1yZWN1cnNpdmUqKiB9IH1cbiBcbiAqQ09NTUFORFMqIDo9XG4geyAqKnNob3cqKiB8ICoqbGlzdCoqIHwgKipjcmVhdGUqKiB8ICoqZHVtcCoqIHwgKip1cGRhdGUqKiB8ICoqbG9va3VwKiogfCAqKmdldG5leHQqKiB8XG5AQCAtMTcwLDYgJiM0MzsxNzAsMjMgQEAgT1BUSU9OU1xuICAgICBEbyBub3QgYXV0b21hdGljYWxseSBhdHRlbXB0IHRvIG1vdW50IGFueSB2aXJ0dWFsIGZpbGUgc3lzdGVtIChzdWNoIGFzXG4gICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LlxuIFxuJiM0MzstciwgLS1yZWN1cnNpdmVcbiYjNDM7ICAgIEFsc28gZHVtcCB0aGUgaW5uZXIgbWFwcyByZWZlcmVuY2VkIGJ5ICoqYXJyYXlfb2ZfbWFwcyoqIGFuZCAqKmhhc2hfb2ZfbWFwcyoqXG4mIzQzOyAgICBlbnRyaWVzIHdoZW4gcnVubmluZyAqKm1hcCBkdW1wKiouIEVhY2ggbWFwIGlzIGR1bXBlZCBvbmNlLCBldmVuIGlmIHNldmVyYWxcbiYjNDM7ICAgIGVudHJpZXMgcmVmZXIgdG8gaXQuIFNlbGVjdGVkIG1hcHMgYXJlIGZvbGxvd2VkIGJ5IHRoZWlyIGlubmVyIG1hcHMuXG4mIzQzO1xuJiM0MzsgICAgUGxhaW4gb3V0cHV0IGluY2x1ZGVzIGEgaGVhZGVyIGlkZW50aWZ5aW5nIGVhY2ggbWFwLiBPbiBzdWNjZXNzLCBKU09OIG91dHB1dFxuJiM0MzsgICAgaXMgYWx3YXlzIGFuIGFycmF5IG9mIG1hcCBvYmplY3RzLCBlYWNoIGNvbnRhaW5pbmcgYW4gKippZCoqIGFuZCBhblxuJiM0MzsgICAgKiplbGVtZW50cyoqIGFycmF5LCBpbmNsdWRpbmcgd2hlbiBvbmx5IG9uZSBtYXAgaXMgZHVtcGVkLiBPdXRlciBtYXAgZW50cmllc1xuJiM0MzsgICAgcmV0YWluIHRoZWlyICoqaW5uZXJfbWFwX2lkKiogZmllbGQsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgaW5uZXJcbiYjNDM7ICAgIG1hcCBvYmplY3QuXG4mIzQzO1xuJiM0MzsgICAgVGhlIGR1bXAgaXMgbm90IGEgc25hcHNob3Q6IGNvbmN1cnJlbnQgdXBkYXRlcyBjYW4gY2hhbmdlIG1hcCBjb250ZW50cy5cbiYjNDM7ICAgIEZhaWx1cmUgdG8gb3BlbiBhIHJlZmVyZW5jZWQgaW5uZXIgbWFwIHN0b3BzIHRoZSBkdW1wIGFuZCByZXR1cm5zIGEgbm9uemVyb1xuJiM0MzsgICAgZXhpdCBzdGF0dXMuIE91dHB1dCBtYXkgY29udGFpbiBtYXBzIG9yIGVudHJpZXMgcHJpbnRlZCBiZWZvcmUgdGhlIGVycm9yLlxuJiM0MzsgICAgSW4gSlNPTiBtb2RlLCBhbiBlcnJvciBkdXJpbmcgdHJhdmVyc2FsIGlzIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgYW5kIHRoZVxuJiM0MzsgICAgZW5jbG9zaW5nIGFycmF5cyBhbmQgb2JqZWN0cyBhcmUgY2xvc2VkLlxuJiM0MztcbiBFWEFNUExFU1xuID09PT09PT09XG4gKiojIGJwZnRvb2wgbWFwIHNob3cqKlxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbmluZGV4IDc1Y2JjYjUxMmViYWUuLjQ1YzMzNmQ2M2JlMGEgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbkBAIC0yNjEsNyAmIzQzOzI2MSw3IEBAIF9icGZ0b29sKClcbiBcbiAgICAgIyBEZWFsIHdpdGggb3B0aW9uc1xuICAgICBpZiBbWyAke3dvcmRzW2N3b3JkXX0gPT0gLSogXV07IHRoZW5cbi0gICAgICAgIGxvY2FsIGM9JiMzOTstLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcXFxuJiM0MzsgICAgICAgIGxvY2FsIGM9JiMzOTstLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tcmVjdXJzaXZlIC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcXFxuICAgICAgICAgICAgIC0tdXNlLWxvYWRlciAtLWJhc2UtYnRmIC0tc2lnbiAtaSAtayYjMzk7XG4gICAgICAgICBDT01QUkVQTFk9KCAkKCBjb21wZ2VuIC1XIFwmIzM0OyRjXCYjMzQ7IC0tIFwmIzM0OyRjdXJcJiMzNDsgKSApXG4gICAgICAgICByZXR1cm4gMFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xuaW5kZXggYzkxZTFhNmUxYTFlYy4uMjkwMjFmNGRkNDUxOCAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jXG5AQCAtMjYsNiAmIzQzOzI2LDcgQEAgc3RhdGljIGludCAoKmxhc3RfZG9faGVscCkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTtcbiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcbiBib29sIHByZXR0eV9vdXRwdXQ7XG4gYm9vbCBqc29uX291dHB1dDtcbiYjNDM7Ym9vbCByZWN1cnNpdmU7XG4gYm9vbCBzaG93X3Bpbm5lZDtcbiBib29sIGJsb2NrX21vdW50O1xuIGJvb2wgdmVyaWZpZXJfbG9ncztcbkBAIC00NTIsNiAmIzQzOzQ1Myw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0eyBcJiMzNDtqc29uXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtqJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDtoZWxwXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtoJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDtwcmV0dHlcJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O3AmIzM5OyB9LFxuJiM0MztcdFx0eyBcJiMzNDtyZWN1cnNpdmVcJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O3ImIzM5OyB9LFxuIFx0XHR7IFwmIzM0O3ZlcnNpb25cJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O1YmIzM5OyB9LFxuIFx0XHR7IFwmIzM0O2JwZmZzXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtmJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDttYXBjb21wYXRcJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O20mIzM5OyB9LFxuQEAgLTQ4NSw3ICYjNDM7NDg3LDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0YmluX25hbWUgPSBcJiMzNDticGZ0b29sXCYjMzQ7O1xuIFxuIFx0b3B0ZXJyID0gMDtcbi1cdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXCYjMzQ7VmhwamZMbW5kU2k6azpCOmxcJiMzNDssXG4mIzQzO1x0d2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBcJiMzNDtWaHBqcmZMbW5kU2k6azpCOmxcJiMzNDssXG4gXHRcdFx0XHQgIG9wdGlvbnMsIE5VTEwpKSBcdTAwM2U9IDApIHtcbiBcdFx0c3dpdGNoIChvcHQpIHtcbiBcdFx0Y2FzZSAmIzM5O1YmIzM5OzpcbkBAIC01MDcsNiAmIzQzOzUwOSw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHR9XG4gXHRcdFx0anNvbndfcHJldHR5KGpzb25fd3RyLCBwcmV0dHlfb3V0cHV0KTtcbiBcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTtyJiMzOTs6XG4mIzQzO1x0XHRcdHJlY3Vyc2l2ZSA9IHRydWU7XG4mIzQzO1x0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICYjMzk7ZiYjMzk7OlxuIFx0XHRcdHNob3dfcGlubmVkID0gdHJ1ZTtcbiBcdFx0XHRicmVhaztcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmggYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbmluZGV4IDc4YjZlMGViYjg1ZDguLmI1ZGM3OTYwY2Y2ODIgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxuQEAgLTgzLDYgJiM0Mzs4Myw3IEBAIGV4dGVybiBjb25zdCBjaGFyICpiaW5fbmFtZTtcbiBcbiBleHRlcm4ganNvbl93cml0ZXJfdCAqanNvbl93dHI7XG4gZXh0ZXJuIGJvb2wganNvbl9vdXRwdXQ7XG4mIzQzO2V4dGVybiBib29sIHJlY3Vyc2l2ZTtcbiBleHRlcm4gYm9vbCBzaG93X3Bpbm5lZDtcbiBleHRlcm4gYm9vbCBzaG93X3BpZHM7XG4gZXh0ZXJuIGJvb2wgYmxvY2tfbW91bnQ7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuaW5kZXggNjg0YThmYjcyNDE0Ni4uODUzZjc3NWI3ZDUyOSAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuQEAgLTc0NSw4ICYjNDM7NzQ1LDEwIEBAIHN0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4gXHRcdFx0IGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXG4ge1xuIFx0aWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7XG4tXHRcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGVycm5vKTtcbi1cdFx0cmV0dXJuIC0xO1xuJiM0MztcdFx0aW50IGxvb2t1cF9lcnJubyA9IGVycm5vO1xuJiM0MztcbiYjNDM7XHRcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGxvb2t1cF9lcnJubyk7XG4mIzQzO1x0XHRyZXR1cm4gLWxvb2t1cF9lcnJubztcbiBcdH1cbiBcbiBcdGlmIChqc29uX291dHB1dCkge1xuQEAgLTgyNiwxMiAmIzQzOzgyOCw1MyBAQCBzdGF0aWMgdm9pZCBmcmVlX21hcF9rdl9idGYoc3RydWN0IGJ0ZiAqYnRmKVxuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiB9XG4gXG4mIzQzO3N0cnVjdCBtYXBfZHVtcF9jdHgge1xuJiM0MztcdHN0cnVjdCBoYXNobWFwICpzZWVuO1xuJiM0MztcdGludCAqKmZkcztcbiYjNDM7XHRpbnQgKm5iX2ZkcztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgY29sbGVjdF9pbm5lcl9tYXAoc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4LCBfX3UzMiBpZClcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9nZXRfZmRfYnlfaWRfb3B0cywgb3B0cyxcbiYjNDM7XHRcdC5vcGVuX2ZsYWdzID0gQlBGX0ZfUkRPTkxZLFxuJiM0MztcdCk7XG4mIzQzO1x0aW50ICpmZHMsIGZkLCBlcnI7XG4mIzQzO1xuJiM0MztcdGlmIChoYXNobWFwX19maW5kKGN0eC1cdTAwM2VzZWVuLCBpZCwgTlVMTCkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBicGZfbWFwX2dldF9mZF9ieV9pZF9vcHRzKGlkLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdHBfZXJyKFwmIzM0O2NhbiYjMzk7dCBvcGVuIGlubmVyIG1hcCBpZCAldTogJXNcJiMzNDssIGlkLCBzdHJlcnJvcihlcnJubykpO1xuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZmRzID0gcmVhbGxvYygqY3R4LVx1MDAzZWZkcywgKCpjdHgtXHUwMDNlbmJfZmRzICYjNDM7IDFVTEwpICogc2l6ZW9mKCpmZHMpKTtcbiYjNDM7XHRpZiAoIWZkcykge1xuJiM0MztcdFx0cF9lcnIoXCYjMzQ7bWVtIGFsbG9jIGZhaWxlZFwmIzM0Oyk7XG4mIzQzO1x0XHRjbG9zZShmZCk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcdCpjdHgtXHUwMDNlZmRzID0gZmRzO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBoYXNobWFwX19hZGQoY3R4LVx1MDAzZXNlZW4sIGlkLCAwKTtcbiYjNDM7XHRpZiAoZXJyKSB7XG4mIzQzO1x0XHRwX2VycihcJiMzNDtmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXNcJiMzNDssIGlkLCBzdHJlcnJvcigtZXJyKSk7XG4mIzQzO1x0XHRjbG9zZShmZCk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcdGZkc1soKmN0eC1cdTAwM2VuYl9mZHMpJiM0MzsmIzQzO10gPSBmZDtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgaW50XG4gbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4tXHQgYm9vbCBzaG93X2hlYWRlcilcbiYjNDM7XHQgYm9vbCBzaG93X2hlYWRlciwgc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4KVxuIHtcbiBcdHZvaWQgKmtleSwgKnZhbHVlLCAqcHJldl9rZXk7XG4gXHR1bnNpZ25lZCBpbnQgbnVtX2VsZW1zID0gMDtcbiYjNDM7XHRqc29uX3dyaXRlcl90ICpwbGFpbl9idGZfd3RyID0gTlVMTDtcbiBcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4gXHRpbnQgZXJyO1xuIFxuQEAgLTg0NSw2ICYjNDM7ODg4LDE3IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFxuIFx0cHJldl9rZXkgPSBOVUxMO1xuIFxuJiM0MztcdGlmIChjdHggXHUwMDI2XHUwMDI2ICF3dHIgXHUwMDI2XHUwMDI2IChpbmZvLVx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkIHx8XG4mIzQzO1x0XHRcdCAgICBpbmZvLVx1MDAzZWJ0Zl92bWxpbnV4X3ZhbHVlX3R5cGVfaWQpKSB7XG4mIzQzO1x0XHRwbGFpbl9idGZfd3RyID0gZ2V0X2J0Zl93cml0ZXIoKTtcbiYjNDM7XHRcdGlmIChwbGFpbl9idGZfd3RyKSB7XG4mIzQzO1x0XHRcdGlmIChzaG93X2hlYWRlcilcbiYjNDM7XHRcdFx0XHRzaG93X21hcF9oZWFkZXJfcGxhaW4oaW5mbyk7XG4mIzQzO1x0XHRcdHNob3dfaGVhZGVyID0gZmFsc2U7XG4mIzQzO1x0XHRcdHd0ciA9IHBsYWluX2J0Zl93dHI7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiBcdGlmICh3dHIpIHtcbiBcdFx0ZXJyID0gZ2V0X21hcF9rdl9idGYoaW5mbywgXHUwMDI2YnRmKTtcbiBcdFx0aWYgKGVycikge1xuQEAgLTg3NCwxMCAmIzQzOzkyOCwyMiBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdFx0aWYgKGVycikge1xuIFx0XHRcdGlmIChlcnJubyA9PSBFTk9FTlQpXG4gXHRcdFx0XHRlcnIgPSAwO1xuJiM0MztcdFx0XHRlbHNlIGlmIChjdHgpXG4mIzQzO1x0XHRcdFx0cF9lcnIoXCYjMzQ7Y2FuJiMzOTt0IGdldCBuZXh0IGtleSBmb3IgbWFwIGlkICV1OiAlc1wmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICAgICBpbmZvLVx1MDAzZWlkLCBzdHJlcnJvcihlcnJubykpO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHR9XG4tXHRcdGlmICghZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpKVxuJiM0MztcdFx0ZXJyID0gZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpO1xuJiM0MztcdFx0aWYgKCFlcnIpIHtcbiBcdFx0XHRudW1fZWxlbXMmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRpZiAoY3R4IFx1MDAyNlx1MDAyNiBtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cdTAwM2V0eXBlKSkge1xuJiM0MztcdFx0XHRcdGVyciA9IGNvbGxlY3RfaW5uZXJfbWFwKGN0eCwgKihfX3UzMiAqKXZhbHVlKTtcbiYjNDM7XHRcdFx0XHRpZiAoZXJyKVxuJiM0MztcdFx0XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH0gZWxzZSBpZiAoY3R4IFx1MDAyNlx1MDAyNiBlcnIgIT0gLUVOT0VOVCkge1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiBcdFx0cHJldl9rZXkgPSBrZXk7XG4gXHR9XG4gXG5AQCAtODk0LDYgJiM0Mzs5NjAsOCBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdGZyZWUoa2V5KTtcbiBcdGZyZWUodmFsdWUpO1xuIFx0ZnJlZV9tYXBfa3ZfYnRmKGJ0Zik7XG4mIzQzO1x0aWYgKHBsYWluX2J0Zl93dHIpXG4mIzQzO1x0XHRqc29ud19kZXN0cm95KFx1MDAyNnBsYWluX2J0Zl93dHIpO1xuIFxuIFx0cmV0dXJuIGVycjtcbiB9XG5AQCAtOTAyLDYgJiM0Mzs5NzAsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIHtcbiBcdGpzb25fd3JpdGVyX3QgKnd0ciA9IE5VTEwsICpidGZfd3RyID0gTlVMTDtcbiBcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuJiM0MztcdHN0cnVjdCBtYXBfZHVtcF9jdHggY3R4ID0ge307XG4gXHRpbnQgbmJfZmRzLCBpID0gMDtcbiBcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbiBcdGludCAqZmRzID0gTlVMTDtcbkBAIC05MTksOSAmIzQzOzk4OCwzNiBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0aWYgKG5iX2ZkcyBcdTAwM2MgMSlcbiBcdFx0Z290byBleGl0X2ZyZWU7XG4gXG4mIzQzO1x0aWYgKHJlY3Vyc2l2ZSkge1xuJiM0MztcdFx0Y3R4LnNlZW4gPSBoYXNobWFwX19uZXcoaGFzaF9mbl9mb3Jfa2V5X2FzX2lkLFxuJiM0MztcdFx0XHRcdFx0ZXF1YWxfZm5fZm9yX2tleV9hc19pZCwgTlVMTCk7XG4mIzQzO1x0XHRpZiAoSVNfRVJSKGN0eC5zZWVuKSkge1xuJiM0MztcdFx0XHRjdHguc2VlbiA9IE5VTEw7XG4mIzQzO1x0XHRcdHBfZXJyKFwmIzM0O2ZhaWxlZCB0byBjcmVhdGUgaGFzaG1hcCBmb3IgcmVjdXJzaXZlIGR1bXBcJiMzNDspO1xuJiM0MztcdFx0XHRnb3RvIGV4aXRfY2xvc2U7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRjdHguZmRzID0gXHUwMDI2ZmRzO1xuJiM0MztcdFx0Y3R4Lm5iX2ZkcyA9IFx1MDAyNm5iX2ZkcztcbiYjNDM7XHRcdC8qIFJlY29yZCB0aGUgc2VsZWN0ZWQgbWFwcyBiZWZvcmUgZGlzY292ZXJpbmcgYW55IGlubmVyIG1hcHMuICovXG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYl9mZHM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdGxlbiA9IHNpemVvZihpbmZvKTtcbiYjNDM7XHRcdFx0aWYgKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmRzW2ldLCBcdTAwMjZpbmZvLCBcdTAwMjZsZW4pKSB7XG4mIzQzO1x0XHRcdFx0cF9lcnIoXCYjMzQ7Y2FuJiMzOTt0IGdldCBtYXAgaW5mbzogJXNcJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0XHRcdFx0ZXJyID0gLTE7XG4mIzQzO1x0XHRcdFx0Z290byBleGl0X2Nsb3NlO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGVyciA9IGhhc2htYXBfX2FkZChjdHguc2VlbiwgaW5mby5pZCwgMCk7XG4mIzQzO1x0XHRcdGlmIChlcnIpIHtcbiYjNDM7XHRcdFx0XHRwX2VycihcJiMzNDtmYWlsZWQgdG8gcmVjb3JkIG1hcCBpZCAldTogJXNcJiMzNDssIGluZm8uaWQsXG4mIzQzO1x0XHRcdFx0ICAgICAgc3RyZXJyb3IoLWVycikpO1xuJiM0MztcdFx0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4gXHRpZiAoanNvbl9vdXRwdXQpIHtcbiBcdFx0d3RyID0ganNvbl93dHI7XG4tXHR9IGVsc2Uge1xuJiM0MztcdH0gZWxzZSBpZiAoIXJlY3Vyc2l2ZSkge1xuIFx0XHRpbnQgZG9fcGxhaW5fYnRmO1xuIFxuIFx0XHRkb19wbGFpbl9idGYgPSBtYXBzX2hhdmVfYnRmKGZkcywgbmJfZmRzKTtcbkBAIC05MzYsNyAmIzQzOzEwMzIsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR9XG4gXHR9XG4gXG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4mIzQzO1x0aWYgKHd0ciBcdTAwMjZcdTAwMjYgKG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmUpKVxuIFx0XHRqc29ud19zdGFydF9hcnJheSh3dHIpO1x0Lyogcm9vdCBhcnJheSAqL1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbmJfZmRzOyBpJiM0MzsmIzQzOykge1xuIFx0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFx1MDAyNmluZm8sIFx1MDAyNmxlbikpIHtcbkBAIC05NDQsMjIgJiM0MzsxMDQwLDI4IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdFx0ZXJyID0gLTE7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbi1cdFx0ZXJyID0gbWFwX2R1bXAoZmRzW2ldLCBcdTAwMjZpbmZvLCB3dHIsIG5iX2ZkcyBcdTAwM2UgMSk7XG4mIzQzO1x0XHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZSxcbiYjNDM7XHRcdFx0ICAgICAgIHJlY3Vyc2l2ZSA/IFx1MDAyNmN0eCA6IE5VTEwpO1xuIFx0XHRpZiAoIXd0ciBcdTAwMjZcdTAwMjYgaSAhPSBuYl9mZHMgLSAxKVxuIFx0XHRcdHByaW50ZihcJiMzNDtcXG5cJiMzNDspO1xuIFxuIFx0XHRpZiAoZXJyKVxuIFx0XHRcdGJyZWFrO1xuLVx0XHRjbG9zZShmZHNbaV0pO1xuJiM0MztcdFx0LyogS2VlcCBkaXNjb3ZlcmVkIG1hcHMgYWxpdmUgdW50aWwgdGhlIHJlY3Vyc2l2ZSBkdW1wIGlzIGNvbXBsZXRlLiAqL1xuJiM0MztcdFx0aWYgKCFyZWN1cnNpdmUpXG4mIzQzO1x0XHRcdGNsb3NlKGZkc1tpXSk7XG4gXHR9XG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4mIzQzO1x0aWYgKHd0ciBcdTAwMjZcdTAwMjYgKG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmUpKVxuIFx0XHRqc29ud19lbmRfYXJyYXkod3RyKTtcdC8qIHJvb3QgYXJyYXkgKi9cbiBcbiBcdGlmIChidGZfd3RyKVxuIFx0XHRqc29ud19kZXN0cm95KFx1MDAyNmJ0Zl93dHIpO1xuIGV4aXRfY2xvc2U6XG4mIzQzO1x0aWYgKHJlY3Vyc2l2ZSlcbiYjNDM7XHRcdGkgPSAwO1xuIFx0Zm9yICg7IGkgXHUwMDNjIG5iX2ZkczsgaSYjNDM7JiM0MzspXG4gXHRcdGNsb3NlKGZkc1tpXSk7XG4mIzQzO1x0aGFzaG1hcF9fZnJlZShjdHguc2Vlbik7XG4gZXhpdF9mcmVlOlxuIFx0ZnJlZShmZHMpO1xuIFx0ZnJlZV9idGZfdm1saW51eCgpO1xuQEAgLTE0ODQsNyAmIzQzOzE1ODYsNyBAQCBzdGF0aWMgaW50IGRvX2hlbHAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRcJiMzNDsgICAgICAgICAgICAgICAgIHRhc2tfc3RvcmFnZSB8IGJsb29tX2ZpbHRlciB8IHVzZXJfcmluZ2J1ZiB8IGNncnBfc3RvcmFnZSB8IGFyZW5hIHxcXG5cJiMzNDtcbiBcdFx0XCYjMzQ7ICAgICAgICAgICAgICAgICBpbnNuX2FycmF5IHwgcmhhc2ggfVxcblwmIzM0O1xuIFx0XHRcJiMzNDsgICAgICAgXCYjMzQ7IEhFTFBfU1BFQ19PUFRJT05TIFwmIzM0OyB8XFxuXCYjMzQ7XG4tXHRcdFwmIzM0OyAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfVxcblwmIzM0O1xuJiM0MztcdFx0XCYjMzQ7ICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB8IHstcnwtLXJlY3Vyc2l2ZX0gfVxcblwmIzM0O1xuIFx0XHRcJiMzNDtcJiMzNDssXG4gXHRcdGJpbl9uYW1lLCBhcmd2Wy0yXSk7XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uM2M0MjVkYmUyZDlkNFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jXG5AQCAtMCwwICYjNDM7MSwyNTIgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmdG9vbF9oZWxwZXJzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2J0Zi5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjZGVmaW5lIE9VVFBVVF9TSVpFIDgxOTJcbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGR1bXBfbWFwKF9fdTMyIGlkLCBjb25zdCBjaGFyICpvcHRpb25zLCBjaGFyICpvdXRwdXQpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCYjMzQ7JXMgbWFwIGR1bXAgaWQgJXVcJiMzNDssIG9wdGlvbnMsIGlkKTtcbiYjNDM7XHRtZW1zZXQob3V0cHV0LCAwLCBPVVRQVVRfU0laRSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBPVVRQVVRfU0laRSAtIDEpLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O2R1bXBfbWFwXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHQvKiBUaGUgaGVscGVyIGRvZXNuJiMzOTt0IHRlcm1pbmF0ZSBvciBzdHJpcCB0aGUgb3V0cHV0LiAqL1xuJiM0MztcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXCYjMzQ7XFxuXCYjMzQ7KV0gPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgX191MzIgbWFwX2lkKGludCBmZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuJiM0MztcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSwgXCYjMzQ7bWFwX2luZm9cJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0cmV0dXJuIGluZm8uaWQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgY291bnRfdG9rZW4oY29uc3QgY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICp0b2tlbilcbiYjNDM7e1xuJiM0MztcdGludCBjb3VudCA9IDA7XG4mIzQzO1xuJiM0MztcdHdoaWxlICgob3V0cHV0ID0gc3Ryc3RyKG91dHB1dCwgdG9rZW4pKSkge1xuJiM0MztcdFx0Y291bnQmIzQzOyYjNDM7O1xuJiM0MztcdFx0b3V0cHV0ICYjNDM7PSBzdHJsZW4odG9rZW4pO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gY291bnQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNoZWNrX3BsYWluKF9fdTMyIHJvb3RfaWQsIF9fdTMyIGlubmVyX2lkLCBjb25zdCBjaGFyICp0eXBlLFxuJiM0MztcdFx0XHRpbnQgZW50cmllcywgYm9vbCB0eXBlZClcbiYjNDM7e1xuJiM0MztcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgaGVhZGVyWzEyOF07XG4mIzQzO1x0Y2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge307XG4mIzQzO1x0Y29uc3QgY2hhciAqcm9vdCwgKmlubmVyO1xuJiM0MztcbiYjNDM7XHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwmIzM0Oy0tcmVjdXJzaXZlIG1hcCBkdW1wIGlkICV1XCYjMzQ7LCByb290X2lkKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksXG4mIzQzO1x0XHQgICAgICAgXCYjMzQ7cGxhaW5fZHVtcFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0c25wcmludGYoaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgXCYjMzQ7JXU6ICVzICBuYW1lIGR1bXBfb3V0ZXIgIFwmIzM0Oywgcm9vdF9pZCwgdHlwZSk7XG4mIzQzO1x0cm9vdCA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHJvb3QsIFwmIzM0O3BsYWluX3Jvb3RfaGVhZGVyXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRBU1NFUlRfRVEocm9vdCAtIG91dHB1dCwgMCwgXCYjMzQ7cGxhaW5fcm9vdF9maXJzdFwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXCYjMzQ7aW5uZXJfbWFwX2lkOlwmIzM0OyksIGVudHJpZXMsIFwmIzM0O3BsYWluX3JlZmVyZW5jZXNcJiMzNDspO1xuJiM0MztcdGlmIChlbnRyaWVzKSB7XG4mIzQzO1x0XHRzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCBcJiMzNDsldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICBcJiMzNDssIGlubmVyX2lkKTtcbiYjNDM7XHRcdGlubmVyID0gc3Ryc3RyKG91dHB1dCwgaGVhZGVyKTtcbiYjNDM7XHRcdGlmIChBU1NFUlRfT0tfUFRSKGlubmVyLCBcJiMzNDtwbGFpbl9pbm5lcl9oZWFkZXJcJiMzNDspKVxuJiM0MztcdFx0XHRBU1NFUlRfR1QoaW5uZXIgLSByb290LCAwLCBcJiMzNDtwbGFpbl9pbm5lcl9hZnRlcl9yb290XCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIGhlYWRlciksIDEsIFwmIzM0O3BsYWluX2lubmVyX29uY2VcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBcJiMzNDtGb3VuZCBcJiMzNDspLCBlbnRyaWVzIFx1MDAyNlx1MDAyNiAhdHlwZWQgPyAyIDogMSxcbiYjNDM7XHRcdCAgXCYjMzQ7cGxhaW5fbWFwX2NvdW50XCYjMzQ7KTtcbiYjNDM7XHRpZiAodHlwZWQpIHtcbiYjNDM7XHRcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgXCYjMzQ7XFxcJiMzNDtrZXlcXFwmIzM0OzogMFwmIzM0OywgXCYjMzQ7cGxhaW5fYnRmX2tleVwmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIFwmIzM0O1xcXCYjMzQ7dmFsdWVcXFwmIzM0OzogMTY4NDMwMDlcJiMzNDssIFwmIzM0O3BsYWluX2J0Zl92YWx1ZVwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X291dGVyKGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGludCBlbnRyaWVzLCBib29sIGVtcHR5X2lubmVyLFxuJiM0MztcdFx0ICAgICAgIGJvb2wgdHlwZWQpXG4mIzQzO3tcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBpbm5lcl9vcHRzKTtcbiYjNDM7XHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xuJiM0MztcdGNoYXIgb3V0ZXJbT1VUUFVUX1NJWkVdLCBpbm5lcltPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV07XG4mIzQzO1x0Y2hhciBleHBlY3RlZFtPVVRQVVRfU0laRSAqIDNdLCByZWZlcmVuY2VbNjRdO1xuJiM0MztcdGNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IGxpYmJwZl9icGZfbWFwX3R5cGVfc3RyKHR5cGUpO1xuJiM0MztcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xO1xuJiM0MztcdF9fdTMyIHJvb3RfaWQsIGlubmVyX2lkLCBrZXksIHZhbHVlID0gMHgwMTAxMDEwMTtcbiYjNDM7XG4mIzQzO1x0aWYgKHR5cGVkKSB7XG4mIzQzO1x0XHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCYjMzQ7Y3JlYXRlX2J0ZlwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhQVNTRVJUX0VRKGJ0Zl9fYWRkX2ludChidGYsIFwmIzM0O3Vuc2lnbmVkIGludFwmIzM0OywgNCwgMCksIDEsIFwmIzM0O2J0Zl9pbnRcJiMzNDspIHx8XG4mIzQzO1x0XHQgICAgIUFTU0VSVF9PSyhidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKSwgXCYjMzQ7bG9hZF9idGZcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGlubmVyX29wdHMuYnRmX2ZkID0gYnRmX19mZChidGYpO1xuJiM0MztcdFx0aW5uZXJfb3B0cy5idGZfa2V5X3R5cGVfaWQgPSAxO1xuJiM0MztcdFx0aW5uZXJfb3B0cy5idGZfdmFsdWVfdHlwZV9pZCA9IDE7XG4mIzQzO1x0fVxuJiM0MztcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwmIzM0O2R1bXBfaW5uZXJcJiMzNDssIHNpemVvZihrZXkpLFxuJiM0MztcdFx0XHRcdCAgc2l6ZW9mKHZhbHVlKSwgMiwgXHUwMDI2aW5uZXJfb3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFwmIzM0O2NyZWF0ZV9pbm5lclwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRrZXkgPSAwO1xuJiM0MztcdGlmICghZW1wdHlfaW5uZXIgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShpbm5lcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZ2YWx1ZSwgQlBGX0FOWSksXG4mIzQzO1x0XHQgICAgICAgXCYjMzQ7cG9wdWxhdGVfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcbiYjNDM7XHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsIFwmIzM0O2R1bXBfb3V0ZXJcJiMzNDssIHNpemVvZihrZXkpLCBzaXplb2YoX191MzIpLFxuJiM0MztcdFx0XHRcdCAzLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXCYjMzQ7Y3JlYXRlX291dGVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdC8qIFRoZSB1bnVzZWQgdGhpcmQgYXJyYXkgc2xvdCBhbHNvIGV4ZXJjaXNlcyBmYWlsZWQgbG9va3Vwcy4gKi9cbiYjNDM7XHRmb3IgKGtleSA9IDA7IGtleSBcdTAwM2MgZW50cmllczsga2V5JiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cG9wdWxhdGVfb3V0ZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTtcbiYjNDM7XHRpbm5lcl9pZCA9IG1hcF9pZChpbm5lcl9mZCk7XG4mIzQzO1x0aWYgKCFyb290X2lkIHx8ICFpbm5lcl9pZCB8fCAhZHVtcF9tYXAocm9vdF9pZCwgXCYjMzQ7LWpcJiMzNDssIG91dGVyKSB8fFxuJiM0MztcdCAgICAhZHVtcF9tYXAoaW5uZXJfaWQsIFwmIzM0Oy1qXCYjMzQ7LCBpbm5lcikpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX0VRKG91dGVyWzBdLCAmIzM5O1smIzM5OywgXCYjMzQ7ZGVmYXVsdF9hcnJheVwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCBcJiMzNDtcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6XCYjMzQ7KSwgMCwgXCYjMzQ7ZGVmYXVsdF9ub193cmFwcGVyXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFwmIzM0O1xcXCYjMzQ7aWRcXFwmIzM0OzpcJiMzNDspLCAwLCBcJiMzNDtkZWZhdWx0X25vX2hlYWRlclwmIzM0Oyk7XG4mIzQzO1x0c25wcmludGYocmVmZXJlbmNlLCBzaXplb2YocmVmZXJlbmNlKSwgXCYjMzQ7XFxcJiMzNDtpbm5lcl9tYXBfaWRcXFwmIzM0OzoldVwmIzM0OywgaW5uZXJfaWQpO1xuJiM0MztcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgcmVmZXJlbmNlKSwgZW50cmllcywgXCYjMzQ7ZGVmYXVsdF9yZWZlcmVuY2VzXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIWVudHJpZXMpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0ZXIsIFwmIzM0O1tdXCYjMzQ7LCBcJiMzNDtlbXB0eV9vdXRlcl9kZWZhdWx0XCYjMzQ7KTtcbiYjNDM7XHRpZiAoZW1wdHlfaW5uZXIpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEoaW5uZXIsIFwmIzM0O1tdXCYjMzQ7LCBcJiMzNDtlbXB0eV9pbm5lcl9kZWZhdWx0XCYjMzQ7KTtcbiYjNDM7XHRlbHNlIGlmICh0eXBlZClcbiYjNDM7XHRcdEFTU0VSVF9IQVNfU1VCU1RSKGlubmVyLCBcJiMzNDtcXFwmIzM0O2Zvcm1hdHRlZFxcXCYjMzQ7OntcXFwmIzM0O2tleVxcXCYjMzQ7OjAsXFxcJiMzNDt2YWx1ZVxcXCYjMzQ7OjE2ODQzMDA5fVwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgIFwmIzM0O3R5cGVkX2lubmVyXCYjMzQ7KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEoaW5uZXIsXG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7W3tcXFwmIzM0O2tleVxcXCYjMzQ7OltcXFwmIzM0OzB4MDBcXFwmIzM0OyxcXFwmIzM0OzB4MDBcXFwmIzM0OyxcXFwmIzM0OzB4MDBcXFwmIzM0OyxcXFwmIzM0OzB4MDBcXFwmIzM0O10sXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7XFxcJiMzNDt2YWx1ZVxcXCYjMzQ7OltcXFwmIzM0OzB4MDFcXFwmIzM0OyxcXFwmIzM0OzB4MDFcXFwmIzM0OyxcXFwmIzM0OzB4MDFcXFwmIzM0OyxcXFwmIzM0OzB4MDFcXFwmIzM0O119XVwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDtvcmRpbmFyeV9kZWZhdWx0XCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0LyogQ29tcGFyZSB0aGUgY29tcGxldGUgSlNPTiBkb2N1bWVudDogYSBmbGF0IGFycmF5IHdpdGggdGhlIHJvb3QgZmlyc3QsXG4mIzQzO1x0ICogb25lIGNvcHkgb2YgdGhlIHNoYXJlZCBpbm5lciBtYXAsIGFuZCB1bmNoYW5nZWQgZW50cnkgcmVwcmVzZW50YXRpb25zLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChlbnRyaWVzKVxuJiM0MztcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4mIzQzO1x0XHRcdCBcJiMzNDtbe1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0OyVzXFxcJiMzNDssXFxcJiMzNDtuYW1lXFxcJiMzNDs6XFxcJiMzNDtkdW1wX291dGVyXFxcJiMzNDssXCYjMzQ7XG4mIzQzO1x0XHRcdCBcJiMzNDtcXFwmIzM0O2ZsYWdzXFxcJiMzNDs6MCxcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6JXN9LHtcXFwmIzM0O2lkXFxcJiMzNDs6JXUsXFxcJiMzNDt0eXBlXFxcJiMzNDs6XFxcJiMzNDtoYXNoXFxcJiMzNDssXCYjMzQ7XG4mIzQzO1x0XHRcdCBcJiMzNDtcXFwmIzM0O25hbWVcXFwmIzM0OzpcXFwmIzM0O2R1bXBfaW5uZXJcXFwmIzM0OyxcXFwmIzM0O2ZsYWdzXFxcJiMzNDs6MCxcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6JXN9XVwmIzM0OyxcbiYjNDM7XHRcdFx0IHJvb3RfaWQsIHR5cGVfbmFtZSwgb3V0ZXIsIGlubmVyX2lkLCBpbm5lcik7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4mIzQzO1x0XHRcdCBcJiMzNDtbe1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0OyVzXFxcJiMzNDssXFxcJiMzNDtuYW1lXFxcJiMzNDs6XFxcJiMzNDtkdW1wX291dGVyXFxcJiMzNDssXCYjMzQ7XG4mIzQzO1x0XHRcdCBcJiMzNDtcXFwmIzM0O2ZsYWdzXFxcJiMzNDs6MCxcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6W119XVwmIzM0Oywgcm9vdF9pZCwgdHlwZV9uYW1lKTtcbiYjNDM7XHRpZiAoZHVtcF9tYXAocm9vdF9pZCwgXCYjMzQ7LWogLXJcJiMzNDssIG91dHB1dCkpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCYjMzQ7cmVjdXJzaXZlX2pzb25cJiMzNDspO1xuJiM0MztcdGlmIChkdW1wX21hcChyb290X2lkLCBcJiMzNDstLWpzb24gLS1yZWN1cnNpdmVcJiMzNDssIG91dHB1dCkpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCYjMzQ7cmVjdXJzaXZlX2xvbmdfb3B0aW9uc1wmIzM0Oyk7XG4mIzQzO1x0Y2hlY2tfcGxhaW4ocm9vdF9pZCwgaW5uZXJfaWQsIHR5cGVfbmFtZSwgZW50cmllcywgdHlwZWQpO1xuJiM0MztcbiYjNDM7XHQvKiBSZWN1cnNpb24gb24gYW4gb3JkaW5hcnkgbWFwIHN0aWxsIGVtaXRzIGEgc2luZ2xlIG1hcCBvYmplY3QuICovXG4mIzQzO1x0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4mIzQzO1x0XHQgXCYjMzQ7W3tcXFwmIzM0O2lkXFxcJiMzNDs6JXUsXFxcJiMzNDt0eXBlXFxcJiMzNDs6XFxcJiMzNDtoYXNoXFxcJiMzNDssXFxcJiMzNDtuYW1lXFxcJiMzNDs6XFxcJiMzNDtkdW1wX2lubmVyXFxcJiMzNDssXCYjMzQ7XG4mIzQzO1x0XHQgXCYjMzQ7XFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OiVzfV1cJiMzNDssIGlubmVyX2lkLCBpbm5lcik7XG4mIzQzO1x0aWYgKGR1bXBfbWFwKGlubmVyX2lkLCBcJiMzNDstaiAtclwmIzM0Oywgb3V0cHV0KSlcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcJiMzNDtvcmRpbmFyeV9yZWN1cnNpdmVcJiMzNDspO1xuJiM0MztvdXQ6XG4mIzQzO1x0aWYgKG91dGVyX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKG91dGVyX2ZkKTtcbiYjNDM7XHRpZiAoaW5uZXJfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UoaW5uZXJfZmQpO1xuJiM0MztcdGJ0Zl9fZnJlZShidGYpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X211bHRpcGxlX3Jvb3RzKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbiYjNDM7XHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIG5hbWVbQlBGX09CSl9OQU1FX0xFTl07XG4mIzQzO1x0Y2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge30sIGV4cGVjdGVkW09VVFBVVF9TSVpFICogNF0sIGVsZW1lbnRzW09VVFBVVF9TSVpFXTtcbiYjNDM7XHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHR5cGVzW10gPSB7IFwmIzM0O2hhc2hcJiMzNDssIFwmIzM0O2FycmF5X29mX21hcHNcJiMzNDssIFwmIzM0O2hhc2hfb2ZfbWFwc1wmIzM0OywgXCYjMzQ7aGFzaFwmIzM0OyB9O1xuJiM0MztcdGludCBmZHNbXSA9IHsgLTEsIC0xLCAtMSwgLTEgfTtcbiYjNDM7XHRfX3UzMiBpZHNbNF0sIGtleTtcbiYjNDM7XHRpbnQgaSwgbGVuID0gMDtcbiYjNDM7XG4mIzQzO1x0LyogU2VsZWN0IHRoZSBmaXJzdCBpbm5lciBtYXAgYW5kIGJvdGggb3V0ZXJzIGFzIHJvb3RzLiBUaGUgb3RoZXIgaW5uZXJcbiYjNDM7XHQgKiBtYXAgbXVzdCBiZSBhcHBlbmRlZCBhZnRlciBhbGwgdGhyZWUgcm9vdHMsIGV2ZW4gdGhvdWdoIGl0IGlzIGZvdW5kXG4mIzQzO1x0ICogd2hpbGUgZHVtcGluZyB0aGUgZmlyc3Qgb3V0ZXIuIEEgcHJvY2Vzcy1zcGVjaWZpYyBuYW1lIGF2b2lkcyBvdGhlclxuJiM0MztcdCAqIHRlc3RzJiMzOTsgbWFwcyBqb2luaW5nIHRoZSBzZWxlY3Rpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcJiMzNDtkdW1wXyV1XCYjMzQ7LCBnZXRwaWQoKSk7XG4mIzQzO1x0ZmRzWzBdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIG5hbWUsIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGZkc1swXSwgXCYjMzQ7Y3JlYXRlX3NlbGVjdGVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZkc1szXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcJiMzNDtkdW1wX2Rpc2NvdmVyZWRcJiMzNDssIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGZkc1szXSwgXCYjMzQ7Y3JlYXRlX2Rpc2NvdmVyZWRfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBmZHNbMF07XG4mIzQzO1x0ZmRzWzFdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIG5hbWUsIDQsIDQsIDIsIFx1MDAyNm9wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGZkc1sxXSwgXCYjMzQ7Y3JlYXRlX2FycmF5X3Jvb3RcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZmRzWzJdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXHUwMDI2b3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzJdLCBcJiMzNDtjcmVhdGVfaGFzaF9yb290XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZvciAoaSA9IDE7IGkgXHUwMDNjPSAyOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0a2V5ID0gMDtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCBcdTAwMjZrZXksIFx1MDAyNmZkc1swXSwgQlBGX0FOWSksXG4mIzQzO1x0XHRcdCAgICAgICBcJiMzNDtyZWZlcmVuY2Vfc2VsZWN0ZWRfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGtleSA9IDE7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXHUwMDI2a2V5LCBcdTAwMjZmZHNbM10sIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cmVmZXJlbmNlX2Rpc2NvdmVyZWRfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShmZHMpOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWRzW2ldID0gbWFwX2lkKGZkc1tpXSk7XG4mIzQzO1x0XHRpZiAoIWlkc1tpXSB8fCAhZHVtcF9tYXAoaWRzW2ldLCBcJiMzNDstalwmIzM0OywgZWxlbWVudHMpKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGxlbiAmIzQzOz0gc25wcmludGYoZXhwZWN0ZWQgJiM0MzsgbGVuLCBzaXplb2YoZXhwZWN0ZWQpIC0gbGVuLFxuJiM0MztcdFx0XHRcdFwmIzM0OyVze1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0OyVzXFxcJiMzNDssXFxcJiMzNDtuYW1lXFxcJiMzNDs6XFxcJiMzNDslc1xcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHRcdFwmIzM0O1xcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0Ozolc30lc1wmIzM0OyxcbiYjNDM7XHRcdFx0XHRpID8gXCYjMzQ7LFwmIzM0OyA6IFwmIzM0O1tcJiMzNDssIGlkc1tpXSwgdHlwZXNbaV0sXG4mIzQzO1x0XHRcdFx0aSA9PSAzID8gXCYjMzQ7ZHVtcF9kaXNjb3ZlcmVkXCYjMzQ7IDogbmFtZSwgZWxlbWVudHMsIGkgPT0gMyA/IFwmIzM0O11cJiMzNDsgOiBcJiMzNDtcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwmIzM0Oy1qIC1yIG1hcCBkdW1wIG5hbWUgJXNcJiMzNDssIG5hbWUpO1xuJiM0MztcdGlmIChBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxuJiM0MztcdFx0ICAgICAgXCYjMzQ7ZHVtcF9tdWx0aXBsZV9yb290c1wmIzM0OykpIHtcbiYjNDM7XHRcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXCYjMzQ7XFxuXCYjMzQ7KV0gPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwmIzM0O3Jvb3RzX2ZpcnN0X2FuZF9zZWVkX2RlZHVwXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO291dDpcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGZkcyk7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWYgKGZkc1tpXSBcdTAwM2U9IDApXG4mIzQzO1x0XHRcdGNsb3NlKGZkc1tpXSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9icGZ0b29sX21hcF9kdW1wKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDttdWx0aXBsZV9yb290c1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X211bHRpcGxlX3Jvb3RzKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7YXJyYXlfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2hhc2hfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7c2hhcmVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDIsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7ZW1wdHlfYXJyYXlfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2VtcHR5X2hhc2hfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7YnRmX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIHRydWUpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2VtcHR5X2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgdHJ1ZSwgZmFsc2UpO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDA6NTM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIGNvZGUgaW4gdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLCBhbmQgaXMgdGhlcmVmb3JlIG5vdCByZWxldmFudCBmb3Igc3l6a2FsbGVyIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYmRiNTZmMzQxZjIyNzI3NWIyOGQxYTEyNjEwYjFlYWQ1YjcyNDcwMgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDcgMDA6NTM6MzAgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdCBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0CmluZGV4IDVkYWYzZGU1Yzc0NDYuLmMxMzUzMzg2MDBlOGYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0CiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0CkBAIC0xNiw3ICYjNDM7MTYsNyBAQCBTWU5PUFNJUwogCiAqKmJwZnRvb2wqKiBbKk9QVElPTlMqXSAqKm1hcCoqICpDT01NQU5EKgogCi0qT1BUSU9OUyogOj0geyB8Q09NTU9OX09QVElPTlN8IHwgeyAqKi1mKiogfCAqKi0tYnBmZnMqKiB9IHwgeyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfQomIzQzOypPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfCB7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB8IHsgKiotcioqIHwgKiotLXJlY3Vyc2l2ZSoqIH0gfQogCiAqQ09NTUFORFMqIDo9CiB7ICoqc2hvdyoqIHwgKipsaXN0KiogfCAqKmNyZWF0ZSoqIHwgKipkdW1wKiogfCAqKnVwZGF0ZSoqIHwgKipsb29rdXAqKiB8ICoqZ2V0bmV4dCoqIHwKQEAgLTE3MCw2ICYjNDM7MTcwLDIzIEBAIE9QVElPTlMKICAgICBEbyBub3QgYXV0b21hdGljYWxseSBhdHRlbXB0IHRvIG1vdW50IGFueSB2aXJ0dWFsIGZpbGUgc3lzdGVtIChzdWNoIGFzCiAgICAgdHJhY2VmcyBvciBCUEYgdmlydHVhbCBmaWxlIHN5c3RlbSkgd2hlbiBuZWNlc3NhcnkuCiAKJiM0MzstciwgLS1yZWN1cnNpdmUKJiM0MzsgICAgQWxzbyBkdW1wIHRoZSBpbm5lciBtYXBzIHJlZmVyZW5jZWQgYnkgKiphcnJheV9vZl9tYXBzKiogYW5kICoqaGFzaF9vZl9tYXBzKioKJiM0MzsgICAgZW50cmllcyB3aGVuIHJ1bm5pbmcgKiptYXAgZHVtcCoqLiBFYWNoIG1hcCBpcyBkdW1wZWQgb25jZSwgZXZlbiBpZiBzZXZlcmFsCiYjNDM7ICAgIGVudHJpZXMgcmVmZXIgdG8gaXQuIFNlbGVjdGVkIG1hcHMgYXJlIGZvbGxvd2VkIGJ5IHRoZWlyIGlubmVyIG1hcHMuCiYjNDM7CiYjNDM7ICAgIFBsYWluIG91dHB1dCBpbmNsdWRlcyBhIGhlYWRlciBpZGVudGlmeWluZyBlYWNoIG1hcC4gT24gc3VjY2VzcywgSlNPTiBvdXRwdXQKJiM0MzsgICAgaXMgYWx3YXlzIGFuIGFycmF5IG9mIG1hcCBvYmplY3RzLCBlYWNoIGNvbnRhaW5pbmcgYW4gKippZCoqIGFuZCBhbgomIzQzOyAgICAqKmVsZW1lbnRzKiogYXJyYXksIGluY2x1ZGluZyB3aGVuIG9ubHkgb25lIG1hcCBpcyBkdW1wZWQuIE91dGVyIG1hcCBlbnRyaWVzCiYjNDM7ICAgIHJldGFpbiB0aGVpciAqKmlubmVyX21hcF9pZCoqIGZpZWxkLCB3aGljaCBpZGVudGlmaWVzIHRoZSBjb3JyZXNwb25kaW5nIGlubmVyCiYjNDM7ICAgIG1hcCBvYmplY3QuCiYjNDM7CiYjNDM7ICAgIFRoZSBkdW1wIGlzIG5vdCBhIHNuYXBzaG90OiBjb25jdXJyZW50IHVwZGF0ZXMgY2FuIGNoYW5nZSBtYXAgY29udGVudHMuCiYjNDM7ICAgIEZhaWx1cmUgdG8gb3BlbiBhIHJlZmVyZW5jZWQgaW5uZXIgbWFwIHN0b3BzIHRoZSBkdW1wIGFuZCByZXR1cm5zIGEgbm9uemVybwomIzQzOyAgICBleGl0IHN0YXR1cy4gT3V0cHV0IG1heSBjb250YWluIG1hcHMgb3IgZW50cmllcyBwcmludGVkIGJlZm9yZSB0aGUgZXJyb3IuCiYjNDM7ICAgIEluIEpTT04gbW9kZSwgYW4gZXJyb3IgZHVyaW5nIHRyYXZlcnNhbCBpcyBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGFuZCB0aGUKJiM0MzsgICAgZW5jbG9zaW5nIGFycmF5cyBhbmQgb2JqZWN0cyBhcmUgY2xvc2VkLgomIzQzOwogRVhBTVBMRVMKID09PT09PT09CiAqKiMgYnBmdG9vbCBtYXAgc2hvdyoqCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sCmluZGV4IDc1Y2JjYjUxMmViYWUuLjQ1YzMzNmQ2M2JlMGEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sCkBAIC0yNjEsNyAmIzQzOzI2MSw3IEBAIF9icGZ0b29sKCkKIAogICAgICMgRGVhbCB3aXRoIG9wdGlvbnMKICAgICBpZiBbWyAke3dvcmRzW2N3b3JkXX0gPT0gLSogXV07IHRoZW4KLSAgICAgICAgbG9jYWwgYz0mIzM5Oy0tdmVyc2lvbiAtLWpzb24gLS1wcmV0dHkgLS1icGZmcyAtLW1hcGNvbXBhdCAtLWRlYnVnIFwKJiM0MzsgICAgICAgIGxvY2FsIGM9JiMzOTstLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tcmVjdXJzaXZlIC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcCiAgICAgICAgICAgICAtLXVzZS1sb2FkZXIgLS1iYXNlLWJ0ZiAtLXNpZ24gLWkgLWsmIzM5OwogICAgICAgICBDT01QUkVQTFk9KCAkKCBjb21wZ2VuIC1XICYjMzQ7JGMmIzM0OyAtLSAmIzM0OyRjdXImIzM0OyApICkKICAgICAgICAgcmV0dXJuIDAKZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uYwppbmRleCBjOTFlMWE2ZTFhMWVjLi4yOTAyMWY0ZGQ0NTE4IDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jCkBAIC0yNiw2ICYjNDM7MjYsNyBAQCBzdGF0aWMgaW50ICgqbGFzdF9kb19oZWxwKShpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwoganNvbl93cml0ZXJfdCAqanNvbl93dHI7CiBib29sIHByZXR0eV9vdXRwdXQ7CiBib29sIGpzb25fb3V0cHV0OwomIzQzO2Jvb2wgcmVjdXJzaXZlOwogYm9vbCBzaG93X3Bpbm5lZDsKIGJvb2wgYmxvY2tfbW91bnQ7CiBib29sIHZlcmlmaWVyX2xvZ3M7CkBAIC00NTIsNiAmIzQzOzQ1Myw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJeyAmIzM0O2pzb24mIzM0OywJbm9fYXJndW1lbnQsCU5VTEwsCSYjMzk7aiYjMzk7IH0sCiAJCXsgJiMzNDtoZWxwJiMzNDssCW5vX2FyZ3VtZW50LAlOVUxMLAkmIzM5O2gmIzM5OyB9LAogCQl7ICYjMzQ7cHJldHR5JiMzNDssCW5vX2FyZ3VtZW50LAlOVUxMLAkmIzM5O3AmIzM5OyB9LAomIzQzOwkJeyAmIzM0O3JlY3Vyc2l2ZSYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTtyJiMzOTsgfSwKIAkJeyAmIzM0O3ZlcnNpb24mIzM0OywJbm9fYXJndW1lbnQsCU5VTEwsCSYjMzk7ViYjMzk7IH0sCiAJCXsgJiMzNDticGZmcyYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTtmJiMzOTsgfSwKIAkJeyAmIzM0O21hcGNvbXBhdCYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTttJiMzOTsgfSwKQEAgLTQ4NSw3ICYjNDM7NDg3LDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCWJpbl9uYW1lID0gJiMzNDticGZ0b29sJiMzNDs7CiAKIAlvcHRlcnIgPSAwOwotCXdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgJiMzNDtWaHBqZkxtbmRTaTprOkI6bCYjMzQ7LAomIzQzOwl3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICYjMzQ7VmhwanJmTG1uZFNpOms6QjpsJiMzNDssCiAJCQkJICBvcHRpb25zLCBOVUxMKSkgJmd0Oz0gMCkgewogCQlzd2l0Y2ggKG9wdCkgewogCQljYXNlICYjMzk7ViYjMzk7OgpAQCAtNTA3LDYgJiM0Mzs1MDksOSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCQl9CiAJCQlqc29ud19wcmV0dHkoanNvbl93dHIsIHByZXR0eV9vdXRwdXQpOwogCQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7ciYjMzk7OgomIzQzOwkJCXJlY3Vyc2l2ZSA9IHRydWU7CiYjNDM7CQkJYnJlYWs7CiAJCWNhc2UgJiMzOTtmJiMzOTs6CiAJCQlzaG93X3Bpbm5lZCA9IHRydWU7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaCBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaAppbmRleCA3OGI2ZTBlYmI4NWQ4Li5iNWRjNzk2MGNmNjgyIDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmgKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oCkBAIC04Myw2ICYjNDM7ODMsNyBAQCBleHRlcm4gY29uc3QgY2hhciAqYmluX25hbWU7CiAKIGV4dGVybiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjsKIGV4dGVybiBib29sIGpzb25fb3V0cHV0OwomIzQzO2V4dGVybiBib29sIHJlY3Vyc2l2ZTsKIGV4dGVybiBib29sIHNob3dfcGlubmVkOwogZXh0ZXJuIGJvb2wgc2hvd19waWRzOwogZXh0ZXJuIGJvb2wgYmxvY2tfbW91bnQ7CmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXAuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCmluZGV4IDY4NGE4ZmI3MjQxNDYuLjg1M2Y3NzViN2Q1MjkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCkBAIC03NDUsOCAmIzQzOzc0NSwxMCBAQCBzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAogCQkJIGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpCiB7CiAJaWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7Ci0JCXByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGVycm5vKTsKLQkJcmV0dXJuIC0xOwomIzQzOwkJaW50IGxvb2t1cF9lcnJubyA9IGVycm5vOwomIzQzOwomIzQzOwkJcHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgbG9va3VwX2Vycm5vKTsKJiM0MzsJCXJldHVybiAtbG9va3VwX2Vycm5vOwogCX0KIAogCWlmIChqc29uX291dHB1dCkgewpAQCAtODI2LDEyICYjNDM7ODI4LDUzIEBAIHN0YXRpYyB2b2lkIGZyZWVfbWFwX2t2X2J0ZihzdHJ1Y3QgYnRmICpidGYpCiAJCWJ0Zl9fZnJlZShidGYpOwogfQogCiYjNDM7c3RydWN0IG1hcF9kdW1wX2N0eCB7CiYjNDM7CXN0cnVjdCBoYXNobWFwICpzZWVuOwomIzQzOwlpbnQgKipmZHM7CiYjNDM7CWludCAqbmJfZmRzOwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGludCBjb2xsZWN0X2lubmVyX21hcChzdHJ1Y3QgbWFwX2R1bXBfY3R4ICpjdHgsIF9fdTMyIGlkKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX2dldF9mZF9ieV9pZF9vcHRzLCBvcHRzLAomIzQzOwkJLm9wZW5fZmxhZ3MgPSBCUEZfRl9SRE9OTFksCiYjNDM7CSk7CiYjNDM7CWludCAqZmRzLCBmZCwgZXJyOwomIzQzOwomIzQzOwlpZiAoaGFzaG1hcF9fZmluZChjdHgtJmd0O3NlZW4sIGlkLCBOVUxMKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlmZCA9IGJwZl9tYXBfZ2V0X2ZkX2J5X2lkX29wdHMoaWQsICZhbXA7b3B0cyk7CiYjNDM7CWlmIChmZCAmbHQ7IDApIHsKJiM0MzsJCXBfZXJyKCYjMzQ7Y2FuJiMzOTt0IG9wZW4gaW5uZXIgbWFwIGlkICV1OiAlcyYjMzQ7LCBpZCwgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwomIzQzOwlmZHMgPSByZWFsbG9jKCpjdHgtJmd0O2ZkcywgKCpjdHgtJmd0O25iX2ZkcyAmIzQzOyAxVUxMKSAqIHNpemVvZigqZmRzKSk7CiYjNDM7CWlmICghZmRzKSB7CiYjNDM7CQlwX2VycigmIzM0O21lbSBhbGxvYyBmYWlsZWQmIzM0Oyk7CiYjNDM7CQljbG9zZShmZCk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KJiM0MzsJKmN0eC0mZ3Q7ZmRzID0gZmRzOwomIzQzOwomIzQzOwllcnIgPSBoYXNobWFwX19hZGQoY3R4LSZndDtzZWVuLCBpZCwgMCk7CiYjNDM7CWlmIChlcnIpIHsKJiM0MzsJCXBfZXJyKCYjMzQ7ZmFpbGVkIHRvIHJlY29yZCBpbm5lciBtYXAgaWQgJXU6ICVzJiMzNDssIGlkLCBzdHJlcnJvcigtZXJyKSk7CiYjNDM7CQljbG9zZShmZCk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KJiM0MzsJZmRzWygqY3R4LSZndDtuYl9mZHMpJiM0MzsmIzQzO10gPSBmZDsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwogc3RhdGljIGludAogbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCi0JIGJvb2wgc2hvd19oZWFkZXIpCiYjNDM7CSBib29sIHNob3dfaGVhZGVyLCBzdHJ1Y3QgbWFwX2R1bXBfY3R4ICpjdHgpCiB7CiAJdm9pZCAqa2V5LCAqdmFsdWUsICpwcmV2X2tleTsKIAl1bnNpZ25lZCBpbnQgbnVtX2VsZW1zID0gMDsKJiM0MzsJanNvbl93cml0ZXJfdCAqcGxhaW5fYnRmX3d0ciA9IE5VTEw7CiAJc3RydWN0IGJ0ZiAqYnRmID0gTlVMTDsKIAlpbnQgZXJyOwogCkBAIC04NDUsNiAmIzQzOzg4OCwxNyBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0ciwKIAogCXByZXZfa2V5ID0gTlVMTDsKIAomIzQzOwlpZiAoY3R4ICZhbXA7JmFtcDsgIXd0ciAmYW1wOyZhbXA7IChpbmZvLSZndDtidGZfdmFsdWVfdHlwZV9pZCB8fAomIzQzOwkJCSAgICBpbmZvLSZndDtidGZfdm1saW51eF92YWx1ZV90eXBlX2lkKSkgewomIzQzOwkJcGxhaW5fYnRmX3d0ciA9IGdldF9idGZfd3JpdGVyKCk7CiYjNDM7CQlpZiAocGxhaW5fYnRmX3d0cikgewomIzQzOwkJCWlmIChzaG93X2hlYWRlcikKJiM0MzsJCQkJc2hvd19tYXBfaGVhZGVyX3BsYWluKGluZm8pOwomIzQzOwkJCXNob3dfaGVhZGVyID0gZmFsc2U7CiYjNDM7CQkJd3RyID0gcGxhaW5fYnRmX3d0cjsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwogCWlmICh3dHIpIHsKIAkJZXJyID0gZ2V0X21hcF9rdl9idGYoaW5mbywgJmFtcDtidGYpOwogCQlpZiAoZXJyKSB7CkBAIC04NzQsMTAgJiM0Mzs5MjgsMjIgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCiAJCWlmIChlcnIpIHsKIAkJCWlmIChlcnJubyA9PSBFTk9FTlQpCiAJCQkJZXJyID0gMDsKJiM0MzsJCQllbHNlIGlmIChjdHgpCiYjNDM7CQkJCXBfZXJyKCYjMzQ7Y2FuJiMzOTt0IGdldCBuZXh0IGtleSBmb3IgbWFwIGlkICV1OiAlcyYjMzQ7LAomIzQzOwkJCQkgICAgICBpbmZvLSZndDtpZCwgc3RyZXJyb3IoZXJybm8pKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmICghZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpKQomIzQzOwkJZXJyID0gZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpOwomIzQzOwkJaWYgKCFlcnIpIHsKIAkJCW51bV9lbGVtcyYjNDM7JiM0Mzs7CiYjNDM7CQkJaWYgKGN0eCAmYW1wOyZhbXA7IG1hcF9pc19tYXBfb2ZfbWFwcyhpbmZvLSZndDt0eXBlKSkgewomIzQzOwkJCQllcnIgPSBjb2xsZWN0X2lubmVyX21hcChjdHgsICooX191MzIgKil2YWx1ZSk7CiYjNDM7CQkJCWlmIChlcnIpCiYjNDM7CQkJCQlicmVhazsKJiM0MzsJCQl9CiYjNDM7CQl9IGVsc2UgaWYgKGN0eCAmYW1wOyZhbXA7IGVyciAhPSAtRU5PRU5UKSB7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiAJCXByZXZfa2V5ID0ga2V5OwogCX0KIApAQCAtODk0LDYgJiM0Mzs5NjAsOCBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0ciwKIAlmcmVlKGtleSk7CiAJZnJlZSh2YWx1ZSk7CiAJZnJlZV9tYXBfa3ZfYnRmKGJ0Zik7CiYjNDM7CWlmIChwbGFpbl9idGZfd3RyKQomIzQzOwkJanNvbndfZGVzdHJveSgmYW1wO3BsYWluX2J0Zl93dHIpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTkwMiw2ICYjNDM7OTcwLDcgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKIAlqc29uX3dyaXRlcl90ICp3dHIgPSBOVUxMLCAqYnRmX3d0ciA9IE5VTEw7CiAJc3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307CiYjNDM7CXN0cnVjdCBtYXBfZHVtcF9jdHggY3R4ID0ge307CiAJaW50IG5iX2ZkcywgaSA9IDA7CiAJX191MzIgbGVuID0gc2l6ZW9mKGluZm8pOwogCWludCAqZmRzID0gTlVMTDsKQEAgLTkxOSw5ICYjNDM7OTg4LDM2IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJaWYgKG5iX2ZkcyAmbHQ7IDEpCiAJCWdvdG8gZXhpdF9mcmVlOwogCiYjNDM7CWlmIChyZWN1cnNpdmUpIHsKJiM0MzsJCWN0eC5zZWVuID0gaGFzaG1hcF9fbmV3KGhhc2hfZm5fZm9yX2tleV9hc19pZCwKJiM0MzsJCQkJCWVxdWFsX2ZuX2Zvcl9rZXlfYXNfaWQsIE5VTEwpOwomIzQzOwkJaWYgKElTX0VSUihjdHguc2VlbikpIHsKJiM0MzsJCQljdHguc2VlbiA9IE5VTEw7CiYjNDM7CQkJcF9lcnIoJiMzNDtmYWlsZWQgdG8gY3JlYXRlIGhhc2htYXAgZm9yIHJlY3Vyc2l2ZSBkdW1wJiMzNDspOwomIzQzOwkJCWdvdG8gZXhpdF9jbG9zZTsKJiM0MzsJCX0KJiM0MzsJCWN0eC5mZHMgPSAmYW1wO2ZkczsKJiM0MzsJCWN0eC5uYl9mZHMgPSAmYW1wO25iX2ZkczsKJiM0MzsJCS8qIFJlY29yZCB0aGUgc2VsZWN0ZWQgbWFwcyBiZWZvcmUgZGlzY292ZXJpbmcgYW55IGlubmVyIG1hcHMuICovCiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgbmJfZmRzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWxlbiA9IHNpemVvZihpbmZvKTsKJiM0MzsJCQlpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sICZhbXA7aW5mbywgJmFtcDtsZW4pKSB7CiYjNDM7CQkJCXBfZXJyKCYjMzQ7Y2FuJiMzOTt0IGdldCBtYXAgaW5mbzogJXMmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJCQkJZXJyID0gLTE7CiYjNDM7CQkJCWdvdG8gZXhpdF9jbG9zZTsKJiM0MzsJCQl9CiYjNDM7CQkJZXJyID0gaGFzaG1hcF9fYWRkKGN0eC5zZWVuLCBpbmZvLmlkLCAwKTsKJiM0MzsJCQlpZiAoZXJyKSB7CiYjNDM7CQkJCXBfZXJyKCYjMzQ7ZmFpbGVkIHRvIHJlY29yZCBtYXAgaWQgJXU6ICVzJiMzNDssIGluZm8uaWQsCiYjNDM7CQkJCSAgICAgIHN0cmVycm9yKC1lcnIpKTsKJiM0MzsJCQkJZ290byBleGl0X2Nsb3NlOwomIzQzOwkJCX0KJiM0MzsJCX0KJiM0MzsJfQomIzQzOwogCWlmIChqc29uX291dHB1dCkgewogCQl3dHIgPSBqc29uX3d0cjsKLQl9IGVsc2UgewomIzQzOwl9IGVsc2UgaWYgKCFyZWN1cnNpdmUpIHsKIAkJaW50IGRvX3BsYWluX2J0ZjsKIAogCQlkb19wbGFpbl9idGYgPSBtYXBzX2hhdmVfYnRmKGZkcywgbmJfZmRzKTsKQEAgLTkzNiw3ICYjNDM7MTAzMiw3IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCX0KIAl9CiAKLQlpZiAod3RyICZhbXA7JmFtcDsgbmJfZmRzICZndDsgMSkKJiM0MzsJaWYgKHd0ciAmYW1wOyZhbXA7IChuYl9mZHMgJmd0OyAxIHx8IHJlY3Vyc2l2ZSkpCiAJCWpzb253X3N0YXJ0X2FycmF5KHd0cik7CS8qIHJvb3QgYXJyYXkgKi8KIAlmb3IgKGkgPSAwOyBpICZsdDsgbmJfZmRzOyBpJiM0MzsmIzQzOykgewogCQlpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sICZhbXA7aW5mbywgJmFtcDtsZW4pKSB7CkBAIC05NDQsMjIgJiM0MzsxMDQwLDI4IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCQllcnIgPSAtMTsKIAkJCWJyZWFrOwogCQl9Ci0JCWVyciA9IG1hcF9kdW1wKGZkc1tpXSwgJmFtcDtpbmZvLCB3dHIsIG5iX2ZkcyAmZ3Q7IDEpOwomIzQzOwkJZXJyID0gbWFwX2R1bXAoZmRzW2ldLCAmYW1wO2luZm8sIHd0ciwgbmJfZmRzICZndDsgMSB8fCByZWN1cnNpdmUsCiYjNDM7CQkJICAgICAgIHJlY3Vyc2l2ZSA/ICZhbXA7Y3R4IDogTlVMTCk7CiAJCWlmICghd3RyICZhbXA7JmFtcDsgaSAhPSBuYl9mZHMgLSAxKQogCQkJcHJpbnRmKCYjMzQ7XG4mIzM0Oyk7CiAKIAkJaWYgKGVycikKIAkJCWJyZWFrOwotCQljbG9zZShmZHNbaV0pOwomIzQzOwkJLyogS2VlcCBkaXNjb3ZlcmVkIG1hcHMgYWxpdmUgdW50aWwgdGhlIHJlY3Vyc2l2ZSBkdW1wIGlzIGNvbXBsZXRlLiAqLwomIzQzOwkJaWYgKCFyZWN1cnNpdmUpCiYjNDM7CQkJY2xvc2UoZmRzW2ldKTsKIAl9Ci0JaWYgKHd0ciAmYW1wOyZhbXA7IG5iX2ZkcyAmZ3Q7IDEpCiYjNDM7CWlmICh3dHIgJmFtcDsmYW1wOyAobmJfZmRzICZndDsgMSB8fCByZWN1cnNpdmUpKQogCQlqc29ud19lbmRfYXJyYXkod3RyKTsJLyogcm9vdCBhcnJheSAqLwogCiAJaWYgKGJ0Zl93dHIpCiAJCWpzb253X2Rlc3Ryb3koJmFtcDtidGZfd3RyKTsKIGV4aXRfY2xvc2U6CiYjNDM7CWlmIChyZWN1cnNpdmUpCiYjNDM7CQlpID0gMDsKIAlmb3IgKDsgaSAmbHQ7IG5iX2ZkczsgaSYjNDM7JiM0MzspCiAJCWNsb3NlKGZkc1tpXSk7CiYjNDM7CWhhc2htYXBfX2ZyZWUoY3R4LnNlZW4pOwogZXhpdF9mcmVlOgogCWZyZWUoZmRzKTsKIAlmcmVlX2J0Zl92bWxpbnV4KCk7CkBAIC0xNDg0LDcgJiM0MzsxNTg2LDcgQEAgc3RhdGljIGludCBkb19oZWxwKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJJiMzNDsgICAgICAgICAgICAgICAgIHRhc2tfc3RvcmFnZSB8IGJsb29tX2ZpbHRlciB8IHVzZXJfcmluZ2J1ZiB8IGNncnBfc3RvcmFnZSB8IGFyZW5hIHxcbiYjMzQ7CiAJCSYjMzQ7ICAgICAgICAgICAgICAgICBpbnNuX2FycmF5IHwgcmhhc2ggfVxuJiMzNDsKIAkJJiMzNDsgICAgICAgJiMzNDsgSEVMUF9TUEVDX09QVElPTlMgJiMzNDsgfFxuJiMzNDsKLQkJJiMzNDsgICAgICAgICAgICAgICAgICAgIHstZnwtLWJwZmZzfSB8IHstbnwtLW5vbW91bnR9IH1cbiYjMzQ7CiYjNDM7CQkmIzM0OyAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfCB7LXJ8LS1yZWN1cnNpdmV9IH1cbiYjMzQ7CiAJCSYjMzQ7JiMzNDssCiAJCWJpbl9uYW1lLCBhcmd2Wy0yXSk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4zYzQyNWRiZTJkOWQ0Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jCkBAIC0wLDAgJiM0MzsxLDI1MiBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGZ0b29sX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2J0Zi5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgT1VUUFVUX1NJWkUgODE5MgomIzQzOwomIzQzO3N0YXRpYyBib29sIGR1bXBfbWFwKF9fdTMyIGlkLCBjb25zdCBjaGFyICpvcHRpb25zLCBjaGFyICpvdXRwdXQpCiYjNDM7ewomIzQzOwljaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07CiYjNDM7CiYjNDM7CXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDslcyBtYXAgZHVtcCBpZCAldSYjMzQ7LCBvcHRpb25zLCBpZCk7CiYjNDM7CW1lbXNldChvdXRwdXQsIDAsIE9VVFBVVF9TSVpFKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBPVVRQVVRfU0laRSAtIDEpLAomIzQzOwkJICAgICAgICYjMzQ7ZHVtcF9tYXAmIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CS8qIFRoZSBoZWxwZXIgZG9lc24mIzM5O3QgdGVybWluYXRlIG9yIHN0cmlwIHRoZSBvdXRwdXQuICovCiYjNDM7CW91dHB1dFtzdHJjc3BuKG91dHB1dCwgJiMzNDtcbiYjMzQ7KV0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgX191MzIgbWFwX2lkKGludCBmZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9OwomIzQzOwlfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsICZhbXA7aW5mbywgJmFtcDtsZW4pLCAmIzM0O21hcF9pbmZvJiMzNDspKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CXJldHVybiBpbmZvLmlkOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGNvdW50X3Rva2VuKGNvbnN0IGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqdG9rZW4pCiYjNDM7ewomIzQzOwlpbnQgY291bnQgPSAwOwomIzQzOwomIzQzOwl3aGlsZSAoKG91dHB1dCA9IHN0cnN0cihvdXRwdXQsIHRva2VuKSkpIHsKJiM0MzsJCWNvdW50JiM0MzsmIzQzOzsKJiM0MzsJCW91dHB1dCAmIzQzOz0gc3RybGVuKHRva2VuKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gY291bnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNoZWNrX3BsYWluKF9fdTMyIHJvb3RfaWQsIF9fdTMyIGlubmVyX2lkLCBjb25zdCBjaGFyICp0eXBlLAomIzQzOwkJCWludCBlbnRyaWVzLCBib29sIHR5cGVkKQomIzQzO3sKJiM0MzsJY2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBoZWFkZXJbMTI4XTsKJiM0MzsJY2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge307CiYjNDM7CWNvbnN0IGNoYXIgKnJvb3QsICppbm5lcjsKJiM0MzsKJiM0MzsJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAmIzM0Oy0tcmVjdXJzaXZlIG1hcCBkdW1wIGlkICV1JiMzNDssIHJvb3RfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksCiYjNDM7CQkgICAgICAgJiMzNDtwbGFpbl9kdW1wJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCAmIzM0OyV1OiAlcyAgbmFtZSBkdW1wX291dGVyICAmIzM0Oywgcm9vdF9pZCwgdHlwZSk7CiYjNDM7CXJvb3QgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIocm9vdCwgJiMzNDtwbGFpbl9yb290X2hlYWRlciYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJQVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsICYjMzQ7cGxhaW5fcm9vdF9maXJzdCYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgJiMzNDtpbm5lcl9tYXBfaWQ6JiMzNDspLCBlbnRyaWVzLCAmIzM0O3BsYWluX3JlZmVyZW5jZXMmIzM0Oyk7CiYjNDM7CWlmIChlbnRyaWVzKSB7CiYjNDM7CQlzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCAmIzM0OyV1OiBoYXNoICBuYW1lIGR1bXBfaW5uZXIgICYjMzQ7LCBpbm5lcl9pZCk7CiYjNDM7CQlpbm5lciA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7CiYjNDM7CQlpZiAoQVNTRVJUX09LX1BUUihpbm5lciwgJiMzNDtwbGFpbl9pbm5lcl9oZWFkZXImIzM0OykpCiYjNDM7CQkJQVNTRVJUX0dUKGlubmVyIC0gcm9vdCwgMCwgJiMzNDtwbGFpbl9pbm5lcl9hZnRlcl9yb290JiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgaGVhZGVyKSwgMSwgJiMzNDtwbGFpbl9pbm5lcl9vbmNlJiMzNDspOwomIzQzOwl9CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsICYjMzQ7Rm91bmQgJiMzNDspLCBlbnRyaWVzICZhbXA7JmFtcDsgIXR5cGVkID8gMiA6IDEsCiYjNDM7CQkgICYjMzQ7cGxhaW5fbWFwX2NvdW50JiMzNDspOwomIzQzOwlpZiAodHlwZWQpIHsKJiM0MzsJCUFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgJiMzNDtcJiMzNDtrZXlcJiMzNDs6IDAmIzM0OywgJiMzNDtwbGFpbl9idGZfa2V5JiMzNDspOwomIzQzOwkJQVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCAmIzM0O1wmIzM0O3ZhbHVlXCYjMzQ7OiAxNjg0MzAwOSYjMzQ7LCAmIzM0O3BsYWluX2J0Zl92YWx1ZSYjMzQ7KTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X291dGVyKGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGludCBlbnRyaWVzLCBib29sIGVtcHR5X2lubmVyLAomIzQzOwkJICAgICAgIGJvb2wgdHlwZWQpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgaW5uZXJfb3B0cyk7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7CiYjNDM7CWNoYXIgb3V0ZXJbT1VUUFVUX1NJWkVdLCBpbm5lcltPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV07CiYjNDM7CWNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcmVmZXJlbmNlWzY0XTsKJiM0MzsJY29uc3QgY2hhciAqdHlwZV9uYW1lID0gbGliYnBmX2JwZl9tYXBfdHlwZV9zdHIodHlwZSk7CiYjNDM7CWludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xOwomIzQzOwlfX3UzMiByb290X2lkLCBpbm5lcl9pZCwga2V5LCB2YWx1ZSA9IDB4MDEwMTAxMDE7CiYjNDM7CiYjNDM7CWlmICh0eXBlZCkgewomIzQzOwkJYnRmID0gYnRmX19uZXdfZW1wdHkoKTsKJiM0MzsJCWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7Y3JlYXRlX2J0ZiYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgJiMzNDt1bnNpZ25lZCBpbnQmIzM0OywgNCwgMCksIDEsICYjMzQ7YnRmX2ludCYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksICYjMzQ7bG9hZF9idGYmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpbm5lcl9vcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTsKJiM0MzsJCWlubmVyX29wdHMuYnRmX2tleV90eXBlX2lkID0gMTsKJiM0MzsJCWlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxOwomIzQzOwl9CiYjNDM7CWlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsICYjMzQ7ZHVtcF9pbm5lciYjMzQ7LCBzaXplb2Yoa2V5KSwKJiM0MzsJCQkJICBzaXplb2YodmFsdWUpLCAyLCAmYW1wO2lubmVyX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgJiMzNDtjcmVhdGVfaW5uZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJa2V5ID0gMDsKJiM0MzsJaWYgKCFlbXB0eV9pbm5lciAmYW1wOyZhbXA7CiYjNDM7CSAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oaW5uZXJfZmQsICZhbXA7a2V5LCAmYW1wO3ZhbHVlLCBCUEZfQU5ZKSwKJiM0MzsJCSAgICAgICAmIzM0O3BvcHVsYXRlX2lubmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CW9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7CiYjNDM7CW91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUodHlwZSwgJiMzNDtkdW1wX291dGVyJiMzNDssIHNpemVvZihrZXkpLCBzaXplb2YoX191MzIpLAomIzQzOwkJCQkgMywgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQob3V0ZXJfZmQsICYjMzQ7Y3JlYXRlX291dGVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CS8qIFRoZSB1bnVzZWQgdGhpcmQgYXJyYXkgc2xvdCBhbHNvIGV4ZXJjaXNlcyBmYWlsZWQgbG9va3Vwcy4gKi8KJiM0MzsJZm9yIChrZXkgPSAwOyBrZXkgJmx0OyBlbnRyaWVzOyBrZXkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgJmFtcDtrZXksICZhbXA7aW5uZXJfZmQsIEJQRl9BTlkpLAomIzQzOwkJCSAgICAgICAmIzM0O3BvcHVsYXRlX291dGVyJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwlyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTsKJiM0MzsJaW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpOwomIzQzOwlpZiAoIXJvb3RfaWQgfHwgIWlubmVyX2lkIHx8ICFkdW1wX21hcChyb290X2lkLCAmIzM0Oy1qJiMzNDssIG91dGVyKSB8fAomIzQzOwkgICAgIWR1bXBfbWFwKGlubmVyX2lkLCAmIzM0Oy1qJiMzNDssIGlubmVyKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlBU1NFUlRfRVEob3V0ZXJbMF0sICYjMzk7WyYjMzk7LCAmIzM0O2RlZmF1bHRfYXJyYXkmIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgJiMzNDtcJiMzNDtlbGVtZW50c1wmIzM0OzomIzM0OyksIDAsICYjMzQ7ZGVmYXVsdF9ub193cmFwcGVyJiMzNDspOwomIzQzOwlBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsICYjMzQ7XCYjMzQ7aWRcJiMzNDs6JiMzNDspLCAwLCAmIzM0O2RlZmF1bHRfbm9faGVhZGVyJiMzNDspOwomIzQzOwlzbnByaW50ZihyZWZlcmVuY2UsIHNpemVvZihyZWZlcmVuY2UpLCAmIzM0O1wmIzM0O2lubmVyX21hcF9pZFwmIzM0OzoldSYjMzQ7LCBpbm5lcl9pZCk7CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgcmVmZXJlbmNlKSwgZW50cmllcywgJiMzNDtkZWZhdWx0X3JlZmVyZW5jZXMmIzM0Oyk7CiYjNDM7CWlmICghZW50cmllcykKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRlciwgJiMzNDtbXSYjMzQ7LCAmIzM0O2VtcHR5X291dGVyX2RlZmF1bHQmIzM0Oyk7CiYjNDM7CWlmIChlbXB0eV9pbm5lcikKJiM0MzsJCUFTU0VSVF9TVFJFUShpbm5lciwgJiMzNDtbXSYjMzQ7LCAmIzM0O2VtcHR5X2lubmVyX2RlZmF1bHQmIzM0Oyk7CiYjNDM7CWVsc2UgaWYgKHR5cGVkKQomIzQzOwkJQVNTRVJUX0hBU19TVUJTVFIoaW5uZXIsICYjMzQ7XCYjMzQ7Zm9ybWF0dGVkXCYjMzQ7OntcJiMzNDtrZXlcJiMzNDs6MCxcJiMzNDt2YWx1ZVwmIzM0OzoxNjg0MzAwOX0mIzM0OywKJiM0MzsJCQkJICAmIzM0O3R5cGVkX2lubmVyJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlBU1NFUlRfU1RSRVEoaW5uZXIsCiYjNDM7CQkJICAgICAmIzM0O1t7XCYjMzQ7a2V5XCYjMzQ7OltcJiMzNDsweDAwXCYjMzQ7LFwmIzM0OzB4MDBcJiMzNDssXCYjMzQ7MHgwMFwmIzM0OyxcJiMzNDsweDAwXCYjMzQ7XSwmIzM0OwomIzQzOwkJCSAgICAgJiMzNDtcJiMzNDt2YWx1ZVwmIzM0OzpbXCYjMzQ7MHgwMVwmIzM0OyxcJiMzNDsweDAxXCYjMzQ7LFwmIzM0OzB4MDFcJiMzNDssXCYjMzQ7MHgwMVwmIzM0O119XSYjMzQ7LAomIzQzOwkJCSAgICAgJiMzNDtvcmRpbmFyeV9kZWZhdWx0JiMzNDspOwomIzQzOwomIzQzOwkvKiBDb21wYXJlIHRoZSBjb21wbGV0ZSBKU09OIGRvY3VtZW50OiBhIGZsYXQgYXJyYXkgd2l0aCB0aGUgcm9vdCBmaXJzdCwKJiM0MzsJICogb25lIGNvcHkgb2YgdGhlIHNoYXJlZCBpbm5lciBtYXAsIGFuZCB1bmNoYW5nZWQgZW50cnkgcmVwcmVzZW50YXRpb25zLgomIzQzOwkgKi8KJiM0MzsJaWYgKGVudHJpZXMpCiYjNDM7CQlzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSwKJiM0MzsJCQkgJiMzNDtbe1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7JXNcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc30se1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7aGFzaFwmIzM0OywmIzM0OwomIzQzOwkJCSAmIzM0O1wmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF9pbm5lclwmIzM0OyxcJiMzNDtmbGFnc1wmIzM0OzowLFwmIzM0O2VsZW1lbnRzXCYjMzQ7OiVzfV0mIzM0OywKJiM0MzsJCQkgcm9vdF9pZCwgdHlwZV9uYW1lLCBvdXRlciwgaW5uZXJfaWQsIGlubmVyKTsKJiM0MzsJZWxzZQomIzQzOwkJc25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksCiYjNDM7CQkJICYjMzQ7W3tcJiMzNDtpZFwmIzM0OzoldSxcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0OyVzXCYjMzQ7LFwmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF9vdXRlclwmIzM0OywmIzM0OwomIzQzOwkJCSAmIzM0O1wmIzM0O2ZsYWdzXCYjMzQ7OjAsXCYjMzQ7ZWxlbWVudHNcJiMzNDs6W119XSYjMzQ7LCByb290X2lkLCB0eXBlX25hbWUpOwomIzQzOwlpZiAoZHVtcF9tYXAocm9vdF9pZCwgJiMzNDstaiAtciYjMzQ7LCBvdXRwdXQpKQomIzQzOwkJQVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsICYjMzQ7cmVjdXJzaXZlX2pzb24mIzM0Oyk7CiYjNDM7CWlmIChkdW1wX21hcChyb290X2lkLCAmIzM0Oy0tanNvbiAtLXJlY3Vyc2l2ZSYjMzQ7LCBvdXRwdXQpKQomIzQzOwkJQVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsICYjMzQ7cmVjdXJzaXZlX2xvbmdfb3B0aW9ucyYjMzQ7KTsKJiM0MzsJY2hlY2tfcGxhaW4ocm9vdF9pZCwgaW5uZXJfaWQsIHR5cGVfbmFtZSwgZW50cmllcywgdHlwZWQpOwomIzQzOwomIzQzOwkvKiBSZWN1cnNpb24gb24gYW4gb3JkaW5hcnkgbWFwIHN0aWxsIGVtaXRzIGEgc2luZ2xlIG1hcCBvYmplY3QuICovCiYjNDM7CXNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLAomIzQzOwkJICYjMzQ7W3tcJiMzNDtpZFwmIzM0OzoldSxcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0O2hhc2hcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX2lubmVyXCYjMzQ7LCYjMzQ7CiYjNDM7CQkgJiMzNDtcJiMzNDtmbGFnc1wmIzM0OzowLFwmIzM0O2VsZW1lbnRzXCYjMzQ7OiVzfV0mIzM0OywgaW5uZXJfaWQsIGlubmVyKTsKJiM0MzsJaWYgKGR1bXBfbWFwKGlubmVyX2lkLCAmIzM0Oy1qIC1yJiMzNDssIG91dHB1dCkpCiYjNDM7CQlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtvcmRpbmFyeV9yZWN1cnNpdmUmIzM0Oyk7CiYjNDM7b3V0OgomIzQzOwlpZiAob3V0ZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKG91dGVyX2ZkKTsKJiM0MzsJaWYgKGlubmVyX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShpbm5lcl9mZCk7CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X211bHRpcGxlX3Jvb3RzKHZvaWQpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTsKJiM0MzsJY2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBuYW1lW0JQRl9PQkpfTkFNRV9MRU5dOwomIzQzOwljaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fSwgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiA0XSwgZWxlbWVudHNbT1VUUFVUX1NJWkVdOwomIzQzOwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHR5cGVzW10gPSB7ICYjMzQ7aGFzaCYjMzQ7LCAmIzM0O2FycmF5X29mX21hcHMmIzM0OywgJiMzNDtoYXNoX29mX21hcHMmIzM0OywgJiMzNDtoYXNoJiMzNDsgfTsKJiM0MzsJaW50IGZkc1tdID0geyAtMSwgLTEsIC0xLCAtMSB9OwomIzQzOwlfX3UzMiBpZHNbNF0sIGtleTsKJiM0MzsJaW50IGksIGxlbiA9IDA7CiYjNDM7CiYjNDM7CS8qIFNlbGVjdCB0aGUgZmlyc3QgaW5uZXIgbWFwIGFuZCBib3RoIG91dGVycyBhcyByb290cy4gVGhlIG90aGVyIGlubmVyCiYjNDM7CSAqIG1hcCBtdXN0IGJlIGFwcGVuZGVkIGFmdGVyIGFsbCB0aHJlZSByb290cywgZXZlbiB0aG91Z2ggaXQgaXMgZm91bmQKJiM0MzsJICogd2hpbGUgZHVtcGluZyB0aGUgZmlyc3Qgb3V0ZXIuIEEgcHJvY2Vzcy1zcGVjaWZpYyBuYW1lIGF2b2lkcyBvdGhlcgomIzQzOwkgKiB0ZXN0cyYjMzk7IG1hcHMgam9pbmluZyB0aGUgc2VsZWN0aW9uLgomIzQzOwkgKi8KJiM0MzsJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAmIzM0O2R1bXBfJXUmIzM0OywgZ2V0cGlkKCkpOwomIzQzOwlmZHNbMF0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgbmFtZSwgNCwgNCwgMSwgTlVMTCk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGZkc1swXSwgJiMzNDtjcmVhdGVfc2VsZWN0ZWRfaW5uZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZmRzWzNdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsICYjMzQ7ZHVtcF9kaXNjb3ZlcmVkJiMzNDssIDQsIDQsIDEsIE5VTEwpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChmZHNbM10sICYjMzQ7Y3JlYXRlX2Rpc2NvdmVyZWRfaW5uZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJb3B0cy5pbm5lcl9tYXBfZmQgPSBmZHNbMF07CiYjNDM7CWZkc1sxXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBuYW1lLCA0LCA0LCAyLCAmYW1wO29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChmZHNbMV0sICYjMzQ7Y3JlYXRlX2FycmF5X3Jvb3QmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZmRzWzJdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoZmRzWzJdLCAmIzM0O2NyZWF0ZV9oYXNoX3Jvb3QmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZm9yIChpID0gMTsgaSAmbHQ7PSAyOyBpJiM0MzsmIzQzOykgewomIzQzOwkJa2V5ID0gMDsKJiM0MzsJCWlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCAmYW1wO2tleSwgJmFtcDtmZHNbMF0sIEJQRl9BTlkpLAomIzQzOwkJCSAgICAgICAmIzM0O3JlZmVyZW5jZV9zZWxlY3RlZF9pbm5lciYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWtleSA9IDE7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgJmFtcDtrZXksICZhbXA7ZmRzWzNdLCBCUEZfQU5ZKSwKJiM0MzsJCQkgICAgICAgJiMzNDtyZWZlcmVuY2VfZGlzY292ZXJlZF9pbm5lciYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShmZHMpOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWRzW2ldID0gbWFwX2lkKGZkc1tpXSk7CiYjNDM7CQlpZiAoIWlkc1tpXSB8fCAhZHVtcF9tYXAoaWRzW2ldLCAmIzM0Oy1qJiMzNDssIGVsZW1lbnRzKSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWxlbiAmIzQzOz0gc25wcmludGYoZXhwZWN0ZWQgJiM0MzsgbGVuLCBzaXplb2YoZXhwZWN0ZWQpIC0gbGVuLAomIzQzOwkJCQkmIzM0OyVze1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7JXNcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDslc1wmIzM0OywmIzM0OwomIzQzOwkJCQkmIzM0O1wmIzM0O2ZsYWdzXCYjMzQ7OjAsXCYjMzQ7ZWxlbWVudHNcJiMzNDs6JXN9JXMmIzM0OywKJiM0MzsJCQkJaSA/ICYjMzQ7LCYjMzQ7IDogJiMzNDtbJiMzNDssIGlkc1tpXSwgdHlwZXNbaV0sCiYjNDM7CQkJCWkgPT0gMyA/ICYjMzQ7ZHVtcF9kaXNjb3ZlcmVkJiMzNDsgOiBuYW1lLCBlbGVtZW50cywgaSA9PSAzID8gJiMzNDtdJiMzNDsgOiAmIzM0OyYjMzQ7KTsKJiM0MzsJfQomIzQzOwlzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksICYjMzQ7LWogLXIgbWFwIGR1bXAgbmFtZSAlcyYjMzQ7LCBuYW1lKTsKJiM0MzsJaWYgKEFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksCiYjNDM7CQkgICAgICAmIzM0O2R1bXBfbXVsdGlwbGVfcm9vdHMmIzM0OykpIHsKJiM0MzsJCW91dHB1dFtzdHJjc3BuKG91dHB1dCwgJiMzNDtcbiYjMzQ7KV0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CQlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtyb290c19maXJzdF9hbmRfc2VlZF9kZWR1cCYjMzQ7KTsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IEFSUkFZX1NJWkUoZmRzKTsgaSYjNDM7JiM0MzspCiYjNDM7CQlpZiAoZmRzW2ldICZndDs9IDApCiYjNDM7CQkJY2xvc2UoZmRzW2ldKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2R1bXAodm9pZCkKJiM0Mzt7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bXVsdGlwbGVfcm9vdHMmIzM0OykpCiYjNDM7CQl0ZXN0X211bHRpcGxlX3Jvb3RzKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7YXJyYXlfb2ZfbWFwcyYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7aGFzaF9vZl9tYXBzJiMzNDspKQomIzQzOwkJdGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3NoYXJlZF9pbm5lciYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDIsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7ZW1wdHlfYXJyYXlfb2ZfbWFwcyYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7ZW1wdHlfaGFzaF9vZl9tYXBzJiMzNDspKQomIzQzOwkJdGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2J0Zl9pbm5lciYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2VtcHR5X2lubmVyJiMzNDspKQomIzQzOwkJdGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCB0cnVlLCBmYWxzZSk7CiYjNDM7fQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMDo1MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDg2OQoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDM3MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFBhdGNoOiBXb3J0aEZ1enppbmc9ZmFsc2U/KioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIFRoZSBpbnN0cnVjdGlvbnMgYXJlIGNsZWFyOiB0aGUgY2hhbmdlcyBhcmUgKmFscmVhZHkqIGluIG15IHdvcmtzcGFjZSBhcyB0aGUgSEVBRCBjb21taXQuIE15IHRhc2sgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgcGF0Y2ggd2FycmFudHMgZnV6emluZyBvciBpZiBpdCBjYW4gYmUgc2FmZWx5IGlnbm9yZWQgKGkuZS4sIGBXb3J0aEZ1enppbmc9ZmFsc2VgKS4gU2VjdGlvbiAyIGRpY3RhdGVzIHdoZW4gd2UgY2FuIGJ5cGFzcyBmdXp6aW5nLiBUaGUga2V5IGNyaXRlcmlhIGZvciBgV29ydGhGdXp6aW5nPWZhbHNlYCBhcmUgbm9uLWtlcm5lbCwgbm9uLWV4ZWN1dGFibGUgY2hhbmdlcyB0aGF0IGRvbiYjMzk7dCBpbXBhY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZS4gVGhpcyBpbmNsdWRlcyBkb2N1bWVudGF0aW9uLCBjb21tZW50cywgdXNlci1zcGFjZSB0b29scywgYnVpbGQgc3lzdGVtIGNoYW5nZXMgdGhhdCBkb24mIzM5O3QgYWx0ZXIgdGhlIEMgbG9naWMsIHVucmVhY2hhYmxlIGhhcmR3YXJlLCBhbmQgdW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzLgoKTm93LCBsZXQmIzM5O3MgbG9vayBhdCB0aGUgZGlmZi4gSSBzZWUgdGhlIG1vZGlmaWVkIGZpbGVzIGFyZSBhbGwgbG9jYXRlZCBpbiBgdG9vbHMvYCwgc3BlY2lmaWNhbGx5IHdpdGhpbiBgdG9vbHMvYnBmL2JwZnRvb2wvYCBhbmQgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9gLiBOb3RoaW5nIGp1bXBzIG91dCBhcyBrZXJuZWwtbGV2ZWwgY29kZS4gIFdlIGhhdmUgZG9jdW1lbnRhdGlvbiAoYGJwZnRvb2wtbWFwLnJzdGApLCBzaGVsbCBjb21wbGV0aW9uIHNjcmlwdHMgKGBicGZ0b29sYCB3aXRoaW4gYGJhc2gtY29tcGxldGlvbmApLCB0aGUgbWFpbiBzb3VyY2UgZmlsZXMgKGBtYWluLmNgLCBgbWFpbi5oYCwgYW5kIGBtYXAuY2ApLCBhbmQgYSBzZWxmdGVzdCAoYGJwZnRvb2xfbWFwX2R1bXAuY2ApLiBJdCYjMzk7cyBhbGwgQlBGIHRvb2xpbmcsIHdoaWNoIGNvbmZpcm1zIG15IGluaXRpYWwgaW1wcmVzc2lvbi4gTm9uZSBvZiB0aGVzZSBmaWxlcyBkaXJlY3RseSBtb2RpZnkga2VybmVsIGNvZGUgb3IgdGhlIGtlcm5lbCBpbWFnZSBpdHNlbGYgKGB2bWxpbnV4YCkgb3Iga2VybmVsIG1vZHVsZXMuCgpKdXN0IHRvIGJlIGFic29sdXRlbHkgc3VyZSwgSSYjMzk7bGwgcXVpY2tseSBkb3VibGUtY2hlY2sgdGhhdCB0aGlzIEhFQUQgY29tbWl0ICpvbmx5KiBjb250YWlucyB0aGVzZSBmaWxlczsgbm8gc25lYWt5IGtlcm5lbCBjb2RlIGNyZWVwZWQgaW4uIEJhcnJpbmcgdGhhdCwgSSYjMzk7bSBjb25maWRlbnQgaW4gY2xhc3NpZnlpbmcgdGhpcyBhcyBgV29ydGhGdXp6aW5nPWZhbHNlYC4gVGhpcyBwYXRjaCBpcyBzYWZlIHRvIGlnbm9yZSBpbiB0ZXJtcyBvZiBmdXp6aW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDAwOjUzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0Oy4qJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7dG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7XG5GdWxsIG91dHB1dCBpcyB0b28gbG9uZywgc2hvd2luZyA1MDAgb3V0IG9mIDE2MjAgbGluZXMuXG5Vc2UgbW9yZSBwcmVjaXNlIGV4cHJlc3Npb24gaWYgcG9zc2libGUuXG5cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE6Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IChHUEwtMi4wLW9ubHkgT1IgQlNELTItQ2xhdXNlKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjovKiBDb3B5cmlnaHQgKEMpIDIwMTctMjAxOCBOZXRyb25vbWUgU3lzdGVtcywgSW5jLiAqL1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ6I2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTojaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2OiNpbmNsdWRlIFx1MDAzY2xpbnV4L2Vyci5oXHUwMDNlXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo3OiNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4OiNpbmNsdWRlIFx1MDAzY25ldC9pZi5oXHUwMDNlXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo5OiNpbmNsdWRlIFx1MDAzY3N0ZGJvb2wuaFx1MDAzZVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTA6I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTE6I2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEyOiNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMzojaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTQ6I2luY2x1ZGUgXHUwMDNjc3lzL3R5cGVzLmhcdTAwM2VcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE1OiNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTc6I2luY2x1ZGUgXHUwMDNjYnBmL2JwZi5oXHUwMDNlXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxODojaW5jbHVkZSBcdTAwM2NicGYvYnRmLmhcdTAwM2VcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5OiNpbmNsdWRlIFx1MDAzY2JwZi9oYXNobWFwLmhcdTAwM2VcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIwOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjE6I2luY2x1ZGUgXCYjMzQ7anNvbl93cml0ZXIuaFwmIzM0O1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjI6I2luY2x1ZGUgXCYjMzQ7bWFpbi5oXCYjMzQ7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMzpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI0OnN0YXRpYyBzdHJ1Y3QgaGFzaG1hcCAqbWFwX3RhYmxlO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjU6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNjpzdGF0aWMgYm9vbCBtYXBfaXNfcGVyX2NwdShfX3UzMiB0eXBlKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjc6e1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjg6XHRyZXR1cm4gdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0hBU0ggfHxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5Olx0ICAgICAgIHR5cGUgPT0gQlBGX01BUF9UWVBFX1BFUkNQVV9BUlJBWSB8fFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzA6XHQgICAgICAgdHlwZSA9PSBCUEZfTUFQX1RZUEVfTFJVX1BFUkNQVV9IQVNIIHx8XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMTpcdCAgICAgICB0eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfQ0dST1VQX1NUT1JBR0U7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMjp9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMzpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0OnN0YXRpYyBib29sIG1hcF9pc19tYXBfb2ZfbWFwcyhfX3UzMiB0eXBlKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzU6e1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzY6XHRyZXR1cm4gdHlwZSA9PSBCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUyB8fFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzc6XHQgICAgICAgdHlwZSA9PSBCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzg6fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzk6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MDpzdGF0aWMgYm9vbCBtYXBfaXNfbWFwX29mX3Byb2dzKF9fdTMyIHR5cGUpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MTp7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MjpcdHJldHVybiB0eXBlID09IEJQRl9NQVBfVFlQRV9QUk9HX0FSUkFZO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDM6fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQ6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTpzdGF0aWMgaW50IG1hcF90eXBlX2Zyb21fc3RyKGNvbnN0IGNoYXIgKnR5cGUpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Njp7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NzpcdGNvbnN0IGNoYXIgKm1hcF90eXBlX3N0cjtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ4Olx0dW5zaWduZWQgaW50IGk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OTpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjUwOlx0Zm9yIChpID0gMDsgOyBpJiM0MzsmIzQzOykge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTE6XHRcdG1hcF90eXBlX3N0ciA9IGxpYmJwZl9icGZfbWFwX3R5cGVfc3RyKGkpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTI6XHRcdGlmICghbWFwX3R5cGVfc3RyKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTM6XHRcdFx0YnJlYWs7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo1NDpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjU1Olx0XHQvKiBEb24mIzM5O3QgYWxsb3cgcHJlZml4aW5nIGluIGNhc2Ugb2YgcG9zc2libGUgZnV0dXJlIHNoYWRvd2luZyAqL1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTY6XHRcdGlmICghc3RyY21wKG1hcF90eXBlX3N0ciwgdHlwZSkpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo1NzpcdFx0XHRyZXR1cm4gaTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjU4Olx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTk6XHRyZXR1cm4gLTE7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2MDp9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2MTpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjYyOnN0YXRpYyB2b2lkICphbGxvY192YWx1ZShzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NjM6e1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NjQ6XHRpZiAobWFwX2lzX3Blcl9jcHUoaW5mby1cdTAwM2V0eXBlKSlcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjY1Olx0XHRyZXR1cm4gbWFsbG9jKHJvdW5kX3VwKGluZm8tXHUwMDNldmFsdWVfc2l6ZSwgOCkgKlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NjY6XHRcdFx0ICAgICAgZ2V0X3Bvc3NpYmxlX2NwdXMoKSk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2NzpcdGVsc2VcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjY4Olx0XHRyZXR1cm4gbWFsbG9jKGluZm8tXHUwMDNldmFsdWVfc2l6ZSk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2OTp9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo3MDpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjcxOnN0YXRpYyBpbnQgZG9fZHVtcF9idGYoY29uc3Qgc3RydWN0IGJ0Zl9kdW1wZXIgKmQsXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo3MjpcdFx0ICAgICAgIHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCB2b2lkICprZXksXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo3MzpcdFx0ICAgICAgIHZvaWQgKnZhbHVlKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NzQ6e1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NzU6XHRfX3UzMiB2YWx1ZV9pZDtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjc2Olx0aW50IHJldCA9IDA7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo3NzpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjc4Olx0Lyogc3RhcnQgb2Yga2V5LXZhbHVlIHBhaXIgKi9cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjc5Olx0anNvbndfc3RhcnRfb2JqZWN0KGQtXHUwMDNlancpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6ODA6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4MTpcdGlmIChtYXBfaW5mby1cdTAwM2VidGZfa2V5X3R5cGVfaWQpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjgyOlx0XHRqc29ud19uYW1lKGQtXHUwMDNlancsIFwmIzM0O2tleVwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4MzpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjg0Olx0XHRyZXQgPSBidGZfZHVtcGVyX3R5cGUoZCwgbWFwX2luZm8tXHUwMDNlYnRmX2tleV90eXBlX2lkLCBrZXkpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6ODU6XHRcdGlmIChyZXQpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4NjpcdFx0XHRnb3RvIGVycl9lbmRfb2JqO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6ODc6XHR9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4ODpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjg5Olx0dmFsdWVfaWQgPSBtYXBfaW5mby1cdTAwM2VidGZfdm1saW51eF92YWx1ZV90eXBlX2lkID9cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjkwOlx0XHQ6IG1hcF9pbmZvLVx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6OTE6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo5MjpcdGlmICghbWFwX2lzX3Blcl9jcHUobWFwX2luZm8tXHUwMDNldHlwZSkpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjkzOlx0XHRqc29ud19uYW1lKGQtXHUwMDNlancsIFwmIzM0O3ZhbHVlXCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjk0Olx0XHRyZXQgPSBidGZfZHVtcGVyX3R5cGUoZCwgdmFsdWVfaWQsIHZhbHVlKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjk1Olx0fSBlbHNlIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjk2Olx0XHR1bnNpZ25lZCBpbnQgaSwgbiwgc3RlcDtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjk3OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6OTg6XHRcdGpzb253X25hbWUoZC1cdTAwM2VqdywgXCYjMzQ7dmFsdWVzXCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjk5Olx0XHRqc29ud19zdGFydF9hcnJheShkLVx1MDAzZWp3KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwMDpcdFx0biA9IGdldF9wb3NzaWJsZV9jcHVzKCk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMDE6XHRcdHN0ZXAgPSByb3VuZF91cChtYXBfaW5mby1cdTAwM2V2YWx1ZV9zaXplLCA4KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwMjpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSYjNDM7JiM0MzspIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwMzpcdFx0XHRqc29ud19zdGFydF9vYmplY3QoZC1cdTAwM2Vqdyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMDQ6XHRcdFx0anNvbndfaW50X2ZpZWxkKGQtXHUwMDNlancsIFwmIzM0O2NwdVwmIzM0OywgaSk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMDU6XHRcdFx0anNvbndfbmFtZShkLVx1MDAzZWp3LCBcJiMzNDt2YWx1ZVwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMDY6XHRcdFx0cmV0ID0gYnRmX2R1bXBlcl90eXBlKGQsIHZhbHVlX2lkLCB2YWx1ZSAmIzQzOyBpICogc3RlcCk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMDc6XHRcdFx0anNvbndfZW5kX29iamVjdChkLVx1MDAzZWp3KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwODpcdFx0XHRpZiAocmV0KVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTA5Olx0XHRcdFx0YnJlYWs7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMTA6XHRcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjExMTpcdFx0anNvbndfZW5kX2FycmF5KGQtXHUwMDNlancpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTEyOlx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTEzOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTE0OmVycl9lbmRfb2JqOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTE1Olx0LyogZW5kIG9mIGtleS12YWx1ZSBwYWlyICovXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMTY6XHRqc29ud19lbmRfb2JqZWN0KGQtXHUwMDNlancpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTE3OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTE4Olx0cmV0dXJuIHJldDtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjExOTp9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMjA6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMjE6c3RhdGljIGpzb25fd3JpdGVyX3QgKmdldF9idGZfd3JpdGVyKHZvaWQpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMjI6e1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTIzOlx0anNvbl93cml0ZXJfdCAqancgPSBqc29ud19uZXcoc3Rkb3V0KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEyNDpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEyNTpcdGlmICghancpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMjY6XHRcdHJldHVybiBOVUxMO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTI3Olx0anNvbndfcHJldHR5KGp3LCB0cnVlKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEyODpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEyOTpcdHJldHVybiBqdztcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEzMDp9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMzE6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMzI6c3RhdGljIHZvaWQgcHJpbnRfZW50cnlfanNvbihzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCB1bnNpZ25lZCBjaGFyICprZXksXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMzM6XHRcdFx0ICAgICB1bnNpZ25lZCBjaGFyICp2YWx1ZSwgc3RydWN0IGJ0ZiAqYnRmKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTM0OntcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEzNTpcdGpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMzY6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMzc6XHRpZiAoIW1hcF9pc19wZXJfY3B1KGluZm8tXHUwMDNldHlwZSkpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEzODpcdFx0anNvbndfbmFtZShqc29uX3d0ciwgXCYjMzQ7a2V5XCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEzOTpcdFx0cHJpbnRfaGV4X2RhdGFfanNvbihrZXksIGluZm8tXHUwMDNla2V5X3NpemUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTQwOlx0XHRqc29ud19uYW1lKGpzb25fd3RyLCBcJiMzNDt2YWx1ZVwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNDE6XHRcdHByaW50X2hleF9kYXRhX2pzb24odmFsdWUsIGluZm8tXHUwMDNldmFsdWVfc2l6ZSk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNDI6XHRcdGlmIChtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cdTAwM2V0eXBlKSlcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE0MzpcdFx0XHRqc29ud191aW50X2ZpZWxkKGpzb25fd3RyLCBcJiMzNDtpbm5lcl9tYXBfaWRcJiMzNDssXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNDQ6XHRcdFx0XHRcdCAqKHVuc2lnbmVkIGludCAqKXZhbHVlKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE0NTpcdFx0aWYgKGJ0Zikge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTQ2Olx0XHRcdHN0cnVjdCBidGZfZHVtcGVyIGQgPSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNDc6XHRcdFx0XHQuYnRmID0gYnRmLFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTQ4Olx0XHRcdFx0Lmp3ID0ganNvbl93dHIsXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNDk6XHRcdFx0XHQuaXNfcGxhaW5fdGV4dCA9IGZhbHNlLFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTUwOlx0XHRcdH07XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNTE6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNTI6XHRcdFx0anNvbndfbmFtZShqc29uX3d0ciwgXCYjMzQ7Zm9ybWF0dGVkXCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE1MzpcdFx0XHRkb19kdW1wX2J0ZihcdTAwMjZkLCBpbmZvLCBrZXksIHZhbHVlKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE1NDpcdFx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTU1Olx0fSBlbHNlIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE1NjpcdFx0dW5zaWduZWQgaW50IGksIG4sIHN0ZXA7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNTc6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNTg6XHRcdG4gPSBnZXRfcG9zc2libGVfY3B1cygpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTU5Olx0XHRzdGVwID0gcm91bmRfdXAoaW5mby1cdTAwM2V2YWx1ZV9zaXplLCA4KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2MDpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2MTpcdFx0anNvbndfbmFtZShqc29uX3d0ciwgXCYjMzQ7a2V5XCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2MjpcdFx0cHJpbnRfaGV4X2RhdGFfanNvbihrZXksIGluZm8tXHUwMDNla2V5X3NpemUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTYzOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTY0Olx0XHRqc29ud19uYW1lKGpzb25fd3RyLCBcJiMzNDt2YWx1ZXNcJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTY1Olx0XHRqc29ud19zdGFydF9hcnJheShqc29uX3d0cik7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNjY6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNjc6XHRcdFx0anNvbndfc3RhcnRfb2JqZWN0KGpzb25fd3RyKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2ODpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2OTpcdFx0XHRqc29ud19pbnRfZmllbGQoanNvbl93dHIsIFwmIzM0O2NwdVwmIzM0OywgaSk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzA6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzE6XHRcdFx0anNvbndfbmFtZShqc29uX3d0ciwgXCYjMzQ7dmFsdWVcJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTcyOlx0XHRcdHByaW50X2hleF9kYXRhX2pzb24odmFsdWUgJiM0MzsgaSAqIHN0ZXAsXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzM6XHRcdFx0XHRcdCAgICBpbmZvLVx1MDAzZXZhbHVlX3NpemUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTc0OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTc1Olx0XHRcdGpzb253X2VuZF9vYmplY3QoanNvbl93dHIpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTc2Olx0XHR9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzc6XHRcdGpzb253X2VuZF9hcnJheShqc29uX3d0cik7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzg6XHRcdGlmIChidGYpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE3OTpcdFx0XHRzdHJ1Y3QgYnRmX2R1bXBlciBkID0ge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTgwOlx0XHRcdFx0LmJ0ZiA9IGJ0ZixcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE4MTpcdFx0XHRcdC5qdyA9IGpzb25fd3RyLFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTgyOlx0XHRcdFx0LmlzX3BsYWluX3RleHQgPSBmYWxzZSxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE4MzpcdFx0XHR9O1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTg0OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTg1Olx0XHRcdGpzb253X25hbWUoanNvbl93dHIsIFwmIzM0O2Zvcm1hdHRlZFwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxODY6XHRcdFx0ZG9fZHVtcF9idGYoXHUwMDI2ZCwgaW5mbywga2V5LCB2YWx1ZSk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxODc6XHRcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE4ODpcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE4OTpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5MDpcdGpzb253X2VuZF9vYmplY3QoanNvbl93dHIpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTkxOn1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5MjpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5MzpzdGF0aWMgdm9pZFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTk0OnByaW50X2VudHJ5X2Vycm9yX21zZyhzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCB1bnNpZ25lZCBjaGFyICprZXksXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxOTU6XHRcdCAgICAgIGNvbnN0IGNoYXIgKmVycm9yX21zZylcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5Njp7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxOTc6XHRpbnQgbXNnX3NpemUgPSBzdHJsZW4oZXJyb3JfbXNnKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5ODpcdGJvb2wgc2luZ2xlX2xpbmUsIGJyZWFrX25hbWVzO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTk5OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjAwOlx0YnJlYWtfbmFtZXMgPSBpbmZvLVx1MDAzZWtleV9zaXplIFx1MDAzZSAxNiB8fCBtc2dfc2l6ZSBcdTAwM2UgMTY7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMDE6XHRzaW5nbGVfbGluZSA9IGluZm8tXHUwMDNla2V5X3NpemUgJiM0MzsgbXNnX3NpemUgXHUwMDNjPSAyNCBcdTAwMjZcdTAwMjYgIWJyZWFrX25hbWVzO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjAyOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjAzOlx0cHJpbnRmKFwmIzM0O2tleTolY1wmIzM0OywgYnJlYWtfbmFtZXMgPyAmIzM5O1xcbiYjMzk7IDogJiMzOTsgJiMzOTspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjA0Olx0ZnByaW50X2hleChzdGRvdXQsIGtleSwgaW5mby1cdTAwM2VrZXlfc2l6ZSwgXCYjMzQ7IFwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMDU6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMDY6XHRwcmludGYoc2luZ2xlX2xpbmUgPyBcJiMzNDsgIFwmIzM0OyA6IFwmIzM0O1xcblwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMDc6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMDg6XHRwcmludGYoXCYjMzQ7dmFsdWU6JWMlc1wmIzM0OywgYnJlYWtfbmFtZXMgPyAmIzM5O1xcbiYjMzk7IDogJiMzOTsgJiMzOTssIGVycm9yX21zZyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMDk6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMTA6XHRwcmludGYoXCYjMzQ7XFxuXCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIxMTp9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMTI6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMTM6c3RhdGljIHZvaWRcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIxNDpwcmludF9lbnRyeV9lcnJvcihzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgdm9pZCAqa2V5LCBpbnQgbG9va3VwX2Vycm5vKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjE1OntcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIxNjpcdC8qIEZvciBwcm9nX2FycmF5IG1hcHMgb3IgYXJyYXlzIG9mIG1hcHMsIGZhaWx1cmUgdG8gbG9va3VwIHRoZSB2YWx1ZVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjE3Olx0ICogbWVhbnMgdGhlcmUgaXMgbm8gZW50cnkgZm9yIHRoYXQga2V5LiBEbyBub3QgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjE4Olx0ICogaW4gdGhhdCBjYXNlLlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjE5Olx0ICovXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMjA6XHRpZiAoKG1hcF9pc19tYXBfb2ZfbWFwcyhtYXBfaW5mby1cdTAwM2V0eXBlKSB8fFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjIxOlx0ICAgICBtYXBfaXNfbWFwX29mX3Byb2dzKG1hcF9pbmZvLVx1MDAzZXR5cGUpKSBcdTAwMjZcdTAwMjYgbG9va3VwX2Vycm5vID09IEVOT0VOVClcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIyMjpcdFx0cmV0dXJuO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjIzOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjI0Olx0aWYgKGpzb25fb3V0cHV0KSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMjU6XHRcdGpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7XHQvKiBlbnRyeSAqL1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjI2Olx0XHRqc29ud19uYW1lKGpzb25fd3RyLCBcJiMzNDtrZXlcJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjI3Olx0XHRwcmludF9oZXhfZGF0YV9qc29uKGtleSwgbWFwX2luZm8tXHUwMDNla2V5X3NpemUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjI4Olx0XHRqc29ud19uYW1lKGpzb25fd3RyLCBcJiMzNDt2YWx1ZVwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMjk6XHRcdGpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7XHQvKiBlcnJvciAqL1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjMwOlx0XHRqc29ud19zdHJpbmdfZmllbGQoanNvbl93dHIsIFwmIzM0O2Vycm9yXCYjMzQ7LCBzdHJlcnJvcihsb29rdXBfZXJybm8pKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzMTpcdFx0anNvbndfZW5kX29iamVjdChqc29uX3d0cik7XHQvKiBlcnJvciAqL1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjMyOlx0XHRqc29ud19lbmRfb2JqZWN0KGpzb25fd3RyKTtcdC8qIGVudHJ5ICovXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMzM6XHR9IGVsc2Uge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjM0Olx0XHRjb25zdCBjaGFyICptc2cgPSBOVUxMO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjM1OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjM2Olx0XHRpZiAobG9va3VwX2Vycm5vID09IEVOT0VOVClcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzNzpcdFx0XHRtc2cgPSBcJiMzNDtcdTAwM2NubyBlbnRyeVx1MDAzZVwmIzM0OztcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzODpcdFx0ZWxzZSBpZiAobG9va3VwX2Vycm5vID09IEVOT1NQQyBcdTAwMjZcdTAwMjZcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzOTpcdFx0XHQgbWFwX2luZm8tXHUwMDNldHlwZSA9PSBCUEZfTUFQX1RZUEVfUkVVU0VQT1JUX1NPQ0tBUlJBWSlcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI0MDpcdFx0XHRtc2cgPSBcJiMzNDtcdTAwM2NjYW5ub3QgcmVhZFx1MDAzZVwmIzM0OztcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI0MTpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI0MjpcdFx0cHJpbnRfZW50cnlfZXJyb3JfbXNnKG1hcF9pbmZvLCBrZXksXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNDM6XHRcdFx0XHQgICAgICBtc2cgPyA6IHN0cmVycm9yKGxvb2t1cF9lcnJubykpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjQ0Olx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjQ1On1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI0NjpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI0NzpzdGF0aWMgdm9pZCBwcmludF9lbnRyeV9wbGFpbihzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCB1bnNpZ25lZCBjaGFyICprZXksXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNDg6XHRcdFx0ICAgICAgdW5zaWduZWQgY2hhciAqdmFsdWUpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNDk6e1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjUwOlx0aWYgKCFtYXBfaXNfcGVyX2NwdShpbmZvLVx1MDAzZXR5cGUpKSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNTE6XHRcdGJvb2wgc2luZ2xlX2xpbmUsIGJyZWFrX25hbWVzO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjUyOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjUzOlx0XHRicmVha19uYW1lcyA9IGluZm8tXHUwMDNla2V5X3NpemUgXHUwMDNlIDE2IHx8IGluZm8tXHUwMDNldmFsdWVfc2l6ZSBcdTAwM2UgMTY7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNTQ6XHRcdHNpbmdsZV9saW5lID0gaW5mby1cdTAwM2VrZXlfc2l6ZSAmIzQzOyBpbmZvLVx1MDAzZXZhbHVlX3NpemUgXHUwMDNjPSAyNCBcdTAwMjZcdTAwMjZcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI1NTpcdFx0XHQhYnJlYWtfbmFtZXM7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNTY6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNTc6XHRcdGlmIChpbmZvLVx1MDAzZWtleV9zaXplKSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNTg6XHRcdFx0cHJpbnRmKFwmIzM0O2tleTolY1wmIzM0OywgYnJlYWtfbmFtZXMgPyAmIzM5O1xcbiYjMzk7IDogJiMzOTsgJiMzOTspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjU5Olx0XHRcdGZwcmludF9oZXgoc3Rkb3V0LCBrZXksIGluZm8tXHUwMDNla2V5X3NpemUsIFwmIzM0OyBcJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjYwOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjYxOlx0XHRcdHByaW50ZihzaW5nbGVfbGluZSA/IFwmIzM0OyAgXCYjMzQ7IDogXCYjMzQ7XFxuXCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI2MjpcdFx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjYzOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjY0Olx0XHRpZiAoaW5mby1cdTAwM2V2YWx1ZV9zaXplKSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNjU6XHRcdFx0aWYgKG1hcF9pc19tYXBfb2ZfbWFwcyhpbmZvLVx1MDAzZXR5cGUpKSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNjY6XHRcdFx0XHRwcmludGYoXCYjMzQ7aW5uZXJfbWFwX2lkOiVjXCYjMzQ7LCBicmVha19uYW1lcyA/ICYjMzk7XFxuJiMzOTsgOiAmIzM5OyAmIzM5Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNjc6XHRcdFx0XHRwcmludGYoXCYjMzQ7JXUgXCYjMzQ7LCAqKHVuc2lnbmVkIGludCAqKXZhbHVlKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI2ODpcdFx0XHR9IGVsc2Uge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjY5Olx0XHRcdFx0cHJpbnRmKFwmIzM0O3ZhbHVlOiVjXCYjMzQ7LCBicmVha19uYW1lcyA/ICYjMzk7XFxuJiMzOTsgOiAmIzM5OyAmIzM5Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNzA6XHRcdFx0XHRmcHJpbnRfaGV4KHN0ZG91dCwgdmFsdWUsIGluZm8tXHUwMDNldmFsdWVfc2l6ZSwgXCYjMzQ7IFwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNzE6XHRcdFx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjcyOlx0XHR9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNzM6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNzQ6XHRcdHByaW50ZihcJiMzNDtcXG5cJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjc1Olx0fSBlbHNlIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI3NjpcdFx0dW5zaWduZWQgaW50IGksIG4sIHN0ZXA7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNzc6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNzg6XHRcdG4gPSBnZXRfcG9zc2libGVfY3B1cygpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjc5Olx0XHRzdGVwID0gcm91bmRfdXAoaW5mby1cdTAwM2V2YWx1ZV9zaXplLCA4KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI4MDpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI4MTpcdFx0aWYgKGluZm8tXHUwMDNla2V5X3NpemUpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI4MjpcdFx0XHRwcmludGYoXCYjMzQ7a2V5OlxcblwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyODM6XHRcdFx0ZnByaW50X2hleChzdGRvdXQsIGtleSwgaW5mby1cdTAwM2VrZXlfc2l6ZSwgXCYjMzQ7IFwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyODQ6XHRcdFx0cHJpbnRmKFwmIzM0O1xcblwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyODU6XHRcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI4NjpcdFx0aWYgKGluZm8tXHUwMDNldmFsdWVfc2l6ZSkge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjg3Olx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyODg6XHRcdFx0XHRwcmludGYoXCYjMzQ7dmFsdWUgKENQVSAlMDJ1KTolY1wmIzM0OyxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI4OTpcdFx0XHRcdCAgICAgICBpLCBpbmZvLVx1MDAzZXZhbHVlX3NpemUgXHUwMDNlIDE2ID8gJiMzOTtcXG4mIzM5OyA6ICYjMzk7ICYjMzk7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5MDpcdFx0XHRcdGZwcmludF9oZXgoc3Rkb3V0LCB2YWx1ZSAmIzQzOyBpICogc3RlcCxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5MTpcdFx0XHRcdFx0ICAgaW5mby1cdTAwM2V2YWx1ZV9zaXplLCBcJiMzNDsgXCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5MjpcdFx0XHRcdHByaW50ZihcJiMzNDtcXG5cJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjkzOlx0XHRcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5NDpcdFx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjk1Olx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjk2On1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5NzpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5ODpzdGF0aWMgY2hhciAqKnBhcnNlX2J5dGVzKGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBjaGFyICp2YWwsXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyOTk6XHRcdFx0ICB1bnNpZ25lZCBpbnQgbilcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMwMDp7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMDE6XHR1bnNpZ25lZCBpbnQgaSA9IDAsIGJhc2UgPSAwO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzAyOlx0Y2hhciAqZW5kcHRyO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzAzOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzA0Olx0aWYgKGlzX3ByZWZpeCgqYXJndiwgXCYjMzQ7aGV4XCYjMzQ7KSkge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzA1Olx0XHRiYXNlID0gMTY7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMDY6XHRcdGFyZ3YmIzQzOyYjNDM7O1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzA3Olx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzA4OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzA5Olx0d2hpbGUgKGkgXHUwMDNjIG4gXHUwMDI2XHUwMDI2IGFyZ3ZbaV0pIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMxMDpcdFx0dmFsW2ldID0gc3RydG91bChhcmd2W2ldLCBcdTAwMjZlbmRwdHIsIGJhc2UpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzExOlx0XHRpZiAoKmVuZHB0cikge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzEyOlx0XHRcdHBfZXJyKFwmIzM0O2Vycm9yIHBhcnNpbmcgYnl0ZTogJXNcJiMzNDssIGFyZ3ZbaV0pO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzEzOlx0XHRcdHJldHVybiBOVUxMO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzE0Olx0XHR9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMTU6XHRcdGkmIzQzOyYjNDM7O1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzE2Olx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzE3OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzE4Olx0aWYgKGkgIT0gbikge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzE5Olx0XHRwX2VycihcJiMzNDslcyBleHBlY3RlZCAldSBieXRlcyBnb3QgJXVcJiMzNDssIG5hbWUsIG4sIGkpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzIwOlx0XHRyZXR1cm4gTlVMTDtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMyMTpcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMyMjpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMyMzpcdHJldHVybiBhcmd2ICYjNDM7IGk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMjQ6fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzI1OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzI2Oi8qIG9uIHBlciBjcHUgbWFwcyB3ZSBtdXN0IGNvcHkgdGhlIHByb3ZpZGVkIHZhbHVlIG9uIGFsbCB2YWx1ZSBpbnN0YW5jZXMgKi9cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMyNzpzdGF0aWMgdm9pZCBmaWxsX3Blcl9jcHVfdmFsdWUoc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywgdm9pZCAqdmFsdWUpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMjg6e1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzI5Olx0dW5zaWduZWQgaW50IGksIG4sIHN0ZXA7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMzA6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMzE6XHRpZiAoIW1hcF9pc19wZXJfY3B1KGluZm8tXHUwMDNldHlwZSkpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMzI6XHRcdHJldHVybjtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMzMzpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMzNDpcdG4gPSBnZXRfcG9zc2libGVfY3B1cygpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzM1Olx0c3RlcCA9IHJvdW5kX3VwKGluZm8tXHUwMDNldmFsdWVfc2l6ZSwgOCk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMzY6XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBuOyBpJiM0MzsmIzQzOylcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMzNzpcdFx0bWVtY3B5KHZhbHVlICYjNDM7IGkgKiBzdGVwLCB2YWx1ZSwgaW5mby1cdTAwM2V2YWx1ZV9zaXplKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMzODp9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMzk6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNDA6c3RhdGljIGludCBwYXJzZV9lbGVtKGNoYXIgKiphcmd2LCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCB2b2lkICprZXksXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNDE6XHRcdCAgICAgIHZvaWQgKnZhbHVlLCBfX3UzMiBrZXlfc2l6ZSwgX191MzIgdmFsdWVfc2l6ZSxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0MjpcdFx0ICAgICAgX191MzIgKmZsYWdzLCBfX3UzMiAqKnZhbHVlX2ZkLCBfX3UzMiBvcGVuX2ZsYWdzKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzQzOntcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0NDpcdGlmICghKmFyZ3YpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0NTpcdFx0aWYgKCFrZXkgXHUwMDI2XHUwMDI2ICF2YWx1ZSlcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0NjpcdFx0XHRyZXR1cm4gMDtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0NzpcdFx0cF9lcnIoXCYjMzQ7ZGlkIG5vdCBmaW5kICVzXCYjMzQ7LCBrZXkgPyBcJiMzNDtrZXlcJiMzNDsgOiBcJiMzNDt2YWx1ZVwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNDg6XHRcdHJldHVybiAtMTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0OTpcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1MDpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1MTpcdGlmIChpc19wcmVmaXgoKmFyZ3YsIFwmIzM0O2tleVwmIzM0OykpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1MjpcdFx0aWYgKCFrZXkpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1MzpcdFx0XHRpZiAoa2V5X3NpemUpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNTQ6XHRcdFx0XHRwX2VycihcJiMzNDtkdXBsaWNhdGUga2V5XCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1NTpcdFx0XHRlbHNlXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNTY6XHRcdFx0XHRwX2VycihcJiMzNDt1bm5lY2Vzc2FyeSBrZXlcJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzU3Olx0XHRcdHJldHVybiAtMTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1ODpcdFx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzU5OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzYwOlx0XHRhcmd2ID0gcGFyc2VfYnl0ZXMoYXJndiAmIzQzOyAxLCBcJiMzNDtrZXlcJiMzNDssIGtleSwga2V5X3NpemUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzYxOlx0XHRpZiAoIWFyZ3YpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNjI6XHRcdFx0cmV0dXJuIC0xO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzYzOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzY0Olx0XHRyZXR1cm4gcGFyc2VfZWxlbShhcmd2LCBpbmZvLCBOVUxMLCB2YWx1ZSwga2V5X3NpemUsIHZhbHVlX3NpemUsXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNjU6XHRcdFx0XHQgIGZsYWdzLCB2YWx1ZV9mZCwgb3Blbl9mbGFncyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNjY6XHR9IGVsc2UgaWYgKGlzX3ByZWZpeCgqYXJndiwgXCYjMzQ7dmFsdWVcJiMzNDspKSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNjc6XHRcdGludCBmZDtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM2ODpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM2OTpcdFx0aWYgKCF2YWx1ZSkge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzcwOlx0XHRcdGlmICh2YWx1ZV9zaXplKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzcxOlx0XHRcdFx0cF9lcnIoXCYjMzQ7ZHVwbGljYXRlIHZhbHVlXCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM3MjpcdFx0XHRlbHNlXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNzM6XHRcdFx0XHRwX2VycihcJiMzNDt1bm5lY2Vzc2FyeSB2YWx1ZVwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNzQ6XHRcdFx0cmV0dXJuIC0xO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzc1Olx0XHR9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNzY6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNzc6XHRcdGFyZ3YmIzQzOyYjNDM7O1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzc4OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzc5Olx0XHRpZiAobWFwX2lzX21hcF9vZl9tYXBzKGluZm8tXHUwMDNldHlwZSkpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM4MDpcdFx0XHRpbnQgYXJnYyA9IDI7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozODE6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozODI6XHRcdFx0aWYgKHZhbHVlX3NpemUgIT0gNCkge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzgzOlx0XHRcdFx0cF9lcnIoXCYjMzQ7dmFsdWUgc21hbGxlciB0aGFuIDRCIGZvciBtYXAgaW4gbWFwP1wmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozODQ6XHRcdFx0XHRyZXR1cm4gLTE7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozODU6XHRcdFx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzg2Olx0XHRcdGlmICghYXJndlswXSB8fCAhYXJndlsxXSkge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzg3Olx0XHRcdFx0cF9lcnIoXCYjMzQ7bm90IGVub3VnaCB2YWx1ZSBhcmd1bWVudHMgZm9yIG1hcCBpbiBtYXBcJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzg4Olx0XHRcdFx0cmV0dXJuIC0xO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzg5Olx0XHRcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM5MDpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM5MTpcdFx0XHRmZCA9IG1hcF9wYXJzZV9mZChcdTAwMjZhcmdjLCBcdTAwMjZhcmd2LCBvcGVuX2ZsYWdzKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM5MjpcdFx0XHRpZiAoZmQgXHUwMDNjIDApXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozOTM6XHRcdFx0XHRyZXR1cm4gLTE7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozOTQ6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozOTU6XHRcdFx0KnZhbHVlX2ZkID0gdmFsdWU7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozOTY6XHRcdFx0Kip2YWx1ZV9mZCA9IGZkO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzk3Olx0XHR9IGVsc2UgaWYgKG1hcF9pc19tYXBfb2ZfcHJvZ3MoaW5mby1cdTAwM2V0eXBlKSkge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzk4Olx0XHRcdGludCBhcmdjID0gMjtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM5OTpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQwMDpcdFx0XHRpZiAodmFsdWVfc2l6ZSAhPSA0KSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MDE6XHRcdFx0XHRwX2VycihcJiMzNDt2YWx1ZSBzbWFsbGVyIHRoYW4gNEIgZm9yIG1hcCBvZiBwcm9ncz9cJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDAyOlx0XHRcdFx0cmV0dXJuIC0xO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDAzOlx0XHRcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQwNDpcdFx0XHRpZiAoIWFyZ3ZbMF0gfHwgIWFyZ3ZbMV0pIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQwNTpcdFx0XHRcdHBfZXJyKFwmIzM0O25vdCBlbm91Z2ggdmFsdWUgYXJndW1lbnRzIGZvciBtYXAgb2YgcHJvZ3NcJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDA2Olx0XHRcdFx0cmV0dXJuIC0xO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDA3Olx0XHRcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQwODpcdFx0XHRpZiAoaXNfcHJlZml4KCphcmd2LCBcJiMzNDtpZFwmIzM0OykpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MDk6XHRcdFx0XHRwX2luZm8oXCYjMzQ7V2FybmluZzogdXBkYXRpbmcgcHJvZ3JhbSBhcnJheSB2aWEgTUFQX0lELCBtYWtlIHN1cmUgdGhpcyBtYXAgaXMga2VwdCBvcGVuXFxuXCYjMzQ7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MTA6XHRcdFx0XHQgICAgICAgXCYjMzQ7ICAgICAgICAgYnkgc29tZSBwcm9jZXNzIG9yIHBpbm5lZCBvdGhlcndpc2UgdXBkYXRlIHdpbGwgYmUgbG9zdFwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MTE6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MTI6XHRcdFx0ZmQgPSBwcm9nX3BhcnNlX2ZkKFx1MDAyNmFyZ2MsIFx1MDAyNmFyZ3YpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDEzOlx0XHRcdGlmIChmZCBcdTAwM2MgMClcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQxNDpcdFx0XHRcdHJldHVybiAtMTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQxNTpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQxNjpcdFx0XHQqdmFsdWVfZmQgPSB2YWx1ZTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQxNzpcdFx0XHQqKnZhbHVlX2ZkID0gZmQ7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MTg6XHRcdH0gZWxzZSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MTk6XHRcdFx0YXJndiA9IHBhcnNlX2J5dGVzKGFyZ3YsIFwmIzM0O3ZhbHVlXCYjMzQ7LCB2YWx1ZSwgdmFsdWVfc2l6ZSk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MjA6XHRcdFx0aWYgKCFhcmd2KVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDIxOlx0XHRcdFx0cmV0dXJuIC0xO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDIyOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDIzOlx0XHRcdGZpbGxfcGVyX2NwdV92YWx1ZShpbmZvLCB2YWx1ZSk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MjQ6XHRcdH1cbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQyNTpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQyNjpcdFx0cmV0dXJuIHBhcnNlX2VsZW0oYXJndiwgaW5mbywga2V5LCBOVUxMLCBrZXlfc2l6ZSwgdmFsdWVfc2l6ZSxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQyNzpcdFx0XHRcdCAgZmxhZ3MsIE5VTEwsIG9wZW5fZmxhZ3MpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDI4Olx0fSBlbHNlIGlmIChpc19wcmVmaXgoKmFyZ3YsIFwmIzM0O2FueVwmIzM0OykgfHwgaXNfcHJlZml4KCphcmd2LCBcJiMzNDtub2V4aXN0XCYjMzQ7KSB8fFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDI5Olx0XHQgICBpc19wcmVmaXgoKmFyZ3YsIFwmIzM0O2V4aXN0XCYjMzQ7KSkge1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDMwOlx0XHRpZiAoIWZsYWdzKSB7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MzE6XHRcdFx0cF9lcnIoXCYjMzQ7ZmxhZ3Mgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzOiAlc1wmIzM0OywgKmFyZ3YpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDMyOlx0XHRcdHJldHVybiAtMTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQzMzpcdFx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDM0OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDM1Olx0XHRpZiAoaXNfcHJlZml4KCphcmd2LCBcJiMzNDthbnlcJiMzNDspKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDM2Olx0XHRcdCpmbGFncyA9IEJQRl9BTlk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Mzc6XHRcdGVsc2UgaWYgKGlzX3ByZWZpeCgqYXJndiwgXCYjMzQ7bm9leGlzdFwmIzM0OykpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Mzg6XHRcdFx0KmZsYWdzID0gQlBGX05PRVhJU1Q7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Mzk6XHRcdGVsc2UgaWYgKGlzX3ByZWZpeCgqYXJndiwgXCYjMzQ7ZXhpc3RcJiMzNDspKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQwOlx0XHRcdCpmbGFncyA9IEJQRl9FWElTVDtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ0MTpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ0MjpcdFx0cmV0dXJuIHBhcnNlX2VsZW0oYXJndiAmIzQzOyAxLCBpbmZvLCBrZXksIHZhbHVlLCBrZXlfc2l6ZSxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ0MzpcdFx0XHRcdCAgdmFsdWVfc2l6ZSwgTlVMTCwgdmFsdWVfZmQsIG9wZW5fZmxhZ3MpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQ0Olx0fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQ1OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQ2Olx0cF9lcnIoXCYjMzQ7ZXhwZWN0ZWQga2V5IG9yIHZhbHVlLCBnb3Q6ICVzXCYjMzQ7LCAqYXJndik7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NDc6XHRyZXR1cm4gLTE7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NDg6fVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQ5OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDUwOnN0YXRpYyB2b2lkIHNob3dfbWFwX2hlYWRlcl9qc29uKHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cilcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ1MTp7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTI6XHRjb25zdCBjaGFyICptYXBfdHlwZV9zdHI7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTM6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTQ6XHRqc29ud191aW50X2ZpZWxkKHd0ciwgXCYjMzQ7aWRcJiMzNDssIGluZm8tXHUwMDNlaWQpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDU1Olx0bWFwX3R5cGVfc3RyID0gbGliYnBmX2JwZl9tYXBfdHlwZV9zdHIoaW5mby1cdTAwM2V0eXBlKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ1NjpcdGlmIChtYXBfdHlwZV9zdHIpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTc6XHRcdGpzb253X3N0cmluZ19maWVsZCh3dHIsIFwmIzM0O3R5cGVcJiMzNDssIG1hcF90eXBlX3N0cik7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTg6XHRlbHNlXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTk6XHRcdGpzb253X3VpbnRfZmllbGQod3RyLCBcJiMzNDt0eXBlXCYjMzQ7LCBpbmZvLVx1MDAzZXR5cGUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDYwOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDYxOlx0aWYgKCppbmZvLVx1MDAzZW5hbWUpXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NjI6XHRcdGpzb253X3N0cmluZ19maWVsZCh3dHIsIFwmIzM0O25hbWVcJiMzNDssIGluZm8tXHUwMDNlbmFtZSk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NjM6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NjQ6XHRqc29ud19uYW1lKHd0ciwgXCYjMzQ7ZmxhZ3NcJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDY1Olx0anNvbndfcHJpbnRmKHd0ciwgXCYjMzQ7JXVcJiMzNDssIGluZm8tXHUwMDNlbWFwX2ZsYWdzKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ2Njp9XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Njc6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Njg6c3RhdGljIGludCBzaG93X21hcF9jbG9zZV9qc29uKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbylcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ2OTp7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NzA6XHRjaGFyICptZW1sb2NrLCAqZnJvemVuX3N0cjtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ3MTpcdGludCBmcm96ZW4gPSAwO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDcyOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDczOlx0bWVtbG9jayA9IGdldF9mZGluZm8oZmQsIFwmIzM0O21lbWxvY2tcJiMzNDspO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDc0Olx0ZnJvemVuX3N0ciA9IGdldF9mZGluZm8oZmQsIFwmIzM0O2Zyb3plblwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NzU6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NzY6XHRqc29ud19zdGFydF9vYmplY3QoanNvbl93dHIpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDc3OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDc4Olx0c2hvd19tYXBfaGVhZGVyX2pzb24oaW5mbywganNvbl93dHIpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDc5OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDgwOlx0cHJpbnRfZGV2X2pzb24oaW5mby1cdTAwM2VpZmluZGV4LCBpbmZvLVx1MDAzZW5ldG5zX2RldiwgaW5mby1cdTAwM2VuZXRuc19pbm8pO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDgxOlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDgyOlx0anNvbndfdWludF9maWVsZChqc29uX3d0ciwgXCYjMzQ7Ynl0ZXNfa2V5XCYjMzQ7LCBpbmZvLVx1MDAzZWtleV9zaXplKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ4MzpcdGpzb253X3VpbnRfZmllbGQoanNvbl93dHIsIFwmIzM0O2J5dGVzX3ZhbHVlXCYjMzQ7LCBpbmZvLVx1MDAzZXZhbHVlX3NpemUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDg0Olx0anNvbndfdWludF9maWVsZChqc29uX3d0ciwgXCYjMzQ7bWF4X2VudHJpZXNcJiMzNDssIGluZm8tXHUwMDNlbWF4X2VudHJpZXMpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDg1OlxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDg2Olx0aWYgKG1lbWxvY2spXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0ODc6XHRcdGpzb253X2ludF9maWVsZChqc29uX3d0ciwgXCYjMzQ7Ynl0ZXNfbWVtbG9ja1wmIzM0OywgYXRvbGwobWVtbG9jaykpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDg4Olx0ZnJlZShtZW1sb2NrKTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ4OTpcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5MDpcdGlmIChpbmZvLVx1MDAzZXR5cGUgPT0gQlBGX01BUF9UWVBFX1BST0dfQVJSQVkpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5MTpcdFx0Y2hhciAqb3duZXJfcHJvZ190eXBlID0gZ2V0X2ZkaW5mbyhmZCwgXCYjMzQ7b3duZXJfcHJvZ190eXBlXCYjMzQ7KTtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5MjpcdFx0Y2hhciAqb3duZXJfaml0ZWQgPSBnZXRfZmRpbmZvKGZkLCBcJiMzNDtvd25lcl9qaXRlZFwmIzM0Oyk7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OTM6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OTQ6XHRcdGlmIChvd25lcl9wcm9nX3R5cGUpIHtcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5NTpcdFx0XHR1bnNpZ25lZCBpbnQgcHJvZ190eXBlID0gYXRvaShvd25lcl9wcm9nX3R5cGUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDk2Olx0XHRcdGNvbnN0IGNoYXIgKnByb2dfdHlwZV9zdHI7XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OTc6XG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OTg6XHRcdFx0cHJvZ190eXBlX3N0ciA9IGxpYmJwZl9icGZfcHJvZ190eXBlX3N0cihwcm9nX3R5cGUpO1xudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDk5Olx0XHRcdGlmIChwcm9nX3R5cGVfc3RyKVxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTAwOlx0XHRcdFx0anNvbndfc3RyaW5nX2ZpZWxkKGpzb25fd3RyLCBcJiMzNDtvd25lcl9wcm9nX3R5cGVcJiMzNDssXG5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMDo1MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNDk1MwoJCQkJCQkJb3V0cHV0OiA4OQoJCQkJCQkJdGhvdWdodHM6IDQzNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiB0aGUgQlBGIFRvb2wgQ2hhbmdlcyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGVzZSBjaGFuZ2VzIGFyZSBpc29sYXRlZCB0byB0aGUgYGJwZnRvb2xgIHV0aWxpdHkgYW5kIHJlbGF0ZWQgdGVzdGluZyBpbmZyYXN0cnVjdHVyZS4gU3BlY2lmaWNhbGx5LCBJJiMzOTttIGxvb2tpbmcgYXQgbW9kaWZpY2F0aW9ucyB3aXRoaW46CgoxLiAgYHRvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0YAoyLiAgYHRvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sYAozLiAgYHRvb2xzL2JwZi9icGZ0b29sL21haW4uY2AKNC4gIGB0b29scy9icGYvYnBmdG9vbC9tYWluLmhgCjUuICBgdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNgCjYuICBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jYAoKQmFzZWQgb24gdGhlIGVzdGFibGlzaGVkIGd1aWRlbGluZXMsIHRoaXMgaXMgcHJldHR5IGNsZWFyLWN1dC4gVGhlIGNyaXRlcmlhIGZvciByZXR1cm5pbmcgYFdvcnRoRnV6emluZz1mYWxzZWAgaXMgbWV0IGJlY2F1c2UgYWxsIHRoZSBjaGFuZ2VzIGFyZSBjb25maW5lZCB0byB1c2VyLXNwYWNlIHV0aWxpdGllcyBhbmQgc2VsZi10ZXN0cyB3aXRoaW4gdGhlIGB0b29scy9gIGRpcmVjdG9yeS4gVGhleSBhcmUgKm5vdCogdG91Y2hpbmcgYW55dGhpbmcgdGhhdCBkaXJlY3RseSBhZmZlY3RzIHRoZSBrZXJuZWwgaW1hZ2UgKGB2bWxpbnV4YCkgb3IgYW55IGxvYWRhYmxlIGtlcm5lbCBtb2R1bGVzLiBUaGVzZSBhcmUgbW9kaWZpY2F0aW9ucyB0byB0aGUgYGJwZnRvb2xgIHV0aWxpdHkgaXRzZWxmIGFuZCB0aGUgYXNzb2NpYXRlZCBzZWxmLXRlc3RzLgoKVGhlcmVmb3JlLCB0aGUgZnV6emluZy13b3J0aGluZXNzIGlzIGxvdy4gSSB3aWxsIHNldCB0aGUgcGFyYW1ldGVycyBmb3IgYHNldC1yZXN1bHRzYCBhY2NvcmRpbmdseS4gSSB3aWxsIGVuc3VyZSB0aGF0OgoKKiAgIGBXb3J0aEZ1enppbmdgIGlzIHNldCB0byBgZmFsc2VgLgoqICAgYEZvY3VzU3ltYm9sc2AgaXMgc2V0IHRvIGFuIGVtcHR5L251bGwgbGlzdCAoIGBbXWAgKS4KKiAgIGBFbmFibGVDb25maWdzYCBpcyBhbHNvIHNldCB0byBhbiBlbXB0eS9udWxsIGxpc3QgKCBgW11gICkuCiogICBUaGUgYFJlYXNvbmluZ2Agc2hvdWxkIGV4cGxpY2l0bHkgc3RhdGUgdGhhdCB0aGUgY2hhbmdlcyBhcmUgaXNvbGF0ZWQgdG8gdXNlci1zcGFjZSBgYnBmdG9vbGAgdXRpbGl0eSBhbmQgc2VsZi10ZXN0cyBsb2NhdGVkIHdpdGhpbiB0aGUgYHRvb2xzL2AgZGlyZWN0b3J5LCBhbmQgdGhhdCB0aGVzZSBkbyBub3QgaW1wYWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2Ugb3IgcnVudGltZSBrZXJuZWwgY29kZS4gVGhpcyBzaG91bGQgYmUgdmVyeSBjbGVhciBhbmQgY29uY2lzZSB0byBwcmV2ZW50IGFueSBjb25mdXNpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDA6NTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXItc3BhY2UgY29kZSBpbiB0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLiBJdCBkb2VzIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMsIGFuZCBpcyB0aGVyZWZvcmUgbm90IHJlbGV2YW50IGZvciBzeXprYWxsZXIgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlci1zcGFjZSBjb2RlIGluIHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYuIEl0IGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcywgYW5kIGlzIHRoZXJlZm9yZSBub3QgcmVsZXZhbnQgZm9yIHN5emthbGxlciBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMDo1MzwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDdUMDA6NTM6MzEuNjE2MDE1MjkzWiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODE5NjgyMDY4OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlci1zcGFjZSBjb2RlIGluIHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYuIEl0IGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcywgYW5kIGlzIHRoZXJlZm9yZSBub3QgcmVsZXZhbnQgZm9yIHN5emthbGxlciBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDA6NTM6MzEuNjE2MDQ0MTgzWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NjMyNDMwMTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBiZGI1NmYzNDFmMjI3Mjc1YjI4ZDFhMTI2MTBiMWVhZDViNzI0NzAyXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gU2VwIDcgMDA6NTM6MzAgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLmMxMzUzMzg2MDBlOGYgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbkBAIC0xNiw3ICsxNiw3IEBAIFNZTk9QU0lTXFxuIFxcbiAqKmJwZnRvb2wqKiBbKk9QVElPTlMqXSAqKm1hcCoqICpDT01NQU5EKlxcbiBcXG4tKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8IHsgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IH1cXG4rKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8IHsgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IHwgeyAqKi1yKiogfCAqKi0tcmVjdXJzaXZlKiogfSB9XFxuIFxcbiAqQ09NTUFORFMqIDo9XFxuIHsgKipzaG93KiogfCAqKmxpc3QqKiB8ICoqY3JlYXRlKiogfCAqKmR1bXAqKiB8ICoqdXBkYXRlKiogfCAqKmxvb2t1cCoqIHwgKipnZXRuZXh0KiogfFxcbkBAIC0xNzAsNiArMTcwLDIzIEBAIE9QVElPTlNcXG4gICAgIERvIG5vdCBhdXRvbWF0aWNhbGx5IGF0dGVtcHQgdG8gbW91bnQgYW55IHZpcnR1YWwgZmlsZSBzeXN0ZW0gKHN1Y2ggYXNcXG4gICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LlxcbiBcXG4rLXIsIC0tcmVjdXJzaXZlXFxuKyAgICBBbHNvIGR1bXAgdGhlIGlubmVyIG1hcHMgcmVmZXJlbmNlZCBieSAqKmFycmF5X29mX21hcHMqKiBhbmQgKipoYXNoX29mX21hcHMqKlxcbisgICAgZW50cmllcyB3aGVuIHJ1bm5pbmcgKiptYXAgZHVtcCoqLiBFYWNoIG1hcCBpcyBkdW1wZWQgb25jZSwgZXZlbiBpZiBzZXZlcmFsXFxuKyAgICBlbnRyaWVzIHJlZmVyIHRvIGl0LiBTZWxlY3RlZCBtYXBzIGFyZSBmb2xsb3dlZCBieSB0aGVpciBpbm5lciBtYXBzLlxcbitcXG4rICAgIFBsYWluIG91dHB1dCBpbmNsdWRlcyBhIGhlYWRlciBpZGVudGlmeWluZyBlYWNoIG1hcC4gT24gc3VjY2VzcywgSlNPTiBvdXRwdXRcXG4rICAgIGlzIGFsd2F5cyBhbiBhcnJheSBvZiBtYXAgb2JqZWN0cywgZWFjaCBjb250YWluaW5nIGFuICoqaWQqKiBhbmQgYW5cXG4rICAgICoqZWxlbWVudHMqKiBhcnJheSwgaW5jbHVkaW5nIHdoZW4gb25seSBvbmUgbWFwIGlzIGR1bXBlZC4gT3V0ZXIgbWFwIGVudHJpZXNcXG4rICAgIHJldGFpbiB0aGVpciAqKmlubmVyX21hcF9pZCoqIGZpZWxkLCB3aGljaCBpZGVudGlmaWVzIHRoZSBjb3JyZXNwb25kaW5nIGlubmVyXFxuKyAgICBtYXAgb2JqZWN0LlxcbitcXG4rICAgIFRoZSBkdW1wIGlzIG5vdCBhIHNuYXBzaG90OiBjb25jdXJyZW50IHVwZGF0ZXMgY2FuIGNoYW5nZSBtYXAgY29udGVudHMuXFxuKyAgICBGYWlsdXJlIHRvIG9wZW4gYSByZWZlcmVuY2VkIGlubmVyIG1hcCBzdG9wcyB0aGUgZHVtcCBhbmQgcmV0dXJucyBhIG5vbnplcm9cXG4rICAgIGV4aXQgc3RhdHVzLiBPdXRwdXQgbWF5IGNvbnRhaW4gbWFwcyBvciBlbnRyaWVzIHByaW50ZWQgYmVmb3JlIHRoZSBlcnJvci5cXG4rICAgIEluIEpTT04gbW9kZSwgYW4gZXJyb3IgZHVyaW5nIHRyYXZlcnNhbCBpcyBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGFuZCB0aGVcXG4rICAgIGVuY2xvc2luZyBhcnJheXMgYW5kIG9iamVjdHMgYXJlIGNsb3NlZC5cXG4rXFxuIEVYQU1QTEVTXFxuID09PT09PT09XFxuICoqIyBicGZ0b29sIG1hcCBzaG93KipcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxcbmluZGV4IDc1Y2JjYjUxMmViYWUuLjQ1YzMzNmQ2M2JlMGEgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxcbkBAIC0yNjEsNyArMjYxLDcgQEAgX2JwZnRvb2woKVxcbiBcXG4gICAgICMgRGVhbCB3aXRoIG9wdGlvbnNcXG4gICAgIGlmIFtbICR7d29yZHNbY3dvcmRdfSA9PSAtKiBdXTsgdGhlblxcbi0gICAgICAgIGxvY2FsIGM9Jy0tdmVyc2lvbiAtLWpzb24gLS1wcmV0dHkgLS1icGZmcyAtLW1hcGNvbXBhdCAtLWRlYnVnIFxcXFxcXG4rICAgICAgICBsb2NhbCBjPSctLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tcmVjdXJzaXZlIC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcXFxcXFxuICAgICAgICAgICAgIC0tdXNlLWxvYWRlciAtLWJhc2UtYnRmIC0tc2lnbiAtaSAtaydcXG4gICAgICAgICBDT01QUkVQTFk9KCAkKCBjb21wZ2VuIC1XIFxcXCIkY1xcXCIgLS0gXFxcIiRjdXJcXFwiICkgKVxcbiAgICAgICAgIHJldHVybiAwXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xcbmluZGV4IGM5MWUxYTZlMWExZWMuLjI5MDIxZjRkZDQ1MTggMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jXFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jXFxuQEAgLTI2LDYgKzI2LDcgQEAgc3RhdGljIGludCAoKmxhc3RfZG9faGVscCkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTtcXG4ganNvbl93cml0ZXJfdCAqanNvbl93dHI7XFxuIGJvb2wgcHJldHR5X291dHB1dDtcXG4gYm9vbCBqc29uX291dHB1dDtcXG4rYm9vbCByZWN1cnNpdmU7XFxuIGJvb2wgc2hvd19waW5uZWQ7XFxuIGJvb2wgYmxvY2tfbW91bnQ7XFxuIGJvb2wgdmVyaWZpZXJfbG9ncztcXG5AQCAtNDUyLDYgKzQ1Myw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0XFx0eyBcXFwianNvblxcXCIsXFx0bm9fYXJndW1lbnQsXFx0TlVMTCxcXHQnaicgfSxcXG4gXFx0XFx0eyBcXFwiaGVscFxcXCIsXFx0bm9fYXJndW1lbnQsXFx0TlVMTCxcXHQnaCcgfSxcXG4gXFx0XFx0eyBcXFwicHJldHR5XFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdwJyB9LFxcbitcXHRcXHR7IFxcXCJyZWN1cnNpdmVcXFwiLFxcdG5vX2FyZ3VtZW50LFxcdE5VTEwsXFx0J3InIH0sXFxuIFxcdFxcdHsgXFxcInZlcnNpb25cXFwiLFxcdG5vX2FyZ3VtZW50LFxcdE5VTEwsXFx0J1YnIH0sXFxuIFxcdFxcdHsgXFxcImJwZmZzXFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdmJyB9LFxcbiBcXHRcXHR7IFxcXCJtYXBjb21wYXRcXFwiLFxcdG5vX2FyZ3VtZW50LFxcdE5VTEwsXFx0J20nIH0sXFxuQEAgLTQ4NSw3ICs0ODcsNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdGJpbl9uYW1lID0gXFxcImJwZnRvb2xcXFwiO1xcbiBcXG4gXFx0b3B0ZXJyID0gMDtcXG4tXFx0d2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBcXFwiVmhwamZMbW5kU2k6azpCOmxcXFwiLFxcbitcXHR3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIFxcXCJWaHBqcmZMbW5kU2k6azpCOmxcXFwiLFxcbiBcXHRcXHRcXHRcXHQgIG9wdGlvbnMsIE5VTEwpKSBcXHUwMDNlPSAwKSB7XFxuIFxcdFxcdHN3aXRjaCAob3B0KSB7XFxuIFxcdFxcdGNhc2UgJ1YnOlxcbkBAIC01MDcsNiArNTA5LDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHRcXHR9XFxuIFxcdFxcdFxcdGpzb253X3ByZXR0eShqc29uX3d0ciwgcHJldHR5X291dHB1dCk7XFxuIFxcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlICdyJzpcXG4rXFx0XFx0XFx0cmVjdXJzaXZlID0gdHJ1ZTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGNhc2UgJ2YnOlxcbiBcXHRcXHRcXHRzaG93X3Bpbm5lZCA9IHRydWU7XFxuIFxcdFxcdFxcdGJyZWFrO1xcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmggYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcXG5pbmRleCA3OGI2ZTBlYmI4NWQ4Li5iNWRjNzk2MGNmNjgyIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxcbkBAIC04Myw2ICs4Myw3IEBAIGV4dGVybiBjb25zdCBjaGFyICpiaW5fbmFtZTtcXG4gXFxuIGV4dGVybiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcXG4gZXh0ZXJuIGJvb2wganNvbl9vdXRwdXQ7XFxuK2V4dGVybiBib29sIHJlY3Vyc2l2ZTtcXG4gZXh0ZXJuIGJvb2wgc2hvd19waW5uZWQ7XFxuIGV4dGVybiBib29sIHNob3dfcGlkcztcXG4gZXh0ZXJuIGJvb2wgYmxvY2tfbW91bnQ7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcXG5pbmRleCA2ODRhOGZiNzI0MTQ2Li44NTNmNzc1YjdkNTI5IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcXG5AQCAtNzQ1LDggKzc0NSwxMCBAQCBzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxcbiBcXHRcXHRcXHQganNvbl93cml0ZXJfdCAqYnRmX3d0cilcXG4ge1xcbiBcXHRpZiAoYnBmX21hcF9sb29rdXBfZWxlbShmZCwga2V5LCB2YWx1ZSkpIHtcXG4tXFx0XFx0cHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgZXJybm8pO1xcbi1cXHRcXHRyZXR1cm4gLTE7XFxuK1xcdFxcdGludCBsb29rdXBfZXJybm8gPSBlcnJubztcXG4rXFxuK1xcdFxcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGxvb2t1cF9lcnJubyk7XFxuK1xcdFxcdHJldHVybiAtbG9va3VwX2Vycm5vO1xcbiBcXHR9XFxuIFxcbiBcXHRpZiAoanNvbl9vdXRwdXQpIHtcXG5AQCAtODI2LDEyICs4MjgsNTMgQEAgc3RhdGljIHZvaWQgZnJlZV9tYXBfa3ZfYnRmKHN0cnVjdCBidGYgKmJ0ZilcXG4gXFx0XFx0YnRmX19mcmVlKGJ0Zik7XFxuIH1cXG4gXFxuK3N0cnVjdCBtYXBfZHVtcF9jdHgge1xcbitcXHRzdHJ1Y3QgaGFzaG1hcCAqc2VlbjtcXG4rXFx0aW50ICoqZmRzO1xcbitcXHRpbnQgKm5iX2ZkcztcXG4rfTtcXG4rXFxuK3N0YXRpYyBpbnQgY29sbGVjdF9pbm5lcl9tYXAoc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4LCBfX3UzMiBpZClcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfZ2V0X2ZkX2J5X2lkX29wdHMsIG9wdHMsXFxuK1xcdFxcdC5vcGVuX2ZsYWdzID0gQlBGX0ZfUkRPTkxZLFxcbitcXHQpO1xcbitcXHRpbnQgKmZkcywgZmQsIGVycjtcXG4rXFxuK1xcdGlmIChoYXNobWFwX19maW5kKGN0eC1cXHUwMDNlc2VlbiwgaWQsIE5VTEwpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdGZkID0gYnBmX21hcF9nZXRfZmRfYnlfaWRfb3B0cyhpZCwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoZmQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdHBfZXJyKFxcXCJjYW4ndCBvcGVuIGlubmVyIG1hcCBpZCAldTogJXNcXFwiLCBpZCwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHR9XFxuK1xcbitcXHRmZHMgPSByZWFsbG9jKCpjdHgtXFx1MDAzZWZkcywgKCpjdHgtXFx1MDAzZW5iX2ZkcyArIDFVTEwpICogc2l6ZW9mKCpmZHMpKTtcXG4rXFx0aWYgKCFmZHMpIHtcXG4rXFx0XFx0cF9lcnIoXFxcIm1lbSBhbGxvYyBmYWlsZWRcXFwiKTtcXG4rXFx0XFx0Y2xvc2UoZmQpO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFx0KmN0eC1cXHUwMDNlZmRzID0gZmRzO1xcbitcXG4rXFx0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC1cXHUwMDNlc2VlbiwgaWQsIDApO1xcbitcXHRpZiAoZXJyKSB7XFxuK1xcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXNcXFwiLCBpZCwgc3RyZXJyb3IoLWVycikpO1xcbitcXHRcXHRjbG9zZShmZCk7XFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0fVxcbitcXHRmZHNbKCpjdHgtXFx1MDAzZW5iX2ZkcykrK10gPSBmZDtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuIHN0YXRpYyBpbnRcXG4gbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuLVxcdCBib29sIHNob3dfaGVhZGVyKVxcbitcXHQgYm9vbCBzaG93X2hlYWRlciwgc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4KVxcbiB7XFxuIFxcdHZvaWQgKmtleSwgKnZhbHVlLCAqcHJldl9rZXk7XFxuIFxcdHVuc2lnbmVkIGludCBudW1fZWxlbXMgPSAwO1xcbitcXHRqc29uX3dyaXRlcl90ICpwbGFpbl9idGZfd3RyID0gTlVMTDtcXG4gXFx0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcXG4gXFx0aW50IGVycjtcXG4gXFxuQEAgLTg0NSw2ICs4ODgsMTcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuIFxcbiBcXHRwcmV2X2tleSA9IE5VTEw7XFxuIFxcbitcXHRpZiAoY3R4IFxcdTAwMjZcXHUwMDI2ICF3dHIgXFx1MDAyNlxcdTAwMjYgKGluZm8tXFx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkIHx8XFxuK1xcdFxcdFxcdCAgICBpbmZvLVxcdTAwM2VidGZfdm1saW51eF92YWx1ZV90eXBlX2lkKSkge1xcbitcXHRcXHRwbGFpbl9idGZfd3RyID0gZ2V0X2J0Zl93cml0ZXIoKTtcXG4rXFx0XFx0aWYgKHBsYWluX2J0Zl93dHIpIHtcXG4rXFx0XFx0XFx0aWYgKHNob3dfaGVhZGVyKVxcbitcXHRcXHRcXHRcXHRzaG93X21hcF9oZWFkZXJfcGxhaW4oaW5mbyk7XFxuK1xcdFxcdFxcdHNob3dfaGVhZGVyID0gZmFsc2U7XFxuK1xcdFxcdFxcdHd0ciA9IHBsYWluX2J0Zl93dHI7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4gXFx0aWYgKHd0cikge1xcbiBcXHRcXHRlcnIgPSBnZXRfbWFwX2t2X2J0ZihpbmZvLCBcXHUwMDI2YnRmKTtcXG4gXFx0XFx0aWYgKGVycikge1xcbkBAIC04NzQsMTAgKzkyOCwyMiBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcXG4gXFx0XFx0aWYgKGVycikge1xcbiBcXHRcXHRcXHRpZiAoZXJybm8gPT0gRU5PRU5UKVxcbiBcXHRcXHRcXHRcXHRlcnIgPSAwO1xcbitcXHRcXHRcXHRlbHNlIGlmIChjdHgpXFxuK1xcdFxcdFxcdFxcdHBfZXJyKFxcXCJjYW4ndCBnZXQgbmV4dCBrZXkgZm9yIG1hcCBpZCAldTogJXNcXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICBpbmZvLVxcdTAwM2VpZCwgc3RyZXJyb3IoZXJybm8pKTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdH1cXG4tXFx0XFx0aWYgKCFkdW1wX21hcF9lbGVtKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cikpXFxuK1xcdFxcdGVyciA9IGR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTtcXG4rXFx0XFx0aWYgKCFlcnIpIHtcXG4gXFx0XFx0XFx0bnVtX2VsZW1zKys7XFxuK1xcdFxcdFxcdGlmIChjdHggXFx1MDAyNlxcdTAwMjYgbWFwX2lzX21hcF9vZl9tYXBzKGluZm8tXFx1MDAzZXR5cGUpKSB7XFxuK1xcdFxcdFxcdFxcdGVyciA9IGNvbGxlY3RfaW5uZXJfbWFwKGN0eCwgKihfX3UzMiAqKXZhbHVlKTtcXG4rXFx0XFx0XFx0XFx0aWYgKGVycilcXG4rXFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fSBlbHNlIGlmIChjdHggXFx1MDAyNlxcdTAwMjYgZXJyICE9IC1FTk9FTlQpIHtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4gXFx0XFx0cHJldl9rZXkgPSBrZXk7XFxuIFxcdH1cXG4gXFxuQEAgLTg5NCw2ICs5NjAsOCBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcXG4gXFx0ZnJlZShrZXkpO1xcbiBcXHRmcmVlKHZhbHVlKTtcXG4gXFx0ZnJlZV9tYXBfa3ZfYnRmKGJ0Zik7XFxuK1xcdGlmIChwbGFpbl9idGZfd3RyKVxcbitcXHRcXHRqc29ud19kZXN0cm95KFxcdTAwMjZwbGFpbl9idGZfd3RyKTtcXG4gXFxuIFxcdHJldHVybiBlcnI7XFxuIH1cXG5AQCAtOTAyLDYgKzk3MCw3IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIHtcXG4gXFx0anNvbl93cml0ZXJfdCAqd3RyID0gTlVMTCwgKmJ0Zl93dHIgPSBOVUxMO1xcbiBcXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcXG4rXFx0c3RydWN0IG1hcF9kdW1wX2N0eCBjdHggPSB7fTtcXG4gXFx0aW50IG5iX2ZkcywgaSA9IDA7XFxuIFxcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcXG4gXFx0aW50ICpmZHMgPSBOVUxMO1xcbkBAIC05MTksOSArOTg4LDM2IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdGlmIChuYl9mZHMgXFx1MDAzYyAxKVxcbiBcXHRcXHRnb3RvIGV4aXRfZnJlZTtcXG4gXFxuK1xcdGlmIChyZWN1cnNpdmUpIHtcXG4rXFx0XFx0Y3R4LnNlZW4gPSBoYXNobWFwX19uZXcoaGFzaF9mbl9mb3Jfa2V5X2FzX2lkLFxcbitcXHRcXHRcXHRcXHRcXHRlcXVhbF9mbl9mb3Jfa2V5X2FzX2lkLCBOVUxMKTtcXG4rXFx0XFx0aWYgKElTX0VSUihjdHguc2VlbikpIHtcXG4rXFx0XFx0XFx0Y3R4LnNlZW4gPSBOVUxMO1xcbitcXHRcXHRcXHRwX2VycihcXFwiZmFpbGVkIHRvIGNyZWF0ZSBoYXNobWFwIGZvciByZWN1cnNpdmUgZHVtcFxcXCIpO1xcbitcXHRcXHRcXHRnb3RvIGV4aXRfY2xvc2U7XFxuK1xcdFxcdH1cXG4rXFx0XFx0Y3R4LmZkcyA9IFxcdTAwMjZmZHM7XFxuK1xcdFxcdGN0eC5uYl9mZHMgPSBcXHUwMDI2bmJfZmRzO1xcbitcXHRcXHQvKiBSZWNvcmQgdGhlIHNlbGVjdGVkIG1hcHMgYmVmb3JlIGRpc2NvdmVyaW5nIGFueSBpbm5lciBtYXBzLiAqL1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbmJfZmRzOyBpKyspIHtcXG4rXFx0XFx0XFx0bGVuID0gc2l6ZW9mKGluZm8pO1xcbitcXHRcXHRcXHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFxcdTAwMjZpbmZvLCBcXHUwMDI2bGVuKSkge1xcbitcXHRcXHRcXHRcXHRwX2VycihcXFwiY2FuJ3QgZ2V0IG1hcCBpbmZvOiAlc1xcXCIsIHN0cmVycm9yKGVycm5vKSk7XFxuK1xcdFxcdFxcdFxcdGVyciA9IC0xO1xcbitcXHRcXHRcXHRcXHRnb3RvIGV4aXRfY2xvc2U7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC5zZWVuLCBpbmZvLmlkLCAwKTtcXG4rXFx0XFx0XFx0aWYgKGVycikge1xcbitcXHRcXHRcXHRcXHRwX2VycihcXFwiZmFpbGVkIHRvIHJlY29yZCBtYXAgaWQgJXU6ICVzXFxcIiwgaW5mby5pZCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgc3RyZXJyb3IoLWVycikpO1xcbitcXHRcXHRcXHRcXHRnb3RvIGV4aXRfY2xvc2U7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbiBcXHRpZiAoanNvbl9vdXRwdXQpIHtcXG4gXFx0XFx0d3RyID0ganNvbl93dHI7XFxuLVxcdH0gZWxzZSB7XFxuK1xcdH0gZWxzZSBpZiAoIXJlY3Vyc2l2ZSkge1xcbiBcXHRcXHRpbnQgZG9fcGxhaW5fYnRmO1xcbiBcXG4gXFx0XFx0ZG9fcGxhaW5fYnRmID0gbWFwc19oYXZlX2J0ZihmZHMsIG5iX2Zkcyk7XFxuQEAgLTkzNiw3ICsxMDMyLDcgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0XFx0fVxcbiBcXHR9XFxuIFxcbi1cXHRpZiAod3RyIFxcdTAwMjZcXHUwMDI2IG5iX2ZkcyBcXHUwMDNlIDEpXFxuK1xcdGlmICh3dHIgXFx1MDAyNlxcdTAwMjYgKG5iX2ZkcyBcXHUwMDNlIDEgfHwgcmVjdXJzaXZlKSlcXG4gXFx0XFx0anNvbndfc3RhcnRfYXJyYXkod3RyKTtcXHQvKiByb290IGFycmF5ICovXFxuIFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuYl9mZHM7IGkrKykge1xcbiBcXHRcXHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFxcdTAwMjZpbmZvLCBcXHUwMDI2bGVuKSkge1xcbkBAIC05NDQsMjIgKzEwNDAsMjggQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0XFx0XFx0ZXJyID0gLTE7XFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHR9XFxuLVxcdFxcdGVyciA9IG1hcF9kdW1wKGZkc1tpXSwgXFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFxcdTAwM2UgMSk7XFxuK1xcdFxcdGVyciA9IG1hcF9kdW1wKGZkc1tpXSwgXFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFxcdTAwM2UgMSB8fCByZWN1cnNpdmUsXFxuK1xcdFxcdFxcdCAgICAgICByZWN1cnNpdmUgPyBcXHUwMDI2Y3R4IDogTlVMTCk7XFxuIFxcdFxcdGlmICghd3RyIFxcdTAwMjZcXHUwMDI2IGkgIT0gbmJfZmRzIC0gMSlcXG4gXFx0XFx0XFx0cHJpbnRmKFxcXCJcXFxcblxcXCIpO1xcbiBcXG4gXFx0XFx0aWYgKGVycilcXG4gXFx0XFx0XFx0YnJlYWs7XFxuLVxcdFxcdGNsb3NlKGZkc1tpXSk7XFxuK1xcdFxcdC8qIEtlZXAgZGlzY292ZXJlZCBtYXBzIGFsaXZlIHVudGlsIHRoZSByZWN1cnNpdmUgZHVtcCBpcyBjb21wbGV0ZS4gKi9cXG4rXFx0XFx0aWYgKCFyZWN1cnNpdmUpXFxuK1xcdFxcdFxcdGNsb3NlKGZkc1tpXSk7XFxuIFxcdH1cXG4tXFx0aWYgKHd0ciBcXHUwMDI2XFx1MDAyNiBuYl9mZHMgXFx1MDAzZSAxKVxcbitcXHRpZiAod3RyIFxcdTAwMjZcXHUwMDI2IChuYl9mZHMgXFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZSkpXFxuIFxcdFxcdGpzb253X2VuZF9hcnJheSh3dHIpO1xcdC8qIHJvb3QgYXJyYXkgKi9cXG4gXFxuIFxcdGlmIChidGZfd3RyKVxcbiBcXHRcXHRqc29ud19kZXN0cm95KFxcdTAwMjZidGZfd3RyKTtcXG4gZXhpdF9jbG9zZTpcXG4rXFx0aWYgKHJlY3Vyc2l2ZSlcXG4rXFx0XFx0aSA9IDA7XFxuIFxcdGZvciAoOyBpIFxcdTAwM2MgbmJfZmRzOyBpKyspXFxuIFxcdFxcdGNsb3NlKGZkc1tpXSk7XFxuK1xcdGhhc2htYXBfX2ZyZWUoY3R4LnNlZW4pO1xcbiBleGl0X2ZyZWU6XFxuIFxcdGZyZWUoZmRzKTtcXG4gXFx0ZnJlZV9idGZfdm1saW51eCgpO1xcbkBAIC0xNDg0LDcgKzE1ODYsNyBAQCBzdGF0aWMgaW50IGRvX2hlbHAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHRcXFwiICAgICAgICAgICAgICAgICB0YXNrX3N0b3JhZ2UgfCBibG9vbV9maWx0ZXIgfCB1c2VyX3JpbmdidWYgfCBjZ3JwX3N0b3JhZ2UgfCBhcmVuYSB8XFxcXG5cXFwiXFxuIFxcdFxcdFxcXCIgICAgICAgICAgICAgICAgIGluc25fYXJyYXkgfCByaGFzaCB9XFxcXG5cXFwiXFxuIFxcdFxcdFxcXCIgICAgICAgXFxcIiBIRUxQX1NQRUNfT1BUSU9OUyBcXFwiIHxcXFxcblxcXCJcXG4tXFx0XFx0XFxcIiAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfVxcXFxuXFxcIlxcbitcXHRcXHRcXFwiICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB8IHstcnwtLXJlY3Vyc2l2ZX0gfVxcXFxuXFxcIlxcbiBcXHRcXHRcXFwiXFxcIixcXG4gXFx0XFx0YmluX25hbWUsIGFyZ3ZbLTJdKTtcXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uM2M0MjVkYmUyZDlkNFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmNcXG5AQCAtMCwwICsxLDI1MiBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGZ0b29sX2hlbHBlcnMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9idGYuaFxcdTAwM2VcXG4rXFxuKyNkZWZpbmUgT1VUUFVUX1NJWkUgODE5MlxcbitcXG4rc3RhdGljIGJvb2wgZHVtcF9tYXAoX191MzIgaWQsIGNvbnN0IGNoYXIgKm9wdGlvbnMsIGNoYXIgKm91dHB1dClcXG4re1xcbitcXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07XFxuK1xcbitcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCIlcyBtYXAgZHVtcCBpZCAldVxcXCIsIG9wdGlvbnMsIGlkKTtcXG4rXFx0bWVtc2V0KG91dHB1dCwgMCwgT1VUUFVUX1NJWkUpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFIC0gMSksXFxuK1xcdFxcdCAgICAgICBcXFwiZHVtcF9tYXBcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHQvKiBUaGUgaGVscGVyIGRvZXNuJ3QgdGVybWluYXRlIG9yIHN0cmlwIHRoZSBvdXRwdXQuICovXFxuK1xcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXFxcIlxcXFxuXFxcIildID0gJ1xcXFwwJztcXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuK3N0YXRpYyBfX3UzMiBtYXBfaWQoaW50IGZkKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xcbitcXHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcXHUwMDI2aW5mbywgXFx1MDAyNmxlbiksIFxcXCJtYXBfaW5mb1xcXCIpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0cmV0dXJuIGluZm8uaWQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgY291bnRfdG9rZW4oY29uc3QgY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICp0b2tlbilcXG4re1xcbitcXHRpbnQgY291bnQgPSAwO1xcbitcXG4rXFx0d2hpbGUgKChvdXRwdXQgPSBzdHJzdHIob3V0cHV0LCB0b2tlbikpKSB7XFxuK1xcdFxcdGNvdW50Kys7XFxuK1xcdFxcdG91dHB1dCArPSBzdHJsZW4odG9rZW4pO1xcbitcXHR9XFxuK1xcdHJldHVybiBjb3VudDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY2hlY2tfcGxhaW4oX191MzIgcm9vdF9pZCwgX191MzIgaW5uZXJfaWQsIGNvbnN0IGNoYXIgKnR5cGUsXFxuK1xcdFxcdFxcdGludCBlbnRyaWVzLCBib29sIHR5cGVkKVxcbit7XFxuK1xcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgaGVhZGVyWzEyOF07XFxuK1xcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9O1xcbitcXHRjb25zdCBjaGFyICpyb290LCAqaW5uZXI7XFxuK1xcbitcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCItLXJlY3Vyc2l2ZSBtYXAgZHVtcCBpZCAldVxcXCIsIHJvb3RfaWQpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksXFxuK1xcdFxcdCAgICAgICBcXFwicGxhaW5fZHVtcFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFxcXCIldTogJXMgIG5hbWUgZHVtcF9vdXRlciAgXFxcIiwgcm9vdF9pZCwgdHlwZSk7XFxuK1xcdHJvb3QgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIocm9vdCwgXFxcInBsYWluX3Jvb3RfaGVhZGVyXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0QVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsIFxcXCJwbGFpbl9yb290X2ZpcnN0XFxcIik7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFxcXCJpbm5lcl9tYXBfaWQ6XFxcIiksIGVudHJpZXMsIFxcXCJwbGFpbl9yZWZlcmVuY2VzXFxcIik7XFxuK1xcdGlmIChlbnRyaWVzKSB7XFxuK1xcdFxcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFxcXCIldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICBcXFwiLCBpbm5lcl9pZCk7XFxuK1xcdFxcdGlubmVyID0gc3Ryc3RyKG91dHB1dCwgaGVhZGVyKTtcXG4rXFx0XFx0aWYgKEFTU0VSVF9PS19QVFIoaW5uZXIsIFxcXCJwbGFpbl9pbm5lcl9oZWFkZXJcXFwiKSlcXG4rXFx0XFx0XFx0QVNTRVJUX0dUKGlubmVyIC0gcm9vdCwgMCwgXFxcInBsYWluX2lubmVyX2FmdGVyX3Jvb3RcXFwiKTtcXG4rXFx0XFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgaGVhZGVyKSwgMSwgXFxcInBsYWluX2lubmVyX29uY2VcXFwiKTtcXG4rXFx0fVxcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBcXFwiRm91bmQgXFxcIiksIGVudHJpZXMgXFx1MDAyNlxcdTAwMjYgIXR5cGVkID8gMiA6IDEsXFxuK1xcdFxcdCAgXFxcInBsYWluX21hcF9jb3VudFxcXCIpO1xcbitcXHRpZiAodHlwZWQpIHtcXG4rXFx0XFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBcXFwiXFxcXFxcXCJrZXlcXFxcXFxcIjogMFxcXCIsIFxcXCJwbGFpbl9idGZfa2V5XFxcIik7XFxuK1xcdFxcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgXFxcIlxcXFxcXFwidmFsdWVcXFxcXFxcIjogMTY4NDMwMDlcXFwiLCBcXFwicGxhaW5fYnRmX3ZhbHVlXFxcIik7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9vdXRlcihlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBpbnQgZW50cmllcywgYm9vbCBlbXB0eV9pbm5lcixcXG4rXFx0XFx0ICAgICAgIGJvb2wgdHlwZWQpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIGlubmVyX29wdHMpO1xcbitcXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xcbitcXHRjaGFyIG91dGVyW09VVFBVVF9TSVpFXSwgaW5uZXJbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdO1xcbitcXHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHJlZmVyZW5jZVs2NF07XFxuK1xcdGNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IGxpYmJwZl9icGZfbWFwX3R5cGVfc3RyKHR5cGUpO1xcbitcXHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMTtcXG4rXFx0X191MzIgcm9vdF9pZCwgaW5uZXJfaWQsIGtleSwgdmFsdWUgPSAweDAxMDEwMTAxO1xcbitcXG4rXFx0aWYgKHR5cGVkKSB7XFxuK1xcdFxcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFxcXCJjcmVhdGVfYnRmXFxcIikgfHxcXG4rXFx0XFx0ICAgICFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgXFxcInVuc2lnbmVkIGludFxcXCIsIDQsIDApLCAxLCBcXFwiYnRmX2ludFxcXCIpIHx8XFxuK1xcdFxcdCAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcXFwibG9hZF9idGZcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdGlubmVyX29wdHMuYnRmX2ZkID0gYnRmX19mZChidGYpO1xcbitcXHRcXHRpbm5lcl9vcHRzLmJ0Zl9rZXlfdHlwZV9pZCA9IDE7XFxuK1xcdFxcdGlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxO1xcbitcXHR9XFxuK1xcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFxcXCJkdW1wX2lubmVyXFxcIiwgc2l6ZW9mKGtleSksXFxuK1xcdFxcdFxcdFxcdCAgc2l6ZW9mKHZhbHVlKSwgMiwgXFx1MDAyNmlubmVyX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXFxcImNyZWF0ZV9pbm5lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0a2V5ID0gMDtcXG4rXFx0aWYgKCFlbXB0eV9pbm5lciBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGlubmVyX2ZkLCBcXHUwMDI2a2V5LCBcXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxcbitcXHRcXHQgICAgICAgXFxcInBvcHVsYXRlX2lubmVyXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkO1xcbitcXHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsIFxcXCJkdW1wX291dGVyXFxcIiwgc2l6ZW9mKGtleSksIHNpemVvZihfX3UzMiksXFxuK1xcdFxcdFxcdFxcdCAzLCBcXHUwMDI2b3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcXFwiY3JlYXRlX291dGVyXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHQvKiBUaGUgdW51c2VkIHRoaXJkIGFycmF5IHNsb3QgYWxzbyBleGVyY2lzZXMgZmFpbGVkIGxvb2t1cHMuICovXFxuK1xcdGZvciAoa2V5ID0gMDsga2V5IFxcdTAwM2MgZW50cmllczsga2V5KyspXFxuK1xcdFxcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFxcdTAwMjZrZXksIFxcdTAwMjZpbm5lcl9mZCwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicG9wdWxhdGVfb3V0ZXJcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xcbitcXHRpbm5lcl9pZCA9IG1hcF9pZChpbm5lcl9mZCk7XFxuK1xcdGlmICghcm9vdF9pZCB8fCAhaW5uZXJfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsIFxcXCItalxcXCIsIG91dGVyKSB8fFxcbitcXHQgICAgIWR1bXBfbWFwKGlubmVyX2lkLCBcXFwiLWpcXFwiLCBpbm5lcikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0QVNTRVJUX0VRKG91dGVyWzBdLCAnWycsIFxcXCJkZWZhdWx0X2FycmF5XFxcIik7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgXFxcIlxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjpcXFwiKSwgMCwgXFxcImRlZmF1bHRfbm9fd3JhcHBlclxcXCIpO1xcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFxcXCJcXFxcXFxcImlkXFxcXFxcXCI6XFxcIiksIDAsIFxcXCJkZWZhdWx0X25vX2hlYWRlclxcXCIpO1xcbitcXHRzbnByaW50ZihyZWZlcmVuY2UsIHNpemVvZihyZWZlcmVuY2UpLCBcXFwiXFxcXFxcXCJpbm5lcl9tYXBfaWRcXFxcXFxcIjoldVxcXCIsIGlubmVyX2lkKTtcXG4rXFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCByZWZlcmVuY2UpLCBlbnRyaWVzLCBcXFwiZGVmYXVsdF9yZWZlcmVuY2VzXFxcIik7XFxuK1xcdGlmICghZW50cmllcylcXG4rXFx0XFx0QVNTRVJUX1NUUkVRKG91dGVyLCBcXFwiW11cXFwiLCBcXFwiZW1wdHlfb3V0ZXJfZGVmYXVsdFxcXCIpO1xcbitcXHRpZiAoZW1wdHlfaW5uZXIpXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShpbm5lciwgXFxcIltdXFxcIiwgXFxcImVtcHR5X2lubmVyX2RlZmF1bHRcXFwiKTtcXG4rXFx0ZWxzZSBpZiAodHlwZWQpXFxuK1xcdFxcdEFTU0VSVF9IQVNfU1VCU1RSKGlubmVyLCBcXFwiXFxcXFxcXCJmb3JtYXR0ZWRcXFxcXFxcIjp7XFxcXFxcXCJrZXlcXFxcXFxcIjowLFxcXFxcXFwidmFsdWVcXFxcXFxcIjoxNjg0MzAwOX1cXFwiLFxcbitcXHRcXHRcXHRcXHQgIFxcXCJ0eXBlZF9pbm5lclxcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShpbm5lcixcXG4rXFx0XFx0XFx0ICAgICBcXFwiW3tcXFxcXFxcImtleVxcXFxcXFwiOltcXFxcXFxcIjB4MDBcXFxcXFxcIixcXFxcXFxcIjB4MDBcXFxcXFxcIixcXFxcXFxcIjB4MDBcXFxcXFxcIixcXFxcXFxcIjB4MDBcXFxcXFxcIl0sXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCJcXFxcXFxcInZhbHVlXFxcXFxcXCI6W1xcXFxcXFwiMHgwMVxcXFxcXFwiLFxcXFxcXFwiMHgwMVxcXFxcXFwiLFxcXFxcXFwiMHgwMVxcXFxcXFwiLFxcXFxcXFwiMHgwMVxcXFxcXFwiXX1dXFxcIixcXG4rXFx0XFx0XFx0ICAgICBcXFwib3JkaW5hcnlfZGVmYXVsdFxcXCIpO1xcbitcXG4rXFx0LyogQ29tcGFyZSB0aGUgY29tcGxldGUgSlNPTiBkb2N1bWVudDogYSBmbGF0IGFycmF5IHdpdGggdGhlIHJvb3QgZmlyc3QsXFxuK1xcdCAqIG9uZSBjb3B5IG9mIHRoZSBzaGFyZWQgaW5uZXIgbWFwLCBhbmQgdW5jaGFuZ2VkIGVudHJ5IHJlcHJlc2VudGF0aW9ucy5cXG4rXFx0ICovXFxuK1xcdGlmIChlbnRyaWVzKVxcbitcXHRcXHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcXG4rXFx0XFx0XFx0IFxcXCJbe1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFxcXFxcInR5cGVcXFxcXFxcIjpcXFxcXFxcIiVzXFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX291dGVyXFxcXFxcXCIsXFxcIlxcbitcXHRcXHRcXHQgXFxcIlxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc30se1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFxcXFxcInR5cGVcXFxcXFxcIjpcXFxcXFxcImhhc2hcXFxcXFxcIixcXFwiXFxuK1xcdFxcdFxcdCBcXFwiXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX2lubmVyXFxcXFxcXCIsXFxcXFxcXCJmbGFnc1xcXFxcXFwiOjAsXFxcXFxcXCJlbGVtZW50c1xcXFxcXFwiOiVzfV1cXFwiLFxcbitcXHRcXHRcXHQgcm9vdF9pZCwgdHlwZV9uYW1lLCBvdXRlciwgaW5uZXJfaWQsIGlubmVyKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcXG4rXFx0XFx0XFx0IFxcXCJbe1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFxcXFxcInR5cGVcXFxcXFxcIjpcXFxcXFxcIiVzXFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX291dGVyXFxcXFxcXCIsXFxcIlxcbitcXHRcXHRcXHQgXFxcIlxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjpbXX1dXFxcIiwgcm9vdF9pZCwgdHlwZV9uYW1lKTtcXG4rXFx0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFxcXCItaiAtclxcXCIsIG91dHB1dCkpXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcXFwicmVjdXJzaXZlX2pzb25cXFwiKTtcXG4rXFx0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFxcXCItLWpzb24gLS1yZWN1cnNpdmVcXFwiLCBvdXRwdXQpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcInJlY3Vyc2l2ZV9sb25nX29wdGlvbnNcXFwiKTtcXG4rXFx0Y2hlY2tfcGxhaW4ocm9vdF9pZCwgaW5uZXJfaWQsIHR5cGVfbmFtZSwgZW50cmllcywgdHlwZWQpO1xcbitcXG4rXFx0LyogUmVjdXJzaW9uIG9uIGFuIG9yZGluYXJ5IG1hcCBzdGlsbCBlbWl0cyBhIHNpbmdsZSBtYXAgb2JqZWN0LiAqL1xcbitcXHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcXG4rXFx0XFx0IFxcXCJbe1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFxcXFxcInR5cGVcXFxcXFxcIjpcXFxcXFxcImhhc2hcXFxcXFxcIixcXFxcXFxcIm5hbWVcXFxcXFxcIjpcXFxcXFxcImR1bXBfaW5uZXJcXFxcXFxcIixcXFwiXFxuK1xcdFxcdCBcXFwiXFxcXFxcXCJmbGFnc1xcXFxcXFwiOjAsXFxcXFxcXCJlbGVtZW50c1xcXFxcXFwiOiVzfV1cXFwiLCBpbm5lcl9pZCwgaW5uZXIpO1xcbitcXHRpZiAoZHVtcF9tYXAoaW5uZXJfaWQsIFxcXCItaiAtclxcXCIsIG91dHB1dCkpXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcXFwib3JkaW5hcnlfcmVjdXJzaXZlXFxcIik7XFxuK291dDpcXG4rXFx0aWYgKG91dGVyX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKG91dGVyX2ZkKTtcXG4rXFx0aWYgKGlubmVyX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKGlubmVyX2ZkKTtcXG4rXFx0YnRmX19mcmVlKGJ0Zik7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfbXVsdGlwbGVfcm9vdHModm9pZClcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcXG4rXFx0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBuYW1lW0JQRl9PQkpfTkFNRV9MRU5dO1xcbitcXHRjaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fSwgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiA0XSwgZWxlbWVudHNbT1VUUFVUX1NJWkVdO1xcbitcXHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHR5cGVzW10gPSB7IFxcXCJoYXNoXFxcIiwgXFxcImFycmF5X29mX21hcHNcXFwiLCBcXFwiaGFzaF9vZl9tYXBzXFxcIiwgXFxcImhhc2hcXFwiIH07XFxuK1xcdGludCBmZHNbXSA9IHsgLTEsIC0xLCAtMSwgLTEgfTtcXG4rXFx0X191MzIgaWRzWzRdLCBrZXk7XFxuK1xcdGludCBpLCBsZW4gPSAwO1xcbitcXG4rXFx0LyogU2VsZWN0IHRoZSBmaXJzdCBpbm5lciBtYXAgYW5kIGJvdGggb3V0ZXJzIGFzIHJvb3RzLiBUaGUgb3RoZXIgaW5uZXJcXG4rXFx0ICogbWFwIG11c3QgYmUgYXBwZW5kZWQgYWZ0ZXIgYWxsIHRocmVlIHJvb3RzLCBldmVuIHRob3VnaCBpdCBpcyBmb3VuZFxcbitcXHQgKiB3aGlsZSBkdW1waW5nIHRoZSBmaXJzdCBvdXRlci4gQSBwcm9jZXNzLXNwZWNpZmljIG5hbWUgYXZvaWRzIG90aGVyXFxuK1xcdCAqIHRlc3RzJyBtYXBzIGpvaW5pbmcgdGhlIHNlbGVjdGlvbi5cXG4rXFx0ICovXFxuK1xcdHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgXFxcImR1bXBfJXVcXFwiLCBnZXRwaWQoKSk7XFxuK1xcdGZkc1swXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBuYW1lLCA0LCA0LCAxLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzBdLCBcXFwiY3JlYXRlX3NlbGVjdGVkX2lubmVyXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmZHNbM10gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXFxcImR1bXBfZGlzY292ZXJlZFxcXCIsIDQsIDQsIDEsIE5VTEwpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbM10sIFxcXCJjcmVhdGVfZGlzY292ZXJlZF9pbm5lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0b3B0cy5pbm5lcl9tYXBfZmQgPSBmZHNbMF07XFxuK1xcdGZkc1sxXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBuYW1lLCA0LCA0LCAyLCBcXHUwMDI2b3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKGZkc1sxXSwgXFxcImNyZWF0ZV9hcnJheV9yb290XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmZHNbMl0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCBuYW1lLCA0LCA0LCAyLCBcXHUwMDI2b3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKGZkc1syXSwgXFxcImNyZWF0ZV9oYXNoX3Jvb3RcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGZvciAoaSA9IDE7IGkgXFx1MDAzYz0gMjsgaSsrKSB7XFxuK1xcdFxcdGtleSA9IDA7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCBcXHUwMDI2a2V5LCBcXHUwMDI2ZmRzWzBdLCBCUEZfQU5ZKSxcXG4rXFx0XFx0XFx0ICAgICAgIFxcXCJyZWZlcmVuY2Vfc2VsZWN0ZWRfaW5uZXJcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdGtleSA9IDE7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCBcXHUwMDI2a2V5LCBcXHUwMDI2ZmRzWzNdLCBCUEZfQU5ZKSxcXG4rXFx0XFx0XFx0ICAgICAgIFxcXCJyZWZlcmVuY2VfZGlzY292ZXJlZF9pbm5lclxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQVJSQVlfU0laRShmZHMpOyBpKyspIHtcXG4rXFx0XFx0aWRzW2ldID0gbWFwX2lkKGZkc1tpXSk7XFxuK1xcdFxcdGlmICghaWRzW2ldIHx8ICFkdW1wX21hcChpZHNbaV0sIFxcXCItalxcXCIsIGVsZW1lbnRzKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdGxlbiArPSBzbnByaW50ZihleHBlY3RlZCArIGxlbiwgc2l6ZW9mKGV4cGVjdGVkKSAtIGxlbixcXG4rXFx0XFx0XFx0XFx0XFxcIiVze1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFxcXFxcInR5cGVcXFxcXFxcIjpcXFxcXFxcIiVzXFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXCJcXG4rXFx0XFx0XFx0XFx0XFxcIlxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc30lc1xcXCIsXFxuK1xcdFxcdFxcdFxcdGkgPyBcXFwiLFxcXCIgOiBcXFwiW1xcXCIsIGlkc1tpXSwgdHlwZXNbaV0sXFxuK1xcdFxcdFxcdFxcdGkgPT0gMyA/IFxcXCJkdW1wX2Rpc2NvdmVyZWRcXFwiIDogbmFtZSwgZWxlbWVudHMsIGkgPT0gMyA/IFxcXCJdXFxcIiA6IFxcXCJcXFwiKTtcXG4rXFx0fVxcbitcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCItaiAtciBtYXAgZHVtcCBuYW1lICVzXFxcIiwgbmFtZSk7XFxuK1xcdGlmIChBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxcbitcXHRcXHQgICAgICBcXFwiZHVtcF9tdWx0aXBsZV9yb290c1xcXCIpKSB7XFxuK1xcdFxcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXFxcIlxcXFxuXFxcIildID0gJ1xcXFwwJztcXG4rXFx0XFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFxcXCJyb290c19maXJzdF9hbmRfc2VlZF9kZWR1cFxcXCIpO1xcbitcXHR9XFxuK291dDpcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEFSUkFZX1NJWkUoZmRzKTsgaSsrKVxcbitcXHRcXHRpZiAoZmRzW2ldIFxcdTAwM2U9IDApXFxuK1xcdFxcdFxcdGNsb3NlKGZkc1tpXSk7XFxuK31cXG4rXFxuK3ZvaWQgdGVzdF9icGZ0b29sX21hcF9kdW1wKHZvaWQpXFxuK3tcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcIm11bHRpcGxlX3Jvb3RzXFxcIikpXFxuK1xcdFxcdHRlc3RfbXVsdGlwbGVfcm9vdHMoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImFycmF5X29mX21hcHNcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMSwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImhhc2hfb2ZfbWFwc1xcXCIpKVxcbitcXHRcXHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJzaGFyZWRfaW5uZXJcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMiwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImVtcHR5X2FycmF5X29mX21hcHNcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMCwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImVtcHR5X2hhc2hfb2ZfbWFwc1xcXCIpKVxcbitcXHRcXHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJidGZfaW5uZXJcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgdHJ1ZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJlbXB0eV9pbm5lclxcXCIpKVxcbitcXHRcXHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIHRydWUsIGZhbHNlKTtcXG4rfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwMDo1MzozMi40ODA1MTYzMDZaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjczMzIyOTk5NTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlci1zcGFjZSBjb2RlIGluIHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYuIEl0IGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcywgYW5kIGlzIHRoZXJlZm9yZSBub3QgcmVsZXZhbnQgZm9yIHN5emthbGxlciBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBiZGI1NmYzNDFmMjI3Mjc1YjI4ZDFhMTI2MTBiMWVhZDViNzI0NzAyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAwMDo1MzozMCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLmMxMzUzMzg2MDBlOGYgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbkBAIC0xNiw3ICsxNiw3IEBAIFNZTk9QU0lTXG4gXG4gKipicGZ0b29sKiogWypPUFRJT05TKl0gKiptYXAqKiAqQ09NTUFORCpcbiBcbi0qT1BUSU9OUyogOj0geyB8Q09NTU9OX09QVElPTlN8IHwgeyAqKi1mKiogfCAqKi0tYnBmZnMqKiB9IHwgeyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfVxuKypPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfCB7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB8IHsgKiotcioqIHwgKiotLXJlY3Vyc2l2ZSoqIH0gfVxuIFxuICpDT01NQU5EUyogOj1cbiB7ICoqc2hvdyoqIHwgKipsaXN0KiogfCAqKmNyZWF0ZSoqIHwgKipkdW1wKiogfCAqKnVwZGF0ZSoqIHwgKipsb29rdXAqKiB8ICoqZ2V0bmV4dCoqIHxcbkBAIC0xNzAsNiArMTcwLDIzIEBAIE9QVElPTlNcbiAgICAgRG8gbm90IGF1dG9tYXRpY2FsbHkgYXR0ZW1wdCB0byBtb3VudCBhbnkgdmlydHVhbCBmaWxlIHN5c3RlbSAoc3VjaCBhc1xuICAgICB0cmFjZWZzIG9yIEJQRiB2aXJ0dWFsIGZpbGUgc3lzdGVtKSB3aGVuIG5lY2Vzc2FyeS5cbiBcbistciwgLS1yZWN1cnNpdmVcbisgICAgQWxzbyBkdW1wIHRoZSBpbm5lciBtYXBzIHJlZmVyZW5jZWQgYnkgKiphcnJheV9vZl9tYXBzKiogYW5kICoqaGFzaF9vZl9tYXBzKipcbisgICAgZW50cmllcyB3aGVuIHJ1bm5pbmcgKiptYXAgZHVtcCoqLiBFYWNoIG1hcCBpcyBkdW1wZWQgb25jZSwgZXZlbiBpZiBzZXZlcmFsXG4rICAgIGVudHJpZXMgcmVmZXIgdG8gaXQuIFNlbGVjdGVkIG1hcHMgYXJlIGZvbGxvd2VkIGJ5IHRoZWlyIGlubmVyIG1hcHMuXG4rXG4rICAgIFBsYWluIG91dHB1dCBpbmNsdWRlcyBhIGhlYWRlciBpZGVudGlmeWluZyBlYWNoIG1hcC4gT24gc3VjY2VzcywgSlNPTiBvdXRwdXRcbisgICAgaXMgYWx3YXlzIGFuIGFycmF5IG9mIG1hcCBvYmplY3RzLCBlYWNoIGNvbnRhaW5pbmcgYW4gKippZCoqIGFuZCBhblxuKyAgICAqKmVsZW1lbnRzKiogYXJyYXksIGluY2x1ZGluZyB3aGVuIG9ubHkgb25lIG1hcCBpcyBkdW1wZWQuIE91dGVyIG1hcCBlbnRyaWVzXG4rICAgIHJldGFpbiB0aGVpciAqKmlubmVyX21hcF9pZCoqIGZpZWxkLCB3aGljaCBpZGVudGlmaWVzIHRoZSBjb3JyZXNwb25kaW5nIGlubmVyXG4rICAgIG1hcCBvYmplY3QuXG4rXG4rICAgIFRoZSBkdW1wIGlzIG5vdCBhIHNuYXBzaG90OiBjb25jdXJyZW50IHVwZGF0ZXMgY2FuIGNoYW5nZSBtYXAgY29udGVudHMuXG4rICAgIEZhaWx1cmUgdG8gb3BlbiBhIHJlZmVyZW5jZWQgaW5uZXIgbWFwIHN0b3BzIHRoZSBkdW1wIGFuZCByZXR1cm5zIGEgbm9uemVyb1xuKyAgICBleGl0IHN0YXR1cy4gT3V0cHV0IG1heSBjb250YWluIG1hcHMgb3IgZW50cmllcyBwcmludGVkIGJlZm9yZSB0aGUgZXJyb3IuXG4rICAgIEluIEpTT04gbW9kZSwgYW4gZXJyb3IgZHVyaW5nIHRyYXZlcnNhbCBpcyBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGFuZCB0aGVcbisgICAgZW5jbG9zaW5nIGFycmF5cyBhbmQgb2JqZWN0cyBhcmUgY2xvc2VkLlxuK1xuIEVYQU1QTEVTXG4gPT09PT09PT1cbiAqKiMgYnBmdG9vbCBtYXAgc2hvdyoqXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxuaW5kZXggNzVjYmNiNTEyZWJhZS4uNDVjMzM2ZDYzYmUwYSAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxuQEAgLTI2MSw3ICsyNjEsNyBAQCBfYnBmdG9vbCgpXG4gXG4gICAgICMgRGVhbCB3aXRoIG9wdGlvbnNcbiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuXG4tICAgICAgICBsb2NhbCBjPSctLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcXFxuKyAgICAgICAgbG9jYWwgYz0nLS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLXJlY3Vyc2l2ZSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcbiAgICAgICAgICAgICAtLXVzZS1sb2FkZXIgLS1iYXNlLWJ0ZiAtLXNpZ24gLWkgLWsnXG4gICAgICAgICBDT01QUkVQTFk9KCAkKCBjb21wZ2VuIC1XIFwiJGNcIiAtLSBcIiRjdXJcIiApIClcbiAgICAgICAgIHJldHVybiAwXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jXG5pbmRleCBjOTFlMWE2ZTFhMWVjLi4yOTAyMWY0ZGQ0NTE4IDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbkBAIC0yNiw2ICsyNiw3IEBAIHN0YXRpYyBpbnQgKCpsYXN0X2RvX2hlbHApKGludCBhcmdjLCBjaGFyICoqYXJndik7XG4ganNvbl93cml0ZXJfdCAqanNvbl93dHI7XG4gYm9vbCBwcmV0dHlfb3V0cHV0O1xuIGJvb2wganNvbl9vdXRwdXQ7XG4rYm9vbCByZWN1cnNpdmU7XG4gYm9vbCBzaG93X3Bpbm5lZDtcbiBib29sIGJsb2NrX21vdW50O1xuIGJvb2wgdmVyaWZpZXJfbG9ncztcbkBAIC00NTIsNiArNDUzLDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR7IFwianNvblwiLFx0bm9fYXJndW1lbnQsXHROVUxMLFx0J2onIH0sXG4gXHRcdHsgXCJoZWxwXCIsXHRub19hcmd1bWVudCxcdE5VTEwsXHQnaCcgfSxcbiBcdFx0eyBcInByZXR0eVwiLFx0bm9fYXJndW1lbnQsXHROVUxMLFx0J3AnIH0sXG4rXHRcdHsgXCJyZWN1cnNpdmVcIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdyJyB9LFxuIFx0XHR7IFwidmVyc2lvblwiLFx0bm9fYXJndW1lbnQsXHROVUxMLFx0J1YnIH0sXG4gXHRcdHsgXCJicGZmc1wiLFx0bm9fYXJndW1lbnQsXHROVUxMLFx0J2YnIH0sXG4gXHRcdHsgXCJtYXBjb21wYXRcIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdtJyB9LFxuQEAgLTQ4NSw3ICs0ODcsNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRiaW5fbmFtZSA9IFwiYnBmdG9vbFwiO1xuIFxuIFx0b3B0ZXJyID0gMDtcbi1cdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXCJWaHBqZkxtbmRTaTprOkI6bFwiLFxuK1x0d2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBcIlZocGpyZkxtbmRTaTprOkI6bFwiLFxuIFx0XHRcdFx0ICBvcHRpb25zLCBOVUxMKSkgXHUwMDNlPSAwKSB7XG4gXHRcdHN3aXRjaCAob3B0KSB7XG4gXHRcdGNhc2UgJ1YnOlxuQEAgLTUwNyw2ICs1MDksOSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdFx0fVxuIFx0XHRcdGpzb253X3ByZXR0eShqc29uX3d0ciwgcHJldHR5X291dHB1dCk7XG4gXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgJ3InOlxuK1x0XHRcdHJlY3Vyc2l2ZSA9IHRydWU7XG4rXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJ2YnOlxuIFx0XHRcdHNob3dfcGlubmVkID0gdHJ1ZTtcbiBcdFx0XHRicmVhaztcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmggYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbmluZGV4IDc4YjZlMGViYjg1ZDguLmI1ZGM3OTYwY2Y2ODIgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxuQEAgLTgzLDYgKzgzLDcgQEAgZXh0ZXJuIGNvbnN0IGNoYXIgKmJpbl9uYW1lO1xuIFxuIGV4dGVybiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcbiBleHRlcm4gYm9vbCBqc29uX291dHB1dDtcbitleHRlcm4gYm9vbCByZWN1cnNpdmU7XG4gZXh0ZXJuIGJvb2wgc2hvd19waW5uZWQ7XG4gZXh0ZXJuIGJvb2wgc2hvd19waWRzO1xuIGV4dGVybiBib29sIGJsb2NrX21vdW50O1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbmluZGV4IDY4NGE4ZmI3MjQxNDYuLjg1M2Y3NzViN2Q1MjkgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbkBAIC03NDUsOCArNzQ1LDEwIEBAIHN0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4gXHRcdFx0IGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXG4ge1xuIFx0aWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7XG4tXHRcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGVycm5vKTtcbi1cdFx0cmV0dXJuIC0xO1xuK1x0XHRpbnQgbG9va3VwX2Vycm5vID0gZXJybm87XG4rXG4rXHRcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGxvb2t1cF9lcnJubyk7XG4rXHRcdHJldHVybiAtbG9va3VwX2Vycm5vO1xuIFx0fVxuIFxuIFx0aWYgKGpzb25fb3V0cHV0KSB7XG5AQCAtODI2LDEyICs4MjgsNTMgQEAgc3RhdGljIHZvaWQgZnJlZV9tYXBfa3ZfYnRmKHN0cnVjdCBidGYgKmJ0ZilcbiBcdFx0YnRmX19mcmVlKGJ0Zik7XG4gfVxuIFxuK3N0cnVjdCBtYXBfZHVtcF9jdHgge1xuK1x0c3RydWN0IGhhc2htYXAgKnNlZW47XG4rXHRpbnQgKipmZHM7XG4rXHRpbnQgKm5iX2Zkcztcbit9O1xuK1xuK3N0YXRpYyBpbnQgY29sbGVjdF9pbm5lcl9tYXAoc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4LCBfX3UzMiBpZClcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfZ2V0X2ZkX2J5X2lkX29wdHMsIG9wdHMsXG4rXHRcdC5vcGVuX2ZsYWdzID0gQlBGX0ZfUkRPTkxZLFxuK1x0KTtcbitcdGludCAqZmRzLCBmZCwgZXJyO1xuK1xuK1x0aWYgKGhhc2htYXBfX2ZpbmQoY3R4LVx1MDAzZXNlZW4sIGlkLCBOVUxMKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRmZCA9IGJwZl9tYXBfZ2V0X2ZkX2J5X2lkX29wdHMoaWQsIFx1MDAyNm9wdHMpO1xuK1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4rXHRcdHBfZXJyKFwiY2FuJ3Qgb3BlbiBpbm5lciBtYXAgaWQgJXU6ICVzXCIsIGlkLCBzdHJlcnJvcihlcnJubykpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXG4rXHRmZHMgPSByZWFsbG9jKCpjdHgtXHUwMDNlZmRzLCAoKmN0eC1cdTAwM2VuYl9mZHMgKyAxVUxMKSAqIHNpemVvZigqZmRzKSk7XG4rXHRpZiAoIWZkcykge1xuK1x0XHRwX2VycihcIm1lbSBhbGxvYyBmYWlsZWRcIik7XG4rXHRcdGNsb3NlKGZkKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1x0KmN0eC1cdTAwM2VmZHMgPSBmZHM7XG4rXG4rXHRlcnIgPSBoYXNobWFwX19hZGQoY3R4LVx1MDAzZXNlZW4sIGlkLCAwKTtcbitcdGlmIChlcnIpIHtcbitcdFx0cF9lcnIoXCJmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXNcIiwgaWQsIHN0cmVycm9yKC1lcnIpKTtcbitcdFx0Y2xvc2UoZmQpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXHRmZHNbKCpjdHgtXHUwMDNlbmJfZmRzKSsrXSA9IGZkO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuIHN0YXRpYyBpbnRcbiBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbi1cdCBib29sIHNob3dfaGVhZGVyKVxuK1x0IGJvb2wgc2hvd19oZWFkZXIsIHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eClcbiB7XG4gXHR2b2lkICprZXksICp2YWx1ZSwgKnByZXZfa2V5O1xuIFx0dW5zaWduZWQgaW50IG51bV9lbGVtcyA9IDA7XG4rXHRqc29uX3dyaXRlcl90ICpwbGFpbl9idGZfd3RyID0gTlVMTDtcbiBcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4gXHRpbnQgZXJyO1xuIFxuQEAgLTg0NSw2ICs4ODgsMTcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXG4gXHRwcmV2X2tleSA9IE5VTEw7XG4gXG4rXHRpZiAoY3R4IFx1MDAyNlx1MDAyNiAhd3RyIFx1MDAyNlx1MDAyNiAoaW5mby1cdTAwM2VidGZfdmFsdWVfdHlwZV9pZCB8fFxuK1x0XHRcdCAgICBpbmZvLVx1MDAzZWJ0Zl92bWxpbnV4X3ZhbHVlX3R5cGVfaWQpKSB7XG4rXHRcdHBsYWluX2J0Zl93dHIgPSBnZXRfYnRmX3dyaXRlcigpO1xuK1x0XHRpZiAocGxhaW5fYnRmX3d0cikge1xuK1x0XHRcdGlmIChzaG93X2hlYWRlcilcbitcdFx0XHRcdHNob3dfbWFwX2hlYWRlcl9wbGFpbihpbmZvKTtcbitcdFx0XHRzaG93X2hlYWRlciA9IGZhbHNlO1xuK1x0XHRcdHd0ciA9IHBsYWluX2J0Zl93dHI7XG4rXHRcdH1cbitcdH1cbitcbiBcdGlmICh3dHIpIHtcbiBcdFx0ZXJyID0gZ2V0X21hcF9rdl9idGYoaW5mbywgXHUwMDI2YnRmKTtcbiBcdFx0aWYgKGVycikge1xuQEAgLTg3NCwxMCArOTI4LDIyIEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0XHRpZiAoZXJyKSB7XG4gXHRcdFx0aWYgKGVycm5vID09IEVOT0VOVClcbiBcdFx0XHRcdGVyciA9IDA7XG4rXHRcdFx0ZWxzZSBpZiAoY3R4KVxuK1x0XHRcdFx0cF9lcnIoXCJjYW4ndCBnZXQgbmV4dCBrZXkgZm9yIG1hcCBpZCAldTogJXNcIixcbitcdFx0XHRcdCAgICAgIGluZm8tXHUwMDNlaWQsIHN0cmVycm9yKGVycm5vKSk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbi1cdFx0aWYgKCFkdW1wX21hcF9lbGVtKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cikpXG4rXHRcdGVyciA9IGR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTtcbitcdFx0aWYgKCFlcnIpIHtcbiBcdFx0XHRudW1fZWxlbXMrKztcbitcdFx0XHRpZiAoY3R4IFx1MDAyNlx1MDAyNiBtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cdTAwM2V0eXBlKSkge1xuK1x0XHRcdFx0ZXJyID0gY29sbGVjdF9pbm5lcl9tYXAoY3R4LCAqKF9fdTMyICopdmFsdWUpO1xuK1x0XHRcdFx0aWYgKGVycilcbitcdFx0XHRcdFx0YnJlYWs7XG4rXHRcdFx0fVxuK1x0XHR9IGVsc2UgaWYgKGN0eCBcdTAwMjZcdTAwMjYgZXJyICE9IC1FTk9FTlQpIHtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuIFx0XHRwcmV2X2tleSA9IGtleTtcbiBcdH1cbiBcbkBAIC04OTQsNiArOTYwLDggQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXHRmcmVlKGtleSk7XG4gXHRmcmVlKHZhbHVlKTtcbiBcdGZyZWVfbWFwX2t2X2J0ZihidGYpO1xuK1x0aWYgKHBsYWluX2J0Zl93dHIpXG4rXHRcdGpzb253X2Rlc3Ryb3koXHUwMDI2cGxhaW5fYnRmX3d0cik7XG4gXG4gXHRyZXR1cm4gZXJyO1xuIH1cbkBAIC05MDIsNiArOTcwLDcgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiB7XG4gXHRqc29uX3dyaXRlcl90ICp3dHIgPSBOVUxMLCAqYnRmX3d0ciA9IE5VTEw7XG4gXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbitcdHN0cnVjdCBtYXBfZHVtcF9jdHggY3R4ID0ge307XG4gXHRpbnQgbmJfZmRzLCBpID0gMDtcbiBcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbiBcdGludCAqZmRzID0gTlVMTDtcbkBAIC05MTksOSArOTg4LDM2IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRpZiAobmJfZmRzIFx1MDAzYyAxKVxuIFx0XHRnb3RvIGV4aXRfZnJlZTtcbiBcbitcdGlmIChyZWN1cnNpdmUpIHtcbitcdFx0Y3R4LnNlZW4gPSBoYXNobWFwX19uZXcoaGFzaF9mbl9mb3Jfa2V5X2FzX2lkLFxuK1x0XHRcdFx0XHRlcXVhbF9mbl9mb3Jfa2V5X2FzX2lkLCBOVUxMKTtcbitcdFx0aWYgKElTX0VSUihjdHguc2VlbikpIHtcbitcdFx0XHRjdHguc2VlbiA9IE5VTEw7XG4rXHRcdFx0cF9lcnIoXCJmYWlsZWQgdG8gY3JlYXRlIGhhc2htYXAgZm9yIHJlY3Vyc2l2ZSBkdW1wXCIpO1xuK1x0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbitcdFx0fVxuK1x0XHRjdHguZmRzID0gXHUwMDI2ZmRzO1xuK1x0XHRjdHgubmJfZmRzID0gXHUwMDI2bmJfZmRzO1xuK1x0XHQvKiBSZWNvcmQgdGhlIHNlbGVjdGVkIG1hcHMgYmVmb3JlIGRpc2NvdmVyaW5nIGFueSBpbm5lciBtYXBzLiAqL1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYl9mZHM7IGkrKykge1xuK1x0XHRcdGxlbiA9IHNpemVvZihpbmZvKTtcbitcdFx0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFx1MDAyNmluZm8sIFx1MDAyNmxlbikpIHtcbitcdFx0XHRcdHBfZXJyKFwiY2FuJ3QgZ2V0IG1hcCBpbmZvOiAlc1wiLCBzdHJlcnJvcihlcnJubykpO1xuK1x0XHRcdFx0ZXJyID0gLTE7XG4rXHRcdFx0XHRnb3RvIGV4aXRfY2xvc2U7XG4rXHRcdFx0fVxuK1x0XHRcdGVyciA9IGhhc2htYXBfX2FkZChjdHguc2VlbiwgaW5mby5pZCwgMCk7XG4rXHRcdFx0aWYgKGVycikge1xuK1x0XHRcdFx0cF9lcnIoXCJmYWlsZWQgdG8gcmVjb3JkIG1hcCBpZCAldTogJXNcIiwgaW5mby5pZCxcbitcdFx0XHRcdCAgICAgIHN0cmVycm9yKC1lcnIpKTtcbitcdFx0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbitcdFx0XHR9XG4rXHRcdH1cbitcdH1cbitcbiBcdGlmIChqc29uX291dHB1dCkge1xuIFx0XHR3dHIgPSBqc29uX3d0cjtcbi1cdH0gZWxzZSB7XG4rXHR9IGVsc2UgaWYgKCFyZWN1cnNpdmUpIHtcbiBcdFx0aW50IGRvX3BsYWluX2J0ZjtcbiBcbiBcdFx0ZG9fcGxhaW5fYnRmID0gbWFwc19oYXZlX2J0ZihmZHMsIG5iX2Zkcyk7XG5AQCAtOTM2LDcgKzEwMzIsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR9XG4gXHR9XG4gXG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4rXHRpZiAod3RyIFx1MDAyNlx1MDAyNiAobmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZSkpXG4gXHRcdGpzb253X3N0YXJ0X2FycmF5KHd0cik7XHQvKiByb290IGFycmF5ICovXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYl9mZHM7IGkrKykge1xuIFx0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFx1MDAyNmluZm8sIFx1MDAyNmxlbikpIHtcbkBAIC05NDQsMjIgKzEwNDAsMjggQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHRlcnIgPSAtMTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuLVx0XHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFx1MDAzZSAxKTtcbitcdFx0ZXJyID0gbWFwX2R1bXAoZmRzW2ldLCBcdTAwMjZpbmZvLCB3dHIsIG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmUsXG4rXHRcdFx0ICAgICAgIHJlY3Vyc2l2ZSA/IFx1MDAyNmN0eCA6IE5VTEwpO1xuIFx0XHRpZiAoIXd0ciBcdTAwMjZcdTAwMjYgaSAhPSBuYl9mZHMgLSAxKVxuIFx0XHRcdHByaW50ZihcIlxcblwiKTtcbiBcbiBcdFx0aWYgKGVycilcbiBcdFx0XHRicmVhaztcbi1cdFx0Y2xvc2UoZmRzW2ldKTtcbitcdFx0LyogS2VlcCBkaXNjb3ZlcmVkIG1hcHMgYWxpdmUgdW50aWwgdGhlIHJlY3Vyc2l2ZSBkdW1wIGlzIGNvbXBsZXRlLiAqL1xuK1x0XHRpZiAoIXJlY3Vyc2l2ZSlcbitcdFx0XHRjbG9zZShmZHNbaV0pO1xuIFx0fVxuLVx0aWYgKHd0ciBcdTAwMjZcdTAwMjYgbmJfZmRzIFx1MDAzZSAxKVxuK1x0aWYgKHd0ciBcdTAwMjZcdTAwMjYgKG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmUpKVxuIFx0XHRqc29ud19lbmRfYXJyYXkod3RyKTtcdC8qIHJvb3QgYXJyYXkgKi9cbiBcbiBcdGlmIChidGZfd3RyKVxuIFx0XHRqc29ud19kZXN0cm95KFx1MDAyNmJ0Zl93dHIpO1xuIGV4aXRfY2xvc2U6XG4rXHRpZiAocmVjdXJzaXZlKVxuK1x0XHRpID0gMDtcbiBcdGZvciAoOyBpIFx1MDAzYyBuYl9mZHM7IGkrKylcbiBcdFx0Y2xvc2UoZmRzW2ldKTtcbitcdGhhc2htYXBfX2ZyZWUoY3R4LnNlZW4pO1xuIGV4aXRfZnJlZTpcbiBcdGZyZWUoZmRzKTtcbiBcdGZyZWVfYnRmX3ZtbGludXgoKTtcbkBAIC0xNDg0LDcgKzE1ODYsNyBAQCBzdGF0aWMgaW50IGRvX2hlbHAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRcIiAgICAgICAgICAgICAgICAgdGFza19zdG9yYWdlIHwgYmxvb21fZmlsdGVyIHwgdXNlcl9yaW5nYnVmIHwgY2dycF9zdG9yYWdlIHwgYXJlbmEgfFxcblwiXG4gXHRcdFwiICAgICAgICAgICAgICAgICBpbnNuX2FycmF5IHwgcmhhc2ggfVxcblwiXG4gXHRcdFwiICAgICAgIFwiIEhFTFBfU1BFQ19PUFRJT05TIFwiIHxcXG5cIlxuLVx0XHRcIiAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfVxcblwiXG4rXHRcdFwiICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB8IHstcnwtLXJlY3Vyc2l2ZX0gfVxcblwiXG4gXHRcdFwiXCIsXG4gXHRcdGJpbl9uYW1lLCBhcmd2Wy0yXSk7XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uM2M0MjVkYmUyZDlkNFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jXG5AQCAtMCwwICsxLDI1MiBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbisjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGZ0b29sX2hlbHBlcnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuK1xuKyNkZWZpbmUgT1VUUFVUX1NJWkUgODE5MlxuK1xuK3N0YXRpYyBib29sIGR1bXBfbWFwKF9fdTMyIGlkLCBjb25zdCBjaGFyICpvcHRpb25zLCBjaGFyICpvdXRwdXQpXG4re1xuK1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dO1xuK1xuK1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcIiVzIG1hcCBkdW1wIGlkICV1XCIsIG9wdGlvbnMsIGlkKTtcbitcdG1lbXNldChvdXRwdXQsIDAsIE9VVFBVVF9TSVpFKTtcbitcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUgLSAxKSxcbitcdFx0ICAgICAgIFwiZHVtcF9tYXBcIikpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdC8qIFRoZSBoZWxwZXIgZG9lc24ndCB0ZXJtaW5hdGUgb3Igc3RyaXAgdGhlIG91dHB1dC4gKi9cbitcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXCJcXG5cIildID0gJ1xcMCc7XG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rc3RhdGljIF9fdTMyIG1hcF9pZChpbnQgZmQpXG4re1xuK1x0c3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307XG4rXHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XG4rXG4rXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcdTAwMjZpbmZvLCBcdTAwMjZsZW4pLCBcIm1hcF9pbmZvXCIpKVxuK1x0XHRyZXR1cm4gMDtcbitcdHJldHVybiBpbmZvLmlkO1xuK31cbitcbitzdGF0aWMgaW50IGNvdW50X3Rva2VuKGNvbnN0IGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqdG9rZW4pXG4re1xuK1x0aW50IGNvdW50ID0gMDtcbitcbitcdHdoaWxlICgob3V0cHV0ID0gc3Ryc3RyKG91dHB1dCwgdG9rZW4pKSkge1xuK1x0XHRjb3VudCsrO1xuK1x0XHRvdXRwdXQgKz0gc3RybGVuKHRva2VuKTtcbitcdH1cbitcdHJldHVybiBjb3VudDtcbit9XG4rXG4rc3RhdGljIHZvaWQgY2hlY2tfcGxhaW4oX191MzIgcm9vdF9pZCwgX191MzIgaW5uZXJfaWQsIGNvbnN0IGNoYXIgKnR5cGUsXG4rXHRcdFx0aW50IGVudHJpZXMsIGJvb2wgdHlwZWQpXG4re1xuK1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBoZWFkZXJbMTI4XTtcbitcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9O1xuK1x0Y29uc3QgY2hhciAqcm9vdCwgKmlubmVyO1xuK1xuK1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcIi0tcmVjdXJzaXZlIG1hcCBkdW1wIGlkICV1XCIsIHJvb3RfaWQpO1xuK1x0aWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxuK1x0XHQgICAgICAgXCJwbGFpbl9kdW1wXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCBcIiV1OiAlcyAgbmFtZSBkdW1wX291dGVyICBcIiwgcm9vdF9pZCwgdHlwZSk7XG4rXHRyb290ID0gc3Ryc3RyKG91dHB1dCwgaGVhZGVyKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihyb290LCBcInBsYWluX3Jvb3RfaGVhZGVyXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRBU1NFUlRfRVEocm9vdCAtIG91dHB1dCwgMCwgXCJwbGFpbl9yb290X2ZpcnN0XCIpO1xuK1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXCJpbm5lcl9tYXBfaWQ6XCIpLCBlbnRyaWVzLCBcInBsYWluX3JlZmVyZW5jZXNcIik7XG4rXHRpZiAoZW50cmllcykge1xuK1x0XHRzbnByaW50ZihoZWFkZXIsIHNpemVvZihoZWFkZXIpLCBcIiV1OiBoYXNoICBuYW1lIGR1bXBfaW5uZXIgIFwiLCBpbm5lcl9pZCk7XG4rXHRcdGlubmVyID0gc3Ryc3RyKG91dHB1dCwgaGVhZGVyKTtcbitcdFx0aWYgKEFTU0VSVF9PS19QVFIoaW5uZXIsIFwicGxhaW5faW5uZXJfaGVhZGVyXCIpKVxuK1x0XHRcdEFTU0VSVF9HVChpbm5lciAtIHJvb3QsIDAsIFwicGxhaW5faW5uZXJfYWZ0ZXJfcm9vdFwiKTtcbitcdFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgaGVhZGVyKSwgMSwgXCJwbGFpbl9pbm5lcl9vbmNlXCIpO1xuK1x0fVxuK1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXCJGb3VuZCBcIiksIGVudHJpZXMgXHUwMDI2XHUwMDI2ICF0eXBlZCA/IDIgOiAxLFxuK1x0XHQgIFwicGxhaW5fbWFwX2NvdW50XCIpO1xuK1x0aWYgKHR5cGVkKSB7XG4rXHRcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgXCJcXFwia2V5XFxcIjogMFwiLCBcInBsYWluX2J0Zl9rZXlcIik7XG4rXHRcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgXCJcXFwidmFsdWVcXFwiOiAxNjg0MzAwOVwiLCBcInBsYWluX2J0Zl92YWx1ZVwiKTtcbitcdH1cbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9vdXRlcihlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBpbnQgZW50cmllcywgYm9vbCBlbXB0eV9pbm5lcixcbitcdFx0ICAgICAgIGJvb2wgdHlwZWQpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4rXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBpbm5lcl9vcHRzKTtcbitcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4rXHRjaGFyIG91dGVyW09VVFBVVF9TSVpFXSwgaW5uZXJbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdO1xuK1x0Y2hhciBleHBlY3RlZFtPVVRQVVRfU0laRSAqIDNdLCByZWZlcmVuY2VbNjRdO1xuK1x0Y29uc3QgY2hhciAqdHlwZV9uYW1lID0gbGliYnBmX2JwZl9tYXBfdHlwZV9zdHIodHlwZSk7XG4rXHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMTtcbitcdF9fdTMyIHJvb3RfaWQsIGlubmVyX2lkLCBrZXksIHZhbHVlID0gMHgwMTAxMDEwMTtcbitcbitcdGlmICh0eXBlZCkge1xuK1x0XHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xuK1x0XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcImNyZWF0ZV9idGZcIikgfHxcbitcdFx0ICAgICFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgXCJ1bnNpZ25lZCBpbnRcIiwgNCwgMCksIDEsIFwiYnRmX2ludFwiKSB8fFxuK1x0XHQgICAgIUFTU0VSVF9PSyhidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKSwgXCJsb2FkX2J0ZlwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0aW5uZXJfb3B0cy5idGZfZmQgPSBidGZfX2ZkKGJ0Zik7XG4rXHRcdGlubmVyX29wdHMuYnRmX2tleV90eXBlX2lkID0gMTtcbitcdFx0aW5uZXJfb3B0cy5idGZfdmFsdWVfdHlwZV9pZCA9IDE7XG4rXHR9XG4rXHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcImR1bXBfaW5uZXJcIiwgc2l6ZW9mKGtleSksXG4rXHRcdFx0XHQgIHNpemVvZih2YWx1ZSksIDIsIFx1MDAyNmlubmVyX29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFwiY3JlYXRlX2lubmVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGtleSA9IDA7XG4rXHRpZiAoIWVtcHR5X2lubmVyIFx1MDAyNlx1MDAyNlxuK1x0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShpbm5lcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZ2YWx1ZSwgQlBGX0FOWSksXG4rXHRcdCAgICAgICBcInBvcHVsYXRlX2lubmVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XG4rXHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsIFwiZHVtcF9vdXRlclwiLCBzaXplb2Yoa2V5KSwgc2l6ZW9mKF9fdTMyKSxcbitcdFx0XHRcdCAzLCBcdTAwMjZvcHRzKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcImNyZWF0ZV9vdXRlclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHQvKiBUaGUgdW51c2VkIHRoaXJkIGFycmF5IHNsb3QgYWxzbyBleGVyY2lzZXMgZmFpbGVkIGxvb2t1cHMuICovXG4rXHRmb3IgKGtleSA9IDA7IGtleSBcdTAwM2MgZW50cmllczsga2V5KyspXG4rXHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxuK1x0XHRcdCAgICAgICBcInBvcHVsYXRlX291dGVyXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0cm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7XG4rXHRpbm5lcl9pZCA9IG1hcF9pZChpbm5lcl9mZCk7XG4rXHRpZiAoIXJvb3RfaWQgfHwgIWlubmVyX2lkIHx8ICFkdW1wX21hcChyb290X2lkLCBcIi1qXCIsIG91dGVyKSB8fFxuK1x0ICAgICFkdW1wX21hcChpbm5lcl9pZCwgXCItalwiLCBpbm5lcikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0QVNTRVJUX0VRKG91dGVyWzBdLCAnWycsIFwiZGVmYXVsdF9hcnJheVwiKTtcbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgXCJcXFwiZWxlbWVudHNcXFwiOlwiKSwgMCwgXCJkZWZhdWx0X25vX3dyYXBwZXJcIik7XG4rXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFwiXFxcImlkXFxcIjpcIiksIDAsIFwiZGVmYXVsdF9ub19oZWFkZXJcIik7XG4rXHRzbnByaW50ZihyZWZlcmVuY2UsIHNpemVvZihyZWZlcmVuY2UpLCBcIlxcXCJpbm5lcl9tYXBfaWRcXFwiOiV1XCIsIGlubmVyX2lkKTtcbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgcmVmZXJlbmNlKSwgZW50cmllcywgXCJkZWZhdWx0X3JlZmVyZW5jZXNcIik7XG4rXHRpZiAoIWVudHJpZXMpXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRlciwgXCJbXVwiLCBcImVtcHR5X291dGVyX2RlZmF1bHRcIik7XG4rXHRpZiAoZW1wdHlfaW5uZXIpXG4rXHRcdEFTU0VSVF9TVFJFUShpbm5lciwgXCJbXVwiLCBcImVtcHR5X2lubmVyX2RlZmF1bHRcIik7XG4rXHRlbHNlIGlmICh0eXBlZClcbitcdFx0QVNTRVJUX0hBU19TVUJTVFIoaW5uZXIsIFwiXFxcImZvcm1hdHRlZFxcXCI6e1xcXCJrZXlcXFwiOjAsXFxcInZhbHVlXFxcIjoxNjg0MzAwOX1cIixcbitcdFx0XHRcdCAgXCJ0eXBlZF9pbm5lclwiKTtcbitcdGVsc2VcbitcdFx0QVNTRVJUX1NUUkVRKGlubmVyLFxuK1x0XHRcdCAgICAgXCJbe1xcXCJrZXlcXFwiOltcXFwiMHgwMFxcXCIsXFxcIjB4MDBcXFwiLFxcXCIweDAwXFxcIixcXFwiMHgwMFxcXCJdLFwiXG4rXHRcdFx0ICAgICBcIlxcXCJ2YWx1ZVxcXCI6W1xcXCIweDAxXFxcIixcXFwiMHgwMVxcXCIsXFxcIjB4MDFcXFwiLFxcXCIweDAxXFxcIl19XVwiLFxuK1x0XHRcdCAgICAgXCJvcmRpbmFyeV9kZWZhdWx0XCIpO1xuK1xuK1x0LyogQ29tcGFyZSB0aGUgY29tcGxldGUgSlNPTiBkb2N1bWVudDogYSBmbGF0IGFycmF5IHdpdGggdGhlIHJvb3QgZmlyc3QsXG4rXHQgKiBvbmUgY29weSBvZiB0aGUgc2hhcmVkIGlubmVyIG1hcCwgYW5kIHVuY2hhbmdlZCBlbnRyeSByZXByZXNlbnRhdGlvbnMuXG4rXHQgKi9cbitcdGlmIChlbnRyaWVzKVxuK1x0XHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbitcdFx0XHQgXCJbe1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCIlc1xcXCIsXFxcIm5hbWVcXFwiOlxcXCJkdW1wX291dGVyXFxcIixcIlxuK1x0XHRcdCBcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfSx7XFxcImlkXFxcIjoldSxcXFwidHlwZVxcXCI6XFxcImhhc2hcXFwiLFwiXG4rXHRcdFx0IFwiXFxcIm5hbWVcXFwiOlxcXCJkdW1wX2lubmVyXFxcIixcXFwiZmxhZ3NcXFwiOjAsXFxcImVsZW1lbnRzXFxcIjolc31dXCIsXG4rXHRcdFx0IHJvb3RfaWQsIHR5cGVfbmFtZSwgb3V0ZXIsIGlubmVyX2lkLCBpbm5lcik7XG4rXHRlbHNlXG4rXHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuK1x0XHRcdCBcIlt7XFxcImlkXFxcIjoldSxcXFwidHlwZVxcXCI6XFxcIiVzXFxcIixcXFwibmFtZVxcXCI6XFxcImR1bXBfb3V0ZXJcXFwiLFwiXG4rXHRcdFx0IFwiXFxcImZsYWdzXFxcIjowLFxcXCJlbGVtZW50c1xcXCI6W119XVwiLCByb290X2lkLCB0eXBlX25hbWUpO1xuK1x0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFwiLWogLXJcIiwgb3V0cHV0KSlcbitcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwicmVjdXJzaXZlX2pzb25cIik7XG4rXHRpZiAoZHVtcF9tYXAocm9vdF9pZCwgXCItLWpzb24gLS1yZWN1cnNpdmVcIiwgb3V0cHV0KSlcbitcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwicmVjdXJzaXZlX2xvbmdfb3B0aW9uc1wiKTtcbitcdGNoZWNrX3BsYWluKHJvb3RfaWQsIGlubmVyX2lkLCB0eXBlX25hbWUsIGVudHJpZXMsIHR5cGVkKTtcbitcbitcdC8qIFJlY3Vyc2lvbiBvbiBhbiBvcmRpbmFyeSBtYXAgc3RpbGwgZW1pdHMgYSBzaW5nbGUgbWFwIG9iamVjdC4gKi9cbitcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuK1x0XHQgXCJbe1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCJoYXNoXFxcIixcXFwibmFtZVxcXCI6XFxcImR1bXBfaW5uZXJcXFwiLFwiXG4rXHRcdCBcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfV1cIiwgaW5uZXJfaWQsIGlubmVyKTtcbitcdGlmIChkdW1wX21hcChpbm5lcl9pZCwgXCItaiAtclwiLCBvdXRwdXQpKVxuK1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCJvcmRpbmFyeV9yZWN1cnNpdmVcIik7XG4rb3V0OlxuK1x0aWYgKG91dGVyX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2Uob3V0ZXJfZmQpO1xuK1x0aWYgKGlubmVyX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoaW5uZXJfZmQpO1xuK1x0YnRmX19mcmVlKGJ0Zik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfbXVsdGlwbGVfcm9vdHModm9pZClcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbitcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgbmFtZVtCUEZfT0JKX05BTUVfTEVOXTtcbitcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9LCBleHBlY3RlZFtPVVRQVVRfU0laRSAqIDRdLCBlbGVtZW50c1tPVVRQVVRfU0laRV07XG4rXHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHR5cGVzW10gPSB7IFwiaGFzaFwiLCBcImFycmF5X29mX21hcHNcIiwgXCJoYXNoX29mX21hcHNcIiwgXCJoYXNoXCIgfTtcbitcdGludCBmZHNbXSA9IHsgLTEsIC0xLCAtMSwgLTEgfTtcbitcdF9fdTMyIGlkc1s0XSwga2V5O1xuK1x0aW50IGksIGxlbiA9IDA7XG4rXG4rXHQvKiBTZWxlY3QgdGhlIGZpcnN0IGlubmVyIG1hcCBhbmQgYm90aCBvdXRlcnMgYXMgcm9vdHMuIFRoZSBvdGhlciBpbm5lclxuK1x0ICogbWFwIG11c3QgYmUgYXBwZW5kZWQgYWZ0ZXIgYWxsIHRocmVlIHJvb3RzLCBldmVuIHRob3VnaCBpdCBpcyBmb3VuZFxuK1x0ICogd2hpbGUgZHVtcGluZyB0aGUgZmlyc3Qgb3V0ZXIuIEEgcHJvY2Vzcy1zcGVjaWZpYyBuYW1lIGF2b2lkcyBvdGhlclxuK1x0ICogdGVzdHMnIG1hcHMgam9pbmluZyB0aGUgc2VsZWN0aW9uLlxuK1x0ICovXG4rXHRzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksIFwiZHVtcF8ldVwiLCBnZXRwaWQoKSk7XG4rXHRmZHNbMF0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgbmFtZSwgNCwgNCwgMSwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMF0sIFwiY3JlYXRlX3NlbGVjdGVkX2lubmVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGZkc1szXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcImR1bXBfZGlzY292ZXJlZFwiLCA0LCA0LCAxLCBOVUxMKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGZkc1szXSwgXCJjcmVhdGVfZGlzY292ZXJlZF9pbm5lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRvcHRzLmlubmVyX21hcF9mZCA9IGZkc1swXTtcbitcdGZkc1sxXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBuYW1lLCA0LCA0LCAyLCBcdTAwMjZvcHRzKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGZkc1sxXSwgXCJjcmVhdGVfYXJyYXlfcm9vdFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmZHNbMl0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCBuYW1lLCA0LCA0LCAyLCBcdTAwMjZvcHRzKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGZkc1syXSwgXCJjcmVhdGVfaGFzaF9yb290XCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGZvciAoaSA9IDE7IGkgXHUwMDNjPSAyOyBpKyspIHtcbitcdFx0a2V5ID0gMDtcbitcdFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZHNbaV0sIFx1MDAyNmtleSwgXHUwMDI2ZmRzWzBdLCBCUEZfQU5ZKSxcbitcdFx0XHQgICAgICAgXCJyZWZlcmVuY2Vfc2VsZWN0ZWRfaW5uZXJcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGtleSA9IDE7XG4rXHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCBcdTAwMjZrZXksIFx1MDAyNmZkc1szXSwgQlBGX0FOWSksXG4rXHRcdFx0ICAgICAgIFwicmVmZXJlbmNlX2Rpc2NvdmVyZWRfaW5uZXJcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGZkcyk7IGkrKykge1xuK1x0XHRpZHNbaV0gPSBtYXBfaWQoZmRzW2ldKTtcbitcdFx0aWYgKCFpZHNbaV0gfHwgIWR1bXBfbWFwKGlkc1tpXSwgXCItalwiLCBlbGVtZW50cykpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGxlbiArPSBzbnByaW50ZihleHBlY3RlZCArIGxlbiwgc2l6ZW9mKGV4cGVjdGVkKSAtIGxlbixcbitcdFx0XHRcdFwiJXN7XFxcImlkXFxcIjoldSxcXFwidHlwZVxcXCI6XFxcIiVzXFxcIixcXFwibmFtZVxcXCI6XFxcIiVzXFxcIixcIlxuK1x0XHRcdFx0XCJcXFwiZmxhZ3NcXFwiOjAsXFxcImVsZW1lbnRzXFxcIjolc30lc1wiLFxuK1x0XHRcdFx0aSA/IFwiLFwiIDogXCJbXCIsIGlkc1tpXSwgdHlwZXNbaV0sXG4rXHRcdFx0XHRpID09IDMgPyBcImR1bXBfZGlzY292ZXJlZFwiIDogbmFtZSwgZWxlbWVudHMsIGkgPT0gMyA/IFwiXVwiIDogXCJcIik7XG4rXHR9XG4rXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwiLWogLXIgbWFwIGR1bXAgbmFtZSAlc1wiLCBuYW1lKTtcbitcdGlmIChBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxuK1x0XHQgICAgICBcImR1bXBfbXVsdGlwbGVfcm9vdHNcIikpIHtcbitcdFx0b3V0cHV0W3N0cmNzcG4ob3V0cHV0LCBcIlxcblwiKV0gPSAnXFwwJztcbitcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwicm9vdHNfZmlyc3RfYW5kX3NlZWRfZGVkdXBcIik7XG4rXHR9XG4rb3V0OlxuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShmZHMpOyBpKyspXG4rXHRcdGlmIChmZHNbaV0gXHUwMDNlPSAwKVxuK1x0XHRcdGNsb3NlKGZkc1tpXSk7XG4rfVxuK1xuK3ZvaWQgdGVzdF9icGZ0b29sX21hcF9kdW1wKHZvaWQpXG4re1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtdWx0aXBsZV9yb290c1wiKSlcbitcdFx0dGVzdF9tdWx0aXBsZV9yb290cygpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJhcnJheV9vZl9tYXBzXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJoYXNoX29mX21hcHNcIikpXG4rXHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwic2hhcmVkX2lubmVyXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAyLCBmYWxzZSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJlbXB0eV9hcnJheV9vZl9tYXBzXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJlbXB0eV9oYXNoX29mX21hcHNcIikpXG4rXHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMCwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiYnRmX2lubmVyXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCB0cnVlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiZW1wdHlfaW5uZXJcIikpXG4rXHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgdHJ1ZSwgZmFsc2UpO1xuK31cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDAwOjUzOjMyLjQ4MDUyMDU1NloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjM1NDkwMjkxNTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBQYXRjaDogV29ydGhGdXp6aW5nPWZhbHNlPyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhlIGluc3RydWN0aW9ucyBhcmUgY2xlYXI6IHRoZSBjaGFuZ2VzIGFyZSAqYWxyZWFkeSogaW4gbXkgd29ya3NwYWNlIGFzIHRoZSBIRUFEIGNvbW1pdC4gTXkgdGFzayBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCB3YXJyYW50cyBmdXp6aW5nIG9yIGlmIGl0IGNhbiBiZSBzYWZlbHkgaWdub3JlZCAoaS5lLiwgYFdvcnRoRnV6emluZz1mYWxzZWApLiBTZWN0aW9uIDIgZGljdGF0ZXMgd2hlbiB3ZSBjYW4gYnlwYXNzIGZ1enppbmcuIFRoZSBrZXkgY3JpdGVyaWEgZm9yIGBXb3J0aEZ1enppbmc9ZmFsc2VgIGFyZSBub24ta2VybmVsLCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzIHRoYXQgZG9uJ3QgaW1wYWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UuIFRoaXMgaW5jbHVkZXMgZG9jdW1lbnRhdGlvbiwgY29tbWVudHMsIHVzZXItc3BhY2UgdG9vbHMsIGJ1aWxkIHN5c3RlbSBjaGFuZ2VzIHRoYXQgZG9uJ3QgYWx0ZXIgdGhlIEMgbG9naWMsIHVucmVhY2hhYmxlIGhhcmR3YXJlLCBhbmQgdW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzLlxuXG5Ob3csIGxldCdzIGxvb2sgYXQgdGhlIGRpZmYuIEkgc2VlIHRoZSBtb2RpZmllZCBmaWxlcyBhcmUgYWxsIGxvY2F0ZWQgaW4gYHRvb2xzL2AsIHNwZWNpZmljYWxseSB3aXRoaW4gYHRvb2xzL2JwZi9icGZ0b29sL2AgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYC4gTm90aGluZyBqdW1wcyBvdXQgYXMga2VybmVsLWxldmVsIGNvZGUuICBXZSBoYXZlIGRvY3VtZW50YXRpb24gKGBicGZ0b29sLW1hcC5yc3RgKSwgc2hlbGwgY29tcGxldGlvbiBzY3JpcHRzIChgYnBmdG9vbGAgd2l0aGluIGBiYXNoLWNvbXBsZXRpb25gKSwgdGhlIG1haW4gc291cmNlIGZpbGVzIChgbWFpbi5jYCwgYG1haW4uaGAsIGFuZCBgbWFwLmNgKSwgYW5kIGEgc2VsZnRlc3QgKGBicGZ0b29sX21hcF9kdW1wLmNgKS4gSXQncyBhbGwgQlBGIHRvb2xpbmcsIHdoaWNoIGNvbmZpcm1zIG15IGluaXRpYWwgaW1wcmVzc2lvbi4gTm9uZSBvZiB0aGVzZSBmaWxlcyBkaXJlY3RseSBtb2RpZnkga2VybmVsIGNvZGUgb3IgdGhlIGtlcm5lbCBpbWFnZSBpdHNlbGYgKGB2bWxpbnV4YCkgb3Iga2VybmVsIG1vZHVsZXMuXG5cbkp1c3QgdG8gYmUgYWJzb2x1dGVseSBzdXJlLCBJJ2xsIHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoYXQgdGhpcyBIRUFEIGNvbW1pdCAqb25seSogY29udGFpbnMgdGhlc2UgZmlsZXM7IG5vIHNuZWFreSBrZXJuZWwgY29kZSBjcmVlcGVkIGluLiBCYXJyaW5nIHRoYXQsIEknbSBjb25maWRlbnQgaW4gY2xhc3NpZnlpbmcgdGhpcyBhcyBgV29ydGhGdXp6aW5nPWZhbHNlYC4gVGhpcyBwYXRjaCBpcyBzYWZlIHRvIGlnbm9yZSBpbiB0ZXJtcyBvZiBmdXp6aW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDg2OSwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM3MiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDAwOjUzOjM2LjAyOTU1MzAyN1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDEyNjc3NjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiLipcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwidG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiXFxuRnVsbCBvdXRwdXQgaXMgdG9vIGxvbmcsIHNob3dpbmcgNTAwIG91dCBvZiAxNjIwIGxpbmVzLlxcblVzZSBtb3JlIHByZWNpc2UgZXhwcmVzc2lvbiBpZiBwb3NzaWJsZS5cXG5cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxOi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiAoR1BMLTIuMC1vbmx5IE9SIEJTRC0yLUNsYXVzZSlcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyOi8qIENvcHlyaWdodCAoQykgMjAxNy0yMDE4IE5ldHJvbm9tZSBTeXN0ZW1zLCBJbmMuICovXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OiNpbmNsdWRlIFxcdTAwM2NlcnJuby5oXFx1MDAzZVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjU6I2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NjojaW5jbHVkZSBcXHUwMDNjbGludXgvZXJyLmhcXHUwMDNlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NzojaW5jbHVkZSBcXHUwMDNjbGludXgva2VybmVsLmhcXHUwMDNlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6ODojaW5jbHVkZSBcXHUwMDNjbmV0L2lmLmhcXHUwMDNlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6OTojaW5jbHVkZSBcXHUwMDNjc3RkYm9vbC5oXFx1MDAzZVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwOiNpbmNsdWRlIFxcdTAwM2NzdGRpby5oXFx1MDAzZVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjExOiNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMjojaW5jbHVkZSBcXHUwMDNjc3RyaW5nLmhcXHUwMDNlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTM6I2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE0OiNpbmNsdWRlIFxcdTAwM2NzeXMvdHlwZXMuaFxcdTAwM2VcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNTojaW5jbHVkZSBcXHUwMDNjc3lzL3N0YXQuaFxcdTAwM2VcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNjpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzojaW5jbHVkZSBcXHUwMDNjYnBmL2JwZi5oXFx1MDAzZVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE4OiNpbmNsdWRlIFxcdTAwM2NicGYvYnRmLmhcXHUwMDNlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTk6I2luY2x1ZGUgXFx1MDAzY2JwZi9oYXNobWFwLmhcXHUwMDNlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjA6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjE6I2luY2x1ZGUgXFxcImpzb25fd3JpdGVyLmhcXFwiXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjI6I2luY2x1ZGUgXFxcIm1haW4uaFxcXCJcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNDpzdGF0aWMgc3RydWN0IGhhc2htYXAgKm1hcF90YWJsZTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNjpzdGF0aWMgYm9vbCBtYXBfaXNfcGVyX2NwdShfX3UzMiB0eXBlKVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI3OntcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyODpcXHRyZXR1cm4gdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0hBU0ggfHxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyOTpcXHQgICAgICAgdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0FSUkFZIHx8XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzA6XFx0ICAgICAgIHR5cGUgPT0gQlBGX01BUF9UWVBFX0xSVV9QRVJDUFVfSEFTSCB8fFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMxOlxcdCAgICAgICB0eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfQ0dST1VQX1NUT1JBR0U7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzI6fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMzOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0OnN0YXRpYyBib29sIG1hcF9pc19tYXBfb2ZfbWFwcyhfX3UzMiB0eXBlKVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1OntcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNjpcXHRyZXR1cm4gdHlwZSA9PSBCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUyB8fFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM3OlxcdCAgICAgICB0eXBlID09IEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFM7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzg6fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM5OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQwOnN0YXRpYyBib29sIG1hcF9pc19tYXBfb2ZfcHJvZ3MoX191MzIgdHlwZSlcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MTp7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDI6XFx0cmV0dXJuIHR5cGUgPT0gQlBGX01BUF9UWVBFX1BST0dfQVJSQVk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDM6fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ0OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ1OnN0YXRpYyBpbnQgbWFwX3R5cGVfZnJvbV9zdHIoY29uc3QgY2hhciAqdHlwZSlcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Njp7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDc6XFx0Y29uc3QgY2hhciAqbWFwX3R5cGVfc3RyO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ4OlxcdHVuc2lnbmVkIGludCBpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjUwOlxcdGZvciAoaSA9IDA7IDsgaSsrKSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTE6XFx0XFx0bWFwX3R5cGVfc3RyID0gbGliYnBmX2JwZl9tYXBfdHlwZV9zdHIoaSk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTI6XFx0XFx0aWYgKCFtYXBfdHlwZV9zdHIpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTM6XFx0XFx0XFx0YnJlYWs7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTQ6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTU6XFx0XFx0LyogRG9uJ3QgYWxsb3cgcHJlZml4aW5nIGluIGNhc2Ugb2YgcG9zc2libGUgZnV0dXJlIHNoYWRvd2luZyAqL1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjU2OlxcdFxcdGlmICghc3RyY21wKG1hcF90eXBlX3N0ciwgdHlwZSkpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTc6XFx0XFx0XFx0cmV0dXJuIGk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NTg6XFx0fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjU5OlxcdHJldHVybiAtMTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2MDp9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NjE6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NjI6c3RhdGljIHZvaWQgKmFsbG9jX3ZhbHVlKHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8pXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NjM6e1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjY0OlxcdGlmIChtYXBfaXNfcGVyX2NwdShpbmZvLVxcdTAwM2V0eXBlKSlcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2NTpcXHRcXHRyZXR1cm4gbWFsbG9jKHJvdW5kX3VwKGluZm8tXFx1MDAzZXZhbHVlX3NpemUsIDgpICpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2NjpcXHRcXHRcXHQgICAgICBnZXRfcG9zc2libGVfY3B1cygpKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2NzpcXHRlbHNlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Njg6XFx0XFx0cmV0dXJuIG1hbGxvYyhpbmZvLVxcdTAwM2V2YWx1ZV9zaXplKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo2OTp9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NzA6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NzE6c3RhdGljIGludCBkb19kdW1wX2J0Zihjb25zdCBzdHJ1Y3QgYnRmX2R1bXBlciAqZCxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo3MjpcXHRcXHQgICAgICAgc3RydWN0IGJwZl9tYXBfaW5mbyAqbWFwX2luZm8sIHZvaWQgKmtleSxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo3MzpcXHRcXHQgICAgICAgdm9pZCAqdmFsdWUpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NzQ6e1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjc1OlxcdF9fdTMyIHZhbHVlX2lkO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjc2OlxcdGludCByZXQgPSAwO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjc3OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjc4OlxcdC8qIHN0YXJ0IG9mIGtleS12YWx1ZSBwYWlyICovXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Nzk6XFx0anNvbndfc3RhcnRfb2JqZWN0KGQtXFx1MDAzZWp3KTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4MDpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4MTpcXHRpZiAobWFwX2luZm8tXFx1MDAzZWJ0Zl9rZXlfdHlwZV9pZCkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjgyOlxcdFxcdGpzb253X25hbWUoZC1cXHUwMDNlancsIFxcXCJrZXlcXFwiKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4MzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4NDpcXHRcXHRyZXQgPSBidGZfZHVtcGVyX3R5cGUoZCwgbWFwX2luZm8tXFx1MDAzZWJ0Zl9rZXlfdHlwZV9pZCwga2V5KTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo4NTpcXHRcXHRpZiAocmV0KVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjg2OlxcdFxcdFxcdGdvdG8gZXJyX2VuZF9vYmo7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6ODc6XFx0fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjg4OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjg5OlxcdHZhbHVlX2lkID0gbWFwX2luZm8tXFx1MDAzZWJ0Zl92bWxpbnV4X3ZhbHVlX3R5cGVfaWQgP1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjkwOlxcdFxcdDogbWFwX2luZm8tXFx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjkxOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjkyOlxcdGlmICghbWFwX2lzX3Blcl9jcHUobWFwX2luZm8tXFx1MDAzZXR5cGUpKSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6OTM6XFx0XFx0anNvbndfbmFtZShkLVxcdTAwM2VqdywgXFxcInZhbHVlXFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6OTQ6XFx0XFx0cmV0ID0gYnRmX2R1bXBlcl90eXBlKGQsIHZhbHVlX2lkLCB2YWx1ZSk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6OTU6XFx0fSBlbHNlIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo5NjpcXHRcXHR1bnNpZ25lZCBpbnQgaSwgbiwgc3RlcDtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo5NzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo5ODpcXHRcXHRqc29ud19uYW1lKGQtXFx1MDAzZWp3LCBcXFwidmFsdWVzXFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6OTk6XFx0XFx0anNvbndfc3RhcnRfYXJyYXkoZC1cXHUwMDNlancpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwMDpcXHRcXHRuID0gZ2V0X3Bvc3NpYmxlX2NwdXMoKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMDE6XFx0XFx0c3RlcCA9IHJvdW5kX3VwKG1hcF9pbmZvLVxcdTAwM2V2YWx1ZV9zaXplLCA4KTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMDI6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG47IGkrKykge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwMzpcXHRcXHRcXHRqc29ud19zdGFydF9vYmplY3QoZC1cXHUwMDNlancpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwNDpcXHRcXHRcXHRqc29ud19pbnRfZmllbGQoZC1cXHUwMDNlancsIFxcXCJjcHVcXFwiLCBpKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMDU6XFx0XFx0XFx0anNvbndfbmFtZShkLVxcdTAwM2VqdywgXFxcInZhbHVlXFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTA2OlxcdFxcdFxcdHJldCA9IGJ0Zl9kdW1wZXJfdHlwZShkLCB2YWx1ZV9pZCwgdmFsdWUgKyBpICogc3RlcCk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTA3OlxcdFxcdFxcdGpzb253X2VuZF9vYmplY3QoZC1cXHUwMDNlancpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwODpcXHRcXHRcXHRpZiAocmV0KVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEwOTpcXHRcXHRcXHRcXHRicmVhaztcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMTA6XFx0XFx0fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjExMTpcXHRcXHRqc29ud19lbmRfYXJyYXkoZC1cXHUwMDNlancpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjExMjpcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTEzOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjExNDplcnJfZW5kX29iajpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMTU6XFx0LyogZW5kIG9mIGtleS12YWx1ZSBwYWlyICovXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTE2OlxcdGpzb253X2VuZF9vYmplY3QoZC1cXHUwMDNlancpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjExNzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMTg6XFx0cmV0dXJuIHJldDtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMTk6fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEyMDpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMjE6c3RhdGljIGpzb25fd3JpdGVyX3QgKmdldF9idGZfd3JpdGVyKHZvaWQpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTIyOntcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMjM6XFx0anNvbl93cml0ZXJfdCAqancgPSBqc29ud19uZXcoc3Rkb3V0KTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMjQ6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTI1OlxcdGlmICghancpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTI2OlxcdFxcdHJldHVybiBOVUxMO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEyNzpcXHRqc29ud19wcmV0dHkoancsIHRydWUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEyODpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMjk6XFx0cmV0dXJuIGp3O1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEzMDp9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTMxOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEzMjpzdGF0aWMgdm9pZCBwcmludF9lbnRyeV9qc29uKHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHVuc2lnbmVkIGNoYXIgKmtleSxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMzM6XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBjaGFyICp2YWx1ZSwgc3RydWN0IGJ0ZiAqYnRmKVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEzNDp7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTM1OlxcdGpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTM2OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjEzNzpcXHRpZiAoIW1hcF9pc19wZXJfY3B1KGluZm8tXFx1MDAzZXR5cGUpKSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTM4OlxcdFxcdGpzb253X25hbWUoanNvbl93dHIsIFxcXCJrZXlcXFwiKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxMzk6XFx0XFx0cHJpbnRfaGV4X2RhdGFfanNvbihrZXksIGluZm8tXFx1MDAzZWtleV9zaXplKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNDA6XFx0XFx0anNvbndfbmFtZShqc29uX3d0ciwgXFxcInZhbHVlXFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTQxOlxcdFxcdHByaW50X2hleF9kYXRhX2pzb24odmFsdWUsIGluZm8tXFx1MDAzZXZhbHVlX3NpemUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE0MjpcXHRcXHRpZiAobWFwX2lzX21hcF9vZl9tYXBzKGluZm8tXFx1MDAzZXR5cGUpKVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE0MzpcXHRcXHRcXHRqc29ud191aW50X2ZpZWxkKGpzb25fd3RyLCBcXFwiaW5uZXJfbWFwX2lkXFxcIixcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNDQ6XFx0XFx0XFx0XFx0XFx0ICoodW5zaWduZWQgaW50ICopdmFsdWUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE0NTpcXHRcXHRpZiAoYnRmKSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTQ2OlxcdFxcdFxcdHN0cnVjdCBidGZfZHVtcGVyIGQgPSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTQ3OlxcdFxcdFxcdFxcdC5idGYgPSBidGYsXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTQ4OlxcdFxcdFxcdFxcdC5qdyA9IGpzb25fd3RyLFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE0OTpcXHRcXHRcXHRcXHQuaXNfcGxhaW5fdGV4dCA9IGZhbHNlLFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE1MDpcXHRcXHRcXHR9O1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE1MTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNTI6XFx0XFx0XFx0anNvbndfbmFtZShqc29uX3d0ciwgXFxcImZvcm1hdHRlZFxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE1MzpcXHRcXHRcXHRkb19kdW1wX2J0ZihcXHUwMDI2ZCwgaW5mbywga2V5LCB2YWx1ZSk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTU0OlxcdFxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNTU6XFx0fSBlbHNlIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNTY6XFx0XFx0dW5zaWduZWQgaW50IGksIG4sIHN0ZXA7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTU3OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE1ODpcXHRcXHRuID0gZ2V0X3Bvc3NpYmxlX2NwdXMoKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNTk6XFx0XFx0c3RlcCA9IHJvdW5kX3VwKGluZm8tXFx1MDAzZXZhbHVlX3NpemUsIDgpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2MDpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNjE6XFx0XFx0anNvbndfbmFtZShqc29uX3d0ciwgXFxcImtleVxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2MjpcXHRcXHRwcmludF9oZXhfZGF0YV9qc29uKGtleSwgaW5mby1cXHUwMDNla2V5X3NpemUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2MzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNjQ6XFx0XFx0anNvbndfbmFtZShqc29uX3d0ciwgXFxcInZhbHVlc1xcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE2NTpcXHRcXHRqc29ud19zdGFydF9hcnJheShqc29uX3d0cik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTY2OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuOyBpKyspIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNjc6XFx0XFx0XFx0anNvbndfc3RhcnRfb2JqZWN0KGpzb25fd3RyKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNjg6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTY5OlxcdFxcdFxcdGpzb253X2ludF9maWVsZChqc29uX3d0ciwgXFxcImNwdVxcXCIsIGkpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE3MDpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzE6XFx0XFx0XFx0anNvbndfbmFtZShqc29uX3d0ciwgXFxcInZhbHVlXFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTcyOlxcdFxcdFxcdHByaW50X2hleF9kYXRhX2pzb24odmFsdWUgKyBpICogc3RlcCxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzM6XFx0XFx0XFx0XFx0XFx0ICAgIGluZm8tXFx1MDAzZXZhbHVlX3NpemUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE3NDpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzU6XFx0XFx0XFx0anNvbndfZW5kX29iamVjdChqc29uX3d0cik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTc2OlxcdFxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzc6XFx0XFx0anNvbndfZW5kX2FycmF5KGpzb25fd3RyKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxNzg6XFx0XFx0aWYgKGJ0Zikge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE3OTpcXHRcXHRcXHRzdHJ1Y3QgYnRmX2R1bXBlciBkID0ge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE4MDpcXHRcXHRcXHRcXHQuYnRmID0gYnRmLFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE4MTpcXHRcXHRcXHRcXHQuancgPSBqc29uX3d0cixcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxODI6XFx0XFx0XFx0XFx0LmlzX3BsYWluX3RleHQgPSBmYWxzZSxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxODM6XFx0XFx0XFx0fTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxODQ6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTg1OlxcdFxcdFxcdGpzb253X25hbWUoanNvbl93dHIsIFxcXCJmb3JtYXR0ZWRcXFwiKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxODY6XFx0XFx0XFx0ZG9fZHVtcF9idGYoXFx1MDAyNmQsIGluZm8sIGtleSwgdmFsdWUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE4NzpcXHRcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTg4OlxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxODk6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTkwOlxcdGpzb253X2VuZF9vYmplY3QoanNvbl93dHIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5MTp9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTkyOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5MzpzdGF0aWMgdm9pZFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5NDpwcmludF9lbnRyeV9lcnJvcl9tc2coc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywgdW5zaWduZWQgY2hhciAqa2V5LFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5NTpcXHRcXHQgICAgICBjb25zdCBjaGFyICplcnJvcl9tc2cpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTk2OntcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoxOTc6XFx0aW50IG1zZ19zaXplID0gc3RybGVuKGVycm9yX21zZyk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MTk4OlxcdGJvb2wgc2luZ2xlX2xpbmUsIGJyZWFrX25hbWVzO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjE5OTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMDA6XFx0YnJlYWtfbmFtZXMgPSBpbmZvLVxcdTAwM2VrZXlfc2l6ZSBcXHUwMDNlIDE2IHx8IG1zZ19zaXplIFxcdTAwM2UgMTY7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjAxOlxcdHNpbmdsZV9saW5lID0gaW5mby1cXHUwMDNla2V5X3NpemUgKyBtc2dfc2l6ZSBcXHUwMDNjPSAyNCBcXHUwMDI2XFx1MDAyNiAhYnJlYWtfbmFtZXM7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjAyOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIwMzpcXHRwcmludGYoXFxcImtleTolY1xcXCIsIGJyZWFrX25hbWVzID8gJ1xcXFxuJyA6ICcgJyk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjA0OlxcdGZwcmludF9oZXgoc3Rkb3V0LCBrZXksIGluZm8tXFx1MDAzZWtleV9zaXplLCBcXFwiIFxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIwNTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMDY6XFx0cHJpbnRmKHNpbmdsZV9saW5lID8gXFxcIiAgXFxcIiA6IFxcXCJcXFxcblxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIwNzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMDg6XFx0cHJpbnRmKFxcXCJ2YWx1ZTolYyVzXFxcIiwgYnJlYWtfbmFtZXMgPyAnXFxcXG4nIDogJyAnLCBlcnJvcl9tc2cpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIwOTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMTA6XFx0cHJpbnRmKFxcXCJcXFxcblxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIxMTp9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjEyOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIxMzpzdGF0aWMgdm9pZFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIxNDpwcmludF9lbnRyeV9lcnJvcihzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgdm9pZCAqa2V5LCBpbnQgbG9va3VwX2Vycm5vKVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIxNTp7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjE2OlxcdC8qIEZvciBwcm9nX2FycmF5IG1hcHMgb3IgYXJyYXlzIG9mIG1hcHMsIGZhaWx1cmUgdG8gbG9va3VwIHRoZSB2YWx1ZVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIxNzpcXHQgKiBtZWFucyB0aGVyZSBpcyBubyBlbnRyeSBmb3IgdGhhdCBrZXkuIERvIG5vdCBwcmludCBhbiBlcnJvciBtZXNzYWdlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjE4OlxcdCAqIGluIHRoYXQgY2FzZS5cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMTk6XFx0ICovXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjIwOlxcdGlmICgobWFwX2lzX21hcF9vZl9tYXBzKG1hcF9pbmZvLVxcdTAwM2V0eXBlKSB8fFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIyMTpcXHQgICAgIG1hcF9pc19tYXBfb2ZfcHJvZ3MobWFwX2luZm8tXFx1MDAzZXR5cGUpKSBcXHUwMDI2XFx1MDAyNiBsb29rdXBfZXJybm8gPT0gRU5PRU5UKVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIyMjpcXHRcXHRyZXR1cm47XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjIzOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIyNDpcXHRpZiAoanNvbl9vdXRwdXQpIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMjU6XFx0XFx0anNvbndfc3RhcnRfb2JqZWN0KGpzb25fd3RyKTtcXHQvKiBlbnRyeSAqL1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIyNjpcXHRcXHRqc29ud19uYW1lKGpzb25fd3RyLCBcXFwia2V5XFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjI3OlxcdFxcdHByaW50X2hleF9kYXRhX2pzb24oa2V5LCBtYXBfaW5mby1cXHUwMDNla2V5X3NpemUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIyODpcXHRcXHRqc29ud19uYW1lKGpzb25fd3RyLCBcXFwidmFsdWVcXFwiKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMjk6XFx0XFx0anNvbndfc3RhcnRfb2JqZWN0KGpzb25fd3RyKTtcXHQvKiBlcnJvciAqL1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzMDpcXHRcXHRqc29ud19zdHJpbmdfZmllbGQoanNvbl93dHIsIFxcXCJlcnJvclxcXCIsIHN0cmVycm9yKGxvb2t1cF9lcnJubykpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzMTpcXHRcXHRqc29ud19lbmRfb2JqZWN0KGpzb25fd3RyKTtcXHQvKiBlcnJvciAqL1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzMjpcXHRcXHRqc29ud19lbmRfb2JqZWN0KGpzb25fd3RyKTtcXHQvKiBlbnRyeSAqL1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzMzpcXHR9IGVsc2Uge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzNDpcXHRcXHRjb25zdCBjaGFyICptc2cgPSBOVUxMO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzNTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMzY6XFx0XFx0aWYgKGxvb2t1cF9lcnJubyA9PSBFTk9FTlQpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjM3OlxcdFxcdFxcdG1zZyA9IFxcXCJcXHUwMDNjbm8gZW50cnlcXHUwMDNlXFxcIjtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyMzg6XFx0XFx0ZWxzZSBpZiAobG9va3VwX2Vycm5vID09IEVOT1NQQyBcXHUwMDI2XFx1MDAyNlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjIzOTpcXHRcXHRcXHQgbWFwX2luZm8tXFx1MDAzZXR5cGUgPT0gQlBGX01BUF9UWVBFX1JFVVNFUE9SVF9TT0NLQVJSQVkpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjQwOlxcdFxcdFxcdG1zZyA9IFxcXCJcXHUwMDNjY2Fubm90IHJlYWRcXHUwMDNlXFxcIjtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNDE6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjQyOlxcdFxcdHByaW50X2VudHJ5X2Vycm9yX21zZyhtYXBfaW5mbywga2V5LFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI0MzpcXHRcXHRcXHRcXHQgICAgICBtc2cgPyA6IHN0cmVycm9yKGxvb2t1cF9lcnJubykpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI0NDpcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjQ1On1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNDY6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjQ3OnN0YXRpYyB2b2lkIHByaW50X2VudHJ5X3BsYWluKHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHVuc2lnbmVkIGNoYXIgKmtleSxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNDg6XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgY2hhciAqdmFsdWUpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjQ5OntcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNTA6XFx0aWYgKCFtYXBfaXNfcGVyX2NwdShpbmZvLVxcdTAwM2V0eXBlKSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI1MTpcXHRcXHRib29sIHNpbmdsZV9saW5lLCBicmVha19uYW1lcztcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNTI6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjUzOlxcdFxcdGJyZWFrX25hbWVzID0gaW5mby1cXHUwMDNla2V5X3NpemUgXFx1MDAzZSAxNiB8fCBpbmZvLVxcdTAwM2V2YWx1ZV9zaXplIFxcdTAwM2UgMTY7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjU0OlxcdFxcdHNpbmdsZV9saW5lID0gaW5mby1cXHUwMDNla2V5X3NpemUgKyBpbmZvLVxcdTAwM2V2YWx1ZV9zaXplIFxcdTAwM2M9IDI0IFxcdTAwMjZcXHUwMDI2XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjU1OlxcdFxcdFxcdCFicmVha19uYW1lcztcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNTY6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjU3OlxcdFxcdGlmIChpbmZvLVxcdTAwM2VrZXlfc2l6ZSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI1ODpcXHRcXHRcXHRwcmludGYoXFxcImtleTolY1xcXCIsIGJyZWFrX25hbWVzID8gJ1xcXFxuJyA6ICcgJyk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjU5OlxcdFxcdFxcdGZwcmludF9oZXgoc3Rkb3V0LCBrZXksIGluZm8tXFx1MDAzZWtleV9zaXplLCBcXFwiIFxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI2MDpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNjE6XFx0XFx0XFx0cHJpbnRmKHNpbmdsZV9saW5lID8gXFxcIiAgXFxcIiA6IFxcXCJcXFxcblxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI2MjpcXHRcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjYzOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI2NDpcXHRcXHRpZiAoaW5mby1cXHUwMDNldmFsdWVfc2l6ZSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI2NTpcXHRcXHRcXHRpZiAobWFwX2lzX21hcF9vZl9tYXBzKGluZm8tXFx1MDAzZXR5cGUpKSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjY2OlxcdFxcdFxcdFxcdHByaW50ZihcXFwiaW5uZXJfbWFwX2lkOiVjXFxcIiwgYnJlYWtfbmFtZXMgPyAnXFxcXG4nIDogJyAnKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNjc6XFx0XFx0XFx0XFx0cHJpbnRmKFxcXCIldSBcXFwiLCAqKHVuc2lnbmVkIGludCAqKXZhbHVlKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNjg6XFx0XFx0XFx0fSBlbHNlIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNjk6XFx0XFx0XFx0XFx0cHJpbnRmKFxcXCJ2YWx1ZTolY1xcXCIsIGJyZWFrX25hbWVzID8gJ1xcXFxuJyA6ICcgJyk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjcwOlxcdFxcdFxcdFxcdGZwcmludF9oZXgoc3Rkb3V0LCB2YWx1ZSwgaW5mby1cXHUwMDNldmFsdWVfc2l6ZSwgXFxcIiBcXFwiKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNzE6XFx0XFx0XFx0fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI3MjpcXHRcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjczOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI3NDpcXHRcXHRwcmludGYoXFxcIlxcXFxuXFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjc1OlxcdH0gZWxzZSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjc2OlxcdFxcdHVuc2lnbmVkIGludCBpLCBuLCBzdGVwO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI3NzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyNzg6XFx0XFx0biA9IGdldF9wb3NzaWJsZV9jcHVzKCk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjc5OlxcdFxcdHN0ZXAgPSByb3VuZF91cChpbmZvLVxcdTAwM2V2YWx1ZV9zaXplLCA4KTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyODA6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MjgxOlxcdFxcdGlmIChpbmZvLVxcdTAwM2VrZXlfc2l6ZSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI4MjpcXHRcXHRcXHRwcmludGYoXFxcImtleTpcXFxcblxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI4MzpcXHRcXHRcXHRmcHJpbnRfaGV4KHN0ZG91dCwga2V5LCBpbmZvLVxcdTAwM2VrZXlfc2l6ZSwgXFxcIiBcXFwiKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyODQ6XFx0XFx0XFx0cHJpbnRmKFxcXCJcXFxcblxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI4NTpcXHRcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjg2OlxcdFxcdGlmIChpbmZvLVxcdTAwM2V2YWx1ZV9zaXplKSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjg3OlxcdFxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuOyBpKyspIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyODg6XFx0XFx0XFx0XFx0cHJpbnRmKFxcXCJ2YWx1ZSAoQ1BVICUwMnUpOiVjXFxcIixcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyODk6XFx0XFx0XFx0XFx0ICAgICAgIGksIGluZm8tXFx1MDAzZXZhbHVlX3NpemUgXFx1MDAzZSAxNiA/ICdcXFxcbicgOiAnICcpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5MDpcXHRcXHRcXHRcXHRmcHJpbnRfaGV4KHN0ZG91dCwgdmFsdWUgKyBpICogc3RlcCxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyOTE6XFx0XFx0XFx0XFx0XFx0ICAgaW5mby1cXHUwMDNldmFsdWVfc2l6ZSwgXFxcIiBcXFwiKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyOTI6XFx0XFx0XFx0XFx0cHJpbnRmKFxcXCJcXFxcblxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5MzpcXHRcXHRcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjk0OlxcdFxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzoyOTU6XFx0fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5Njp9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjk3OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjI5ODpzdGF0aWMgY2hhciAqKnBhcnNlX2J5dGVzKGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBjaGFyICp2YWwsXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mjk5OlxcdFxcdFxcdCAgdW5zaWduZWQgaW50IG4pXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzAwOntcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMDE6XFx0dW5zaWduZWQgaW50IGkgPSAwLCBiYXNlID0gMDtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMDI6XFx0Y2hhciAqZW5kcHRyO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMwMzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMDQ6XFx0aWYgKGlzX3ByZWZpeCgqYXJndiwgXFxcImhleFxcXCIpKSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzA1OlxcdFxcdGJhc2UgPSAxNjtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMDY6XFx0XFx0YXJndisrO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMwNzpcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzA4OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMwOTpcXHR3aGlsZSAoaSBcXHUwMDNjIG4gXFx1MDAyNlxcdTAwMjYgYXJndltpXSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMxMDpcXHRcXHR2YWxbaV0gPSBzdHJ0b3VsKGFyZ3ZbaV0sIFxcdTAwMjZlbmRwdHIsIGJhc2UpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMxMTpcXHRcXHRpZiAoKmVuZHB0cikge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMxMjpcXHRcXHRcXHRwX2VycihcXFwiZXJyb3IgcGFyc2luZyBieXRlOiAlc1xcXCIsIGFyZ3ZbaV0pO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMxMzpcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMTQ6XFx0XFx0fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMxNTpcXHRcXHRpKys7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzE2OlxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMTc6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzE4OlxcdGlmIChpICE9IG4pIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMTk6XFx0XFx0cF9lcnIoXFxcIiVzIGV4cGVjdGVkICV1IGJ5dGVzIGdvdCAldVxcXCIsIG5hbWUsIG4sIGkpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMyMDpcXHRcXHRyZXR1cm4gTlVMTDtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMjE6XFx0fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMyMjpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMjM6XFx0cmV0dXJuIGFyZ3YgKyBpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMyNDp9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzI1OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMyNjovKiBvbiBwZXIgY3B1IG1hcHMgd2UgbXVzdCBjb3B5IHRoZSBwcm92aWRlZCB2YWx1ZSBvbiBhbGwgdmFsdWUgaW5zdGFuY2VzICovXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzI3OnN0YXRpYyB2b2lkIGZpbGxfcGVyX2NwdV92YWx1ZShzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCB2b2lkICp2YWx1ZSlcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMjg6e1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMyOTpcXHR1bnNpZ25lZCBpbnQgaSwgbiwgc3RlcDtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMzA6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzMxOlxcdGlmICghbWFwX2lzX3Blcl9jcHUoaW5mby1cXHUwMDNldHlwZSkpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzMyOlxcdFxcdHJldHVybjtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMzM6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzM0OlxcdG4gPSBnZXRfcG9zc2libGVfY3B1cygpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjMzNTpcXHRzdGVwID0gcm91bmRfdXAoaW5mby1cXHUwMDNldmFsdWVfc2l6ZSwgOCk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzM2OlxcdGZvciAoaSA9IDE7IGkgXFx1MDAzYyBuOyBpKyspXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzM3OlxcdFxcdG1lbWNweSh2YWx1ZSArIGkgKiBzdGVwLCB2YWx1ZSwgaW5mby1cXHUwMDNldmFsdWVfc2l6ZSk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzM4On1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozMzk6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzQwOnN0YXRpYyBpbnQgcGFyc2VfZWxlbShjaGFyICoqYXJndiwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywgdm9pZCAqa2V5LFxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0MTpcXHRcXHQgICAgICB2b2lkICp2YWx1ZSwgX191MzIga2V5X3NpemUsIF9fdTMyIHZhbHVlX3NpemUsXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzQyOlxcdFxcdCAgICAgIF9fdTMyICpmbGFncywgX191MzIgKip2YWx1ZV9mZCwgX191MzIgb3Blbl9mbGFncylcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNDM6e1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0NDpcXHRpZiAoISphcmd2KSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzQ1OlxcdFxcdGlmICgha2V5IFxcdTAwMjZcXHUwMDI2ICF2YWx1ZSlcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNDY6XFx0XFx0XFx0cmV0dXJuIDA7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzQ3OlxcdFxcdHBfZXJyKFxcXCJkaWQgbm90IGZpbmQgJXNcXFwiLCBrZXkgPyBcXFwia2V5XFxcIiA6IFxcXCJ2YWx1ZVxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM0ODpcXHRcXHRyZXR1cm4gLTE7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzQ5OlxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNTA6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzUxOlxcdGlmIChpc19wcmVmaXgoKmFyZ3YsIFxcXCJrZXlcXFwiKSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1MjpcXHRcXHRpZiAoIWtleSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1MzpcXHRcXHRcXHRpZiAoa2V5X3NpemUpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzU0OlxcdFxcdFxcdFxcdHBfZXJyKFxcXCJkdXBsaWNhdGUga2V5XFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzU1OlxcdFxcdFxcdGVsc2VcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNTY6XFx0XFx0XFx0XFx0cF9lcnIoXFxcInVubmVjZXNzYXJ5IGtleVxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM1NzpcXHRcXHRcXHRyZXR1cm4gLTE7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzU4OlxcdFxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNTk6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzYwOlxcdFxcdGFyZ3YgPSBwYXJzZV9ieXRlcyhhcmd2ICsgMSwgXFxcImtleVxcXCIsIGtleSwga2V5X3NpemUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM2MTpcXHRcXHRpZiAoIWFyZ3YpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzYyOlxcdFxcdFxcdHJldHVybiAtMTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNjM6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzY0OlxcdFxcdHJldHVybiBwYXJzZV9lbGVtKGFyZ3YsIGluZm8sIE5VTEwsIHZhbHVlLCBrZXlfc2l6ZSwgdmFsdWVfc2l6ZSxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNjU6XFx0XFx0XFx0XFx0ICBmbGFncywgdmFsdWVfZmQsIG9wZW5fZmxhZ3MpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM2NjpcXHR9IGVsc2UgaWYgKGlzX3ByZWZpeCgqYXJndiwgXFxcInZhbHVlXFxcIikpIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNjc6XFx0XFx0aW50IGZkO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM2ODpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNjk6XFx0XFx0aWYgKCF2YWx1ZSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM3MDpcXHRcXHRcXHRpZiAodmFsdWVfc2l6ZSlcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNzE6XFx0XFx0XFx0XFx0cF9lcnIoXFxcImR1cGxpY2F0ZSB2YWx1ZVxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM3MjpcXHRcXHRcXHRlbHNlXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzczOlxcdFxcdFxcdFxcdHBfZXJyKFxcXCJ1bm5lY2Vzc2FyeSB2YWx1ZVxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM3NDpcXHRcXHRcXHRyZXR1cm4gLTE7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzc1OlxcdFxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNzY6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzc3OlxcdFxcdGFyZ3YrKztcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozNzg6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzc5OlxcdFxcdGlmIChtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cXHUwMDNldHlwZSkpIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozODA6XFx0XFx0XFx0aW50IGFyZ2MgPSAyO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM4MTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozODI6XFx0XFx0XFx0aWYgKHZhbHVlX3NpemUgIT0gNCkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM4MzpcXHRcXHRcXHRcXHRwX2VycihcXFwidmFsdWUgc21hbGxlciB0aGFuIDRCIGZvciBtYXAgaW4gbWFwP1xcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM4NDpcXHRcXHRcXHRcXHRyZXR1cm4gLTE7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzg1OlxcdFxcdFxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozODY6XFx0XFx0XFx0aWYgKCFhcmd2WzBdIHx8ICFhcmd2WzFdKSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzg3OlxcdFxcdFxcdFxcdHBfZXJyKFxcXCJub3QgZW5vdWdoIHZhbHVlIGFyZ3VtZW50cyBmb3IgbWFwIGluIG1hcFxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM4ODpcXHRcXHRcXHRcXHRyZXR1cm4gLTE7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzg5OlxcdFxcdFxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozOTA6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzkxOlxcdFxcdFxcdGZkID0gbWFwX3BhcnNlX2ZkKFxcdTAwMjZhcmdjLCBcXHUwMDI2YXJndiwgb3Blbl9mbGFncyk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzkyOlxcdFxcdFxcdGlmIChmZCBcXHUwMDNjIDApXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6MzkzOlxcdFxcdFxcdFxcdHJldHVybiAtMTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzozOTQ6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzk1OlxcdFxcdFxcdCp2YWx1ZV9mZCA9IHZhbHVlO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM5NjpcXHRcXHRcXHQqKnZhbHVlX2ZkID0gZmQ7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzk3OlxcdFxcdH0gZWxzZSBpZiAobWFwX2lzX21hcF9vZl9wcm9ncyhpbmZvLVxcdTAwM2V0eXBlKSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjM5ODpcXHRcXHRcXHRpbnQgYXJnYyA9IDI7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6Mzk5OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQwMDpcXHRcXHRcXHRpZiAodmFsdWVfc2l6ZSAhPSA0KSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDAxOlxcdFxcdFxcdFxcdHBfZXJyKFxcXCJ2YWx1ZSBzbWFsbGVyIHRoYW4gNEIgZm9yIG1hcCBvZiBwcm9ncz9cXFwiKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MDI6XFx0XFx0XFx0XFx0cmV0dXJuIC0xO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQwMzpcXHRcXHRcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDA0OlxcdFxcdFxcdGlmICghYXJndlswXSB8fCAhYXJndlsxXSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQwNTpcXHRcXHRcXHRcXHRwX2VycihcXFwibm90IGVub3VnaCB2YWx1ZSBhcmd1bWVudHMgZm9yIG1hcCBvZiBwcm9nc1xcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQwNjpcXHRcXHRcXHRcXHRyZXR1cm4gLTE7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDA3OlxcdFxcdFxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MDg6XFx0XFx0XFx0aWYgKGlzX3ByZWZpeCgqYXJndiwgXFxcImlkXFxcIikpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDA5OlxcdFxcdFxcdFxcdHBfaW5mbyhcXFwiV2FybmluZzogdXBkYXRpbmcgcHJvZ3JhbSBhcnJheSB2aWEgTUFQX0lELCBtYWtlIHN1cmUgdGhpcyBtYXAgaXMga2VwdCBvcGVuXFxcXG5cXFwiXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDEwOlxcdFxcdFxcdFxcdCAgICAgICBcXFwiICAgICAgICAgYnkgc29tZSBwcm9jZXNzIG9yIHBpbm5lZCBvdGhlcndpc2UgdXBkYXRlIHdpbGwgYmUgbG9zdFxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQxMTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MTI6XFx0XFx0XFx0ZmQgPSBwcm9nX3BhcnNlX2ZkKFxcdTAwMjZhcmdjLCBcXHUwMDI2YXJndik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDEzOlxcdFxcdFxcdGlmIChmZCBcXHUwMDNjIDApXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDE0OlxcdFxcdFxcdFxcdHJldHVybiAtMTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MTU6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDE2OlxcdFxcdFxcdCp2YWx1ZV9mZCA9IHZhbHVlO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQxNzpcXHRcXHRcXHQqKnZhbHVlX2ZkID0gZmQ7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDE4OlxcdFxcdH0gZWxzZSB7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDE5OlxcdFxcdFxcdGFyZ3YgPSBwYXJzZV9ieXRlcyhhcmd2LCBcXFwidmFsdWVcXFwiLCB2YWx1ZSwgdmFsdWVfc2l6ZSk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDIwOlxcdFxcdFxcdGlmICghYXJndilcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MjE6XFx0XFx0XFx0XFx0cmV0dXJuIC0xO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQyMjpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MjM6XFx0XFx0XFx0ZmlsbF9wZXJfY3B1X3ZhbHVlKGluZm8sIHZhbHVlKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MjQ6XFx0XFx0fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQyNTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MjY6XFx0XFx0cmV0dXJuIHBhcnNlX2VsZW0oYXJndiwgaW5mbywga2V5LCBOVUxMLCBrZXlfc2l6ZSwgdmFsdWVfc2l6ZSxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Mjc6XFx0XFx0XFx0XFx0ICBmbGFncywgTlVMTCwgb3Blbl9mbGFncyk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDI4OlxcdH0gZWxzZSBpZiAoaXNfcHJlZml4KCphcmd2LCBcXFwiYW55XFxcIikgfHwgaXNfcHJlZml4KCphcmd2LCBcXFwibm9leGlzdFxcXCIpIHx8XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDI5OlxcdFxcdCAgIGlzX3ByZWZpeCgqYXJndiwgXFxcImV4aXN0XFxcIikpIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MzA6XFx0XFx0aWYgKCFmbGFncykge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQzMTpcXHRcXHRcXHRwX2VycihcXFwiZmxhZ3Mgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzOiAlc1xcXCIsICphcmd2KTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0MzI6XFx0XFx0XFx0cmV0dXJuIC0xO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQzMzpcXHRcXHR9XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDM0OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQzNTpcXHRcXHRpZiAoaXNfcHJlZml4KCphcmd2LCBcXFwiYW55XFxcIikpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDM2OlxcdFxcdFxcdCpmbGFncyA9IEJQRl9BTlk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDM3OlxcdFxcdGVsc2UgaWYgKGlzX3ByZWZpeCgqYXJndiwgXFxcIm5vZXhpc3RcXFwiKSlcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Mzg6XFx0XFx0XFx0KmZsYWdzID0gQlBGX05PRVhJU1Q7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDM5OlxcdFxcdGVsc2UgaWYgKGlzX3ByZWZpeCgqYXJndiwgXFxcImV4aXN0XFxcIikpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQwOlxcdFxcdFxcdCpmbGFncyA9IEJQRl9FWElTVDtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NDE6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQyOlxcdFxcdHJldHVybiBwYXJzZV9lbGVtKGFyZ3YgKyAxLCBpbmZvLCBrZXksIHZhbHVlLCBrZXlfc2l6ZSxcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NDM6XFx0XFx0XFx0XFx0ICB2YWx1ZV9zaXplLCBOVUxMLCB2YWx1ZV9mZCwgb3Blbl9mbGFncyk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQ0OlxcdH1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NDU6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQ2OlxcdHBfZXJyKFxcXCJleHBlY3RlZCBrZXkgb3IgdmFsdWUsIGdvdDogJXNcXFwiLCAqYXJndik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDQ3OlxcdHJldHVybiAtMTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NDg6fVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ0OTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTA6c3RhdGljIHZvaWQgc2hvd19tYXBfaGVhZGVyX2pzb24oc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyKVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ1MTp7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDUyOlxcdGNvbnN0IGNoYXIgKm1hcF90eXBlX3N0cjtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTM6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDU0OlxcdGpzb253X3VpbnRfZmllbGQod3RyLCBcXFwiaWRcXFwiLCBpbmZvLVxcdTAwM2VpZCk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDU1OlxcdG1hcF90eXBlX3N0ciA9IGxpYmJwZl9icGZfbWFwX3R5cGVfc3RyKGluZm8tXFx1MDAzZXR5cGUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ1NjpcXHRpZiAobWFwX3R5cGVfc3RyKVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ1NzpcXHRcXHRqc29ud19zdHJpbmdfZmllbGQod3RyLCBcXFwidHlwZVxcXCIsIG1hcF90eXBlX3N0cik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDU4OlxcdGVsc2VcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NTk6XFx0XFx0anNvbndfdWludF9maWVsZCh3dHIsIFxcXCJ0eXBlXFxcIiwgaW5mby1cXHUwMDNldHlwZSk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDYwOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ2MTpcXHRpZiAoKmluZm8tXFx1MDAzZW5hbWUpXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDYyOlxcdFxcdGpzb253X3N0cmluZ19maWVsZCh3dHIsIFxcXCJuYW1lXFxcIiwgaW5mby1cXHUwMDNlbmFtZSk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDYzOlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ2NDpcXHRqc29ud19uYW1lKHd0ciwgXFxcImZsYWdzXFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDY1OlxcdGpzb253X3ByaW50Zih3dHIsIFxcXCIldVxcXCIsIGluZm8tXFx1MDAzZW1hcF9mbGFncyk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDY2On1cXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Njc6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDY4OnN0YXRpYyBpbnQgc2hvd19tYXBfY2xvc2VfanNvbihpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8pXFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDY5OntcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NzA6XFx0Y2hhciAqbWVtbG9jaywgKmZyb3plbl9zdHI7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDcxOlxcdGludCBmcm96ZW4gPSAwO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ3MjpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0NzM6XFx0bWVtbG9jayA9IGdldF9mZGluZm8oZmQsIFxcXCJtZW1sb2NrXFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDc0OlxcdGZyb3plbl9zdHIgPSBnZXRfZmRpbmZvKGZkLCBcXFwiZnJvemVuXFxcIik7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDc1OlxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ3NjpcXHRqc29ud19zdGFydF9vYmplY3QoanNvbl93dHIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ3NzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0Nzg6XFx0c2hvd19tYXBfaGVhZGVyX2pzb24oaW5mbywganNvbl93dHIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ3OTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0ODA6XFx0cHJpbnRfZGV2X2pzb24oaW5mby1cXHUwMDNlaWZpbmRleCwgaW5mby1cXHUwMDNlbmV0bnNfZGV2LCBpbmZvLVxcdTAwM2VuZXRuc19pbm8pO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ4MTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0ODI6XFx0anNvbndfdWludF9maWVsZChqc29uX3d0ciwgXFxcImJ5dGVzX2tleVxcXCIsIGluZm8tXFx1MDAzZWtleV9zaXplKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0ODM6XFx0anNvbndfdWludF9maWVsZChqc29uX3d0ciwgXFxcImJ5dGVzX3ZhbHVlXFxcIiwgaW5mby1cXHUwMDNldmFsdWVfc2l6ZSk7XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDg0OlxcdGpzb253X3VpbnRfZmllbGQoanNvbl93dHIsIFxcXCJtYXhfZW50cmllc1xcXCIsIGluZm8tXFx1MDAzZW1heF9lbnRyaWVzKTtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0ODU6XFxudG9vbHMvYnBmL2JwZnRvb2wvbWFwLmM6NDg2OlxcdGlmIChtZW1sb2NrKVxcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ4NzpcXHRcXHRqc29ud19pbnRfZmllbGQoanNvbl93dHIsIFxcXCJieXRlc19tZW1sb2NrXFxcIiwgYXRvbGwobWVtbG9jaykpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ4ODpcXHRmcmVlKG1lbWxvY2spO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ4OTpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OTA6XFx0aWYgKGluZm8tXFx1MDAzZXR5cGUgPT0gQlBGX01BUF9UWVBFX1BST0dfQVJSQVkpIHtcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OTE6XFx0XFx0Y2hhciAqb3duZXJfcHJvZ190eXBlID0gZ2V0X2ZkaW5mbyhmZCwgXFxcIm93bmVyX3Byb2dfdHlwZVxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5MjpcXHRcXHRjaGFyICpvd25lcl9qaXRlZCA9IGdldF9mZGluZm8oZmQsIFxcXCJvd25lcl9qaXRlZFxcXCIpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5MzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OTQ6XFx0XFx0aWYgKG93bmVyX3Byb2dfdHlwZSkge1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5NTpcXHRcXHRcXHR1bnNpZ25lZCBpbnQgcHJvZ190eXBlID0gYXRvaShvd25lcl9wcm9nX3R5cGUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5NjpcXHRcXHRcXHRjb25zdCBjaGFyICpwcm9nX3R5cGVfc3RyO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5NzpcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo0OTg6XFx0XFx0XFx0cHJvZ190eXBlX3N0ciA9IGxpYmJwZl9icGZfcHJvZ190eXBlX3N0cihwcm9nX3R5cGUpO1xcbnRvb2xzL2JwZi9icGZ0b29sL21hcC5jOjQ5OTpcXHRcXHRcXHRpZiAocHJvZ190eXBlX3N0cilcXG50b29scy9icGYvYnBmdG9vbC9tYXAuYzo1MDA6XFx0XFx0XFx0XFx0anNvbndfc3RyaW5nX2ZpZWxkKGpzb25fd3RyLCBcXFwib3duZXJfcHJvZ190eXBlXFxcIixcXG5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDA6NTM6MzYuMTMwODI2NjA1WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzY4MTk1NTAyOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiB0aGUgQlBGIFRvb2wgQ2hhbmdlcyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHRoYXQgdGhlc2UgY2hhbmdlcyBhcmUgaXNvbGF0ZWQgdG8gdGhlIGBicGZ0b29sYCB1dGlsaXR5IGFuZCByZWxhdGVkIHRlc3RpbmcgaW5mcmFzdHJ1Y3R1cmUuIFNwZWNpZmljYWxseSwgSSdtIGxvb2tpbmcgYXQgbW9kaWZpY2F0aW9ucyB3aXRoaW46XG5cbjEuICBgdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RgXG4yLiAgYHRvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sYFxuMy4gIGB0b29scy9icGYvYnBmdG9vbC9tYWluLmNgXG40LiAgYHRvb2xzL2JwZi9icGZ0b29sL21haW4uaGBcbjUuICBgdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNgXG42LiAgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY2BcblxuQmFzZWQgb24gdGhlIGVzdGFibGlzaGVkIGd1aWRlbGluZXMsIHRoaXMgaXMgcHJldHR5IGNsZWFyLWN1dC4gVGhlIGNyaXRlcmlhIGZvciByZXR1cm5pbmcgYFdvcnRoRnV6emluZz1mYWxzZWAgaXMgbWV0IGJlY2F1c2UgYWxsIHRoZSBjaGFuZ2VzIGFyZSBjb25maW5lZCB0byB1c2VyLXNwYWNlIHV0aWxpdGllcyBhbmQgc2VsZi10ZXN0cyB3aXRoaW4gdGhlIGB0b29scy9gIGRpcmVjdG9yeS4gVGhleSBhcmUgKm5vdCogdG91Y2hpbmcgYW55dGhpbmcgdGhhdCBkaXJlY3RseSBhZmZlY3RzIHRoZSBrZXJuZWwgaW1hZ2UgKGB2bWxpbnV4YCkgb3IgYW55IGxvYWRhYmxlIGtlcm5lbCBtb2R1bGVzLiBUaGVzZSBhcmUgbW9kaWZpY2F0aW9ucyB0byB0aGUgYGJwZnRvb2xgIHV0aWxpdHkgaXRzZWxmIGFuZCB0aGUgYXNzb2NpYXRlZCBzZWxmLXRlc3RzLlxuXG5UaGVyZWZvcmUsIHRoZSBmdXp6aW5nLXdvcnRoaW5lc3MgaXMgbG93LiBJIHdpbGwgc2V0IHRoZSBwYXJhbWV0ZXJzIGZvciBgc2V0LXJlc3VsdHNgIGFjY29yZGluZ2x5LiBJIHdpbGwgZW5zdXJlIHRoYXQ6XG5cbiogICBgV29ydGhGdXp6aW5nYCBpcyBzZXQgdG8gYGZhbHNlYC5cbiogICBgRm9jdXNTeW1ib2xzYCBpcyBzZXQgdG8gYW4gZW1wdHkvbnVsbCBsaXN0ICggYFtdYCApLlxuKiAgIGBFbmFibGVDb25maWdzYCBpcyBhbHNvIHNldCB0byBhbiBlbXB0eS9udWxsIGxpc3QgKCBgW11gICkuXG4qICAgVGhlIGBSZWFzb25pbmdgIHNob3VsZCBleHBsaWNpdGx5IHN0YXRlIHRoYXQgdGhlIGNoYW5nZXMgYXJlIGlzb2xhdGVkIHRvIHVzZXItc3BhY2UgYGJwZnRvb2xgIHV0aWxpdHkgYW5kIHNlbGYtdGVzdHMgbG9jYXRlZCB3aXRoaW4gdGhlIGB0b29scy9gIGRpcmVjdG9yeSwgYW5kIHRoYXQgdGhlc2UgZG8gbm90IGltcGFjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlIG9yIHJ1bnRpbWUga2VybmVsIGNvZGUuIFRoaXMgc2hvdWxkIGJlIHZlcnkgY2xlYXIgYW5kIGNvbmNpc2UgdG8gcHJldmVudCBhbnkgY29uZnVzaW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDk1MywiT3V0cHV0VG9rZW5zIjo4OSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQzNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwMDo1MzozOS44MTI3ODYyNDJaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI2OTMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlci1zcGFjZSBjb2RlIGluIHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYuIEl0IGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcywgYW5kIGlzIHRoZXJlZm9yZSBub3QgcmVsZXZhbnQgZm9yIHN5emthbGxlciBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIGNvZGUgaW4gdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLCBhbmQgaXMgdGhlcmVmb3JlIG5vdCByZWxldmFudCBmb3Igc3l6a2FsbGVyIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwMDo1MzozOS44MTI4MTk5OTJaIiwiU2VxIjo3LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDE0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },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-workflowj26ln[1] Phase: Running StartedAt: 2026-09-07 00:53:51 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowj26ln[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-09-07 00:53:51 +0000 UTC FinishedAt: 2026-09-07 00:53:59 +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,}