Name: series-workflowdl8x6 Phase: Failed StartedAt: 2026-09-07 01:24:10 +0000 UTC FinishedAt: 2026-09-07 02:20:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdl8x6[0] Phase: Succeeded StartedAt: 2026-09-07 01:24:10 +0000 UTC FinishedAt: 2026-09-07 02:20:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdl8x6[0].run-triage Phase: Succeeded StartedAt: 2026-09-07 01:24:10 +0000 UTC FinishedAt: 2026-09-07 02:20:47 +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+CgkJCTx0ZD4yMDI2LzA5LzA3IDAyOjIwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIGV4Y2x1c2l2ZWx5IG1vZGlmaWVzIHVzZXItc3BhY2UgdG9vbGluZyAoYnBmdG9vbCkgYW5kIHNlbGZ0ZXN0cyB1bmRlciB0aGUgdG9vbHMvIGRpcmVjdG9yeSAodG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZikuIE5vIGtlcm5lbCBydW50aW1lIGNvZGUsIG1vZHVsZXMsIG9yIHZtbGludXggaW1hZ2VzIGFyZSBtb2RpZmllZCwgc28gdGhpcyBjaGFuZ2UgZG9lcyBub3Qgd2FycmFudCBzeXprYWxsZXIgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDI6MjA8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBhMmQxYzVhNjAyODc5ZDM3OTk1ZjMwMWMwMjBkY2NlZjBiMzBkMmI4XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAwMjoyMDoyOCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdCBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5pbmRleCA1ZGFmM2RlNWM3NDQ2Li5jNDRlNmY3OTdlNTc3IDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5AQCAtMTIwLDcgJiM0MzsxMjAsOCBAQCBicGZ0b29sIG1hcCBwaW4gICAgICpNQVAqICAqRklMRSpcbiAgICAgY2hhcmFjdGVyICgmIzM5Oy4mIzM5OyksIHdoaWNoIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyBvZiAqYnBmZnMqLlxuIFxuIGJwZnRvb2wgbWFwIGV2ZW50X3BpcGUgKk1BUCogW2NwdSAqTiogaW5kZXggKk0qXVxuLSAgICBSZWFkIGV2ZW50cyBmcm9tIGEgKipCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSoqIG1hcC5cbiYjNDM7ICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogb3JcbiYjNDM7ICAgICoqQlBGX01BUF9UWVBFX1JJTkdCVUYqKiBtYXAuXG4gXG4gICAgIEluc3RhbGwgcGVyZiByaW5ncyBpbnRvIGEgcGVyZiBldmVudCBhcnJheSBtYXAgYW5kIGR1bXAgb3V0cHV0IG9mIGFueVxuICAgICAqKmJwZl9wZXJmX2V2ZW50X291dHB1dCoqXFwgKCkgY2FsbCBpbiB0aGUga2VybmVsLiBCeSBkZWZhdWx0IHJlYWQgdGhlXG5AQCAtMTM0LDYgJiM0MzsxMzUsMTggQEAgYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdXG4gICAgIGV4aXN0aW5nIHJpbmcuICBBbnkgb3RoZXIgYXBwbGljYXRpb24gd2lsbCBzdG9wIHJlY2VpdmluZyBldmVudHMgaWYgaXRcbiAgICAgaW5zdGFsbGVkIGl0cyByaW5ncyBlYXJsaWVyLlxuIFxuJiM0MzsgICAgRm9yIGEgcmluZyBidWZmZXIgbWFwLCBjb25zdW1lIHJlY29yZHMgc3VibWl0dGVkIGJ5IEJQRiBwcm9ncmFtcywgaW5jbHVkaW5nXG4mIzQzOyAgICByZWNvcmRzIGFscmVhZHkgcXVldWVkIGJlZm9yZSB0aGUgY29tbWFuZCBzdGFydHMuICoqY3B1KiogYW5kICoqaW5kZXgqKlxuJiM0MzsgICAgYXJlIG5vdCBzdXBwb3J0ZWQuIEVhY2ggcmVjb3JkIGlzIHByaW50ZWQgYXMgcmF3IGJ5dGVzLCBpbmNsdWRpbmcgZW1iZWRkZWRcbiYjNDM7ICAgIHplcm8gYnl0ZXMuIFBsYWluIG91dHB1dCByZXBvcnRzIHRoZSByZWNvcmQgc2l6ZSBmb2xsb3dlZCBieSBoZXhhZGVjaW1hbFxuJiM0MzsgICAgYnl0ZXM7IEpTT04gb3V0cHV0IGNvbnRhaW5zICoqc2l6ZSoqIGFuZCAqKmRhdGEqKiBmaWVsZHMsIHdpdGggKipkYXRhKiogYW5cbiYjNDM7ICAgIGFycmF5IG9mIGJ5dGUgdmFsdWVzLiBSaW5nIGJ1ZmZlciByZWNvcmRzIGhhdmUgbm8gaW1wbGljaXQgQ1BVIG9yIHRpbWVzdGFtcC5cbiYjNDM7XG4mIzQzOyAgICBSaW5nIGJ1ZmZlcnMgc3VwcG9ydCBhIHNpbmdsZSBjb25zdW1lci4gVGhpcyBjb21tYW5kIGFkdmFuY2VzIHRoZSBzaGFyZWRcbiYjNDM7ICAgIGNvbnN1bWVyIHBvc2l0aW9uIGFuZCBtdXN0IG5vdCBydW4gYWxvbmdzaWRlIGFub3RoZXIgY29uc3VtZXIgb2YgdGhlIHNhbWVcbiYjNDM7ICAgIG1hcDsgaXQgZG9lcyBub3QgcHJvdmlkZSBhIHBhc3NpdmUgdmlldyBvZiBldmVudHMuICoqQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRioqXG4mIzQzOyAgICBtYXBzIGFyZSBub3Qgc3VwcG9ydGVkLlxuJiM0MztcbiBicGZ0b29sIG1hcCBwZWVrICAqTUFQKlxuICAgICBQZWVrIG5leHQgdmFsdWUgaW4gdGhlIHF1ZXVlIG9yIHN0YWNrLlxuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbmluZGV4IDc1Y2JjYjUxMmViYWUuLjE3NTBiNDg4YzllM2IgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbkBAIC04NzgsMTEgJiM0Mzs4NzgsMTEgQEAgX2JwZnRvb2woKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7O1xuICAgICAgICAgICAgICAgICAgICAgICAgIGlkKVxuLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX2lkc19mb3JfdHlwZSBwZXJmX2V2ZW50X2FycmF5XG4mIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX2lkc19mb3JfdHlwZSAmIzM5O1wmIzM0O3R5cGVcJiMzNDs6IFwmIzM0O1xcKHBlcmZfZXZlbnRfYXJyYXlcXHxyaW5nYnVmXFwpXCYjMzQ7JiMzOTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOztcbiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKVxuLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX25hbWVzX2Zvcl90eXBlIHBlcmZfZXZlbnRfYXJyYXlcbiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfbmFtZXNfZm9yX3R5cGUgJiMzOTtcJiMzNDt0eXBlXCYjMzQ7OiBcJiMzNDtcXChwZXJmX2V2ZW50X2FycmF5XFx8cmluZ2J1ZlxcKVwmIzM0OyYjMzk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgY3B1KVxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xuaW5kZXggYmNiNzY3ZTJkNjczMy4uN2Q1NTUzMzFmNDQzYSAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jXG5AQCAtMjcsNyAmIzQzOzI3LDcgQEBcbiBcbiAjZGVmaW5lIE1NQVBfUEFHRV9DTlRcdDE2XG4gXG4tc3RhdGljIHZvbGF0aWxlIGJvb2wgc3RvcDtcbiYjNDM7c3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBzdG9wO1xuIFxuIHN0cnVjdCBwZXJmX2V2ZW50X3NhbXBsZSB7XG4gXHRzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgaGVhZGVyO1xuQEAgLTQ0LDcgJiM0Mzs0NCw2IEBAIHN0cnVjdCBwZXJmX2V2ZW50X2xvc3Qge1xuIFxuIHN0YXRpYyB2b2lkIGludF9leGl0KGludCBzaWdubylcbiB7XG4tXHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7U3RvcHBpbmcuLi5cXG5cJiMzNDspO1xuIFx0c3RvcCA9IHRydWU7XG4gfVxuIFxuQEAgLTEwNyw2ICYjNDM7MTA2LDI3IEBAIHByaW50X2JwZl9vdXRwdXQodm9pZCAqcHJpdmF0ZV9kYXRhLCBpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgKmV2ZW50KVxuIFx0cmV0dXJuIExJQkJQRl9QRVJGX0VWRU5UX0NPTlQ7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW50IHByaW50X3JpbmdidWZfb3V0cHV0KHZvaWQgKmN0eCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpXG4mIzQzO3tcbiYjNDM7XHRpZiAoanNvbl9vdXRwdXQpIHtcbiYjNDM7XHRcdGpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7XG4mIzQzO1x0XHRqc29ud191aW50X2ZpZWxkKGpzb25fd3RyLCBcJiMzNDtzaXplXCYjMzQ7LCBzaXplKTtcbiYjNDM7XHRcdGpzb253X25hbWUoanNvbl93dHIsIFwmIzM0O2RhdGFcJiMzNDspO1xuJiM0MztcdFx0cHJpbnRfZGF0YV9qc29uKGRhdGEsIHNpemUpO1xuJiM0MztcdFx0anNvbndfZW5kX29iamVjdChqc29uX3d0cik7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHByaW50ZihcJiMzNDs9PSBzaXplOiAlenUgPT09PT1cXG5cJiMzNDssIHNpemUpO1xuJiM0MztcdFx0ZnByaW50X2hleChzdGRvdXQsIGRhdGEsIHNpemUsIFwmIzM0OyBcJiMzNDspO1xuJiM0MztcdFx0cHJpbnRmKFwmIzM0O1xcblwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZmZsdXNoKHN0ZG91dCkpXG4mIzQzO1x0XHRyZXR1cm4gZXJybm8gPyAtZXJybm8gOiAtRUlPO1xuJiM0MztcbiYjNDM7XHQvKiBBIHByb2R1Y2VyIGNhbiBrZWVwIHBvbGwoKSBidXN5IGV2ZW4gYWZ0ZXIgYSBzaWduYWwgYXJyaXZlcy4gKi9cbiYjNDM7XHRyZXR1cm4gc3RvcCA/IC1FSU5UUiA6IDA7XG4mIzQzO31cbiYjNDM7XG4gaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIHtcbiBcdHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgcGVyZl9hdHRyID0ge1xuQEAgLTEyMywxOCAmIzQzOzE0MywyNiBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdC5jcHUgPSAtMSxcbiBcdFx0LmlkeCA9IC0xLFxuIFx0fTtcbi1cdHN0cnVjdCBwZXJmX2J1ZmZlciAqcGI7XG4mIzQzO1x0c3RydWN0IHBlcmZfYnVmZmVyICpwYiA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IHJpbmdfYnVmZmVyICpyYiA9IE5VTEw7XG4gXHRfX3UzMiBtYXBfaW5mb19sZW47XG4gXHRpbnQgZXJyLCBtYXBfZmQ7XG4gXG4mIzQzO1x0c3RvcCA9IGZhbHNlO1xuIFx0bWFwX2luZm9fbGVuID0gc2l6ZW9mKG1hcF9pbmZvKTtcbiBcdG1hcF9mZCA9IG1hcF9wYXJzZV9mZF9hbmRfaW5mbyhcdTAwMjZhcmdjLCBcdTAwMjZhcmd2LCBcdTAwMjZtYXBfaW5mbywgXHUwMDI2bWFwX2luZm9fbGVuLFxuIFx0XHRcdFx0ICAgICAgIDApO1xuIFx0aWYgKG1hcF9mZCBcdTAwM2MgMClcbiBcdFx0cmV0dXJuIC0xO1xuIFxuLVx0aWYgKG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpIHtcbi1cdFx0cF9lcnIoXCYjMzQ7bWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXlcJiMzNDspO1xuJiM0MztcdGlmIChtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9SSU5HQlVGKSB7XG4mIzQzO1x0XHRwX2VycihcJiMzNDttYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheSBvciByaW5nIGJ1ZmZlclwmIzM0Oyk7XG4mIzQzO1x0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRiBcdTAwMjZcdTAwMjYgYXJnYykge1xuJiM0MztcdFx0cF9lcnIoXCYjMzQ7cmluZyBidWZmZXIgbWFwcyBkbyBub3Qgc3VwcG9ydCBjcHUgb3IgaW5kZXggYXJndW1lbnRzXCYjMzQ7KTtcbiBcdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuIFx0fVxuIFxuQEAgLTE4NCwxNSAmIzQzOzIxMiwyNCBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdGN0eC5pZHggPSAwO1xuIFx0fVxuIFxuLVx0b3B0cy5jcHVfY250ID0gY3R4LmFsbF9jcHVzID8gMCA6IDE7XG4tXHRvcHRzLmNwdXMgPSBcdTAwMjZjdHguY3B1O1xuLVx0b3B0cy5tYXBfa2V5cyA9IFx1MDAyNmN0eC5pZHg7XG4tXHRwYiA9IHBlcmZfYnVmZmVyX19uZXdfcmF3KG1hcF9mZCwgTU1BUF9QQUdFX0NOVCwgXHUwMDI2cGVyZl9hdHRyLFxuLVx0XHRcdFx0ICBwcmludF9icGZfb3V0cHV0LCBcdTAwMjZjdHgsIFx1MDAyNm9wdHMpO1xuLVx0aWYgKCFwYikge1xuLVx0XHRwX2VycihcJiMzNDtmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpXCYjMzQ7LFxuLVx0XHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcbi1cdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuJiM0MztcdGlmIChtYXBfaW5mby50eXBlID09IEJQRl9NQVBfVFlQRV9SSU5HQlVGKSB7XG4mIzQzO1x0XHRyYiA9IHJpbmdfYnVmZmVyX19uZXcobWFwX2ZkLCBwcmludF9yaW5nYnVmX291dHB1dCwgTlVMTCwgTlVMTCk7XG4mIzQzO1x0XHRpZiAoIXJiKSB7XG4mIzQzO1x0XHRcdHBfZXJyKFwmIzM0O2ZhaWxlZCB0byBjcmVhdGUgcmluZyBidWZmZXI6ICVzICglZClcJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xuJiM0MztcdFx0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdG9wdHMuY3B1X2NudCA9IGN0eC5hbGxfY3B1cyA/IDAgOiAxO1xuJiM0MztcdFx0b3B0cy5jcHVzID0gXHUwMDI2Y3R4LmNwdTtcbiYjNDM7XHRcdG9wdHMubWFwX2tleXMgPSBcdTAwMjZjdHguaWR4O1xuJiM0MztcdFx0cGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsIFx1MDAyNnBlcmZfYXR0cixcbiYjNDM7XHRcdFx0XHRcdCAgcHJpbnRfYnBmX291dHB1dCwgXHUwMDI2Y3R4LCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRcdGlmICghcGIpIHtcbiYjNDM7XHRcdFx0cF9lcnIoXCYjMzQ7ZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGJ1ZmZlcjogJXMgKCVkKVwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XG4mIzQzO1x0XHRcdGdvdG8gZXJyX2Nsb3NlX21hcDtcbiYjNDM7XHRcdH1cbiBcdH1cbiBcbiBcdHNpZ25hbChTSUdJTlQsIGludF9leGl0KTtcbkBAIC0yMDIsMjUgJiM0MzsyMzksMzMgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0aWYgKGpzb25fb3V0cHV0KVxuIFx0XHRqc29ud19zdGFydF9hcnJheShqc29uX3d0cik7XG4gXG4mIzQzO1x0ZXJyID0gMDtcbiBcdHdoaWxlICghc3RvcCkge1xuLVx0XHRlcnIgPSBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTtcbiYjNDM7XHRcdGVyciA9IHJiID8gcmluZ19idWZmZXJfX3BvbGwocmIsIDIwMCkgOiBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTtcbiBcdFx0aWYgKGVyciBcdTAwM2MgMCBcdTAwMjZcdTAwMjYgZXJyICE9IC1FSU5UUikge1xuLVx0XHRcdHBfZXJyKFwmIzM0O3BlcmYgYnVmZmVyIHBvbGxpbmcgZmFpbGVkOiAlcyAoJWQpXCYjMzQ7LFxuLVx0XHRcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xuLVx0XHRcdGdvdG8gZXJyX2Nsb3NlX3BiO1xuJiM0MztcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7RXJyb3I6ICVzIGJ1ZmZlciBwb2xsaW5nIGZhaWxlZDogJXMgKCVkKVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRyYiA/IFwmIzM0O3JpbmdcJiMzNDsgOiBcJiMzNDtwZXJmXCYjMzQ7LCBzdHJlcnJvcigtZXJyKSwgLWVycik7XG4mIzQzO1x0XHRcdGJyZWFrO1xuIFx0XHR9XG4mIzQzO1x0XHRlcnIgPSAwO1xuIFx0fVxuIFxuJiM0MztcdGlmIChzdG9wKVxuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0O1N0b3BwaW5nLi4uXFxuXCYjMzQ7KTtcbiBcdGlmIChqc29uX291dHB1dClcbiBcdFx0anNvbndfZW5kX2FycmF5KGpzb25fd3RyKTtcbiYjNDM7XHRpZiAoZmZsdXNoKHN0ZG91dCkpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtFcnJvcjogZmFpbGVkIHRvIHdyaXRlIGV2ZW50czogJXNcXG5cJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0XHRlcnIgPSAtMTtcbiYjNDM7XHR9XG4gXG4mIzQzO1x0cmluZ19idWZmZXJfX2ZyZWUocmIpO1xuIFx0cGVyZl9idWZmZXJfX2ZyZWUocGIpO1xuJiM0MztcdC8qIEJvdGggYnVmZmVyIG1hbmFnZXJzIGJvcnJvdyBtYXBfZmQuICovXG4gXHRjbG9zZShtYXBfZmQpO1xuIFxuLVx0cmV0dXJuIDA7XG4mIzQzO1x0cmV0dXJuIGVyciBcdTAwM2MgMCA/IC0xIDogMDtcbiBcbi1lcnJfY2xvc2VfcGI6XG4tXHRwZXJmX2J1ZmZlcl9fZnJlZShwYik7XG4gZXJyX2Nsb3NlX21hcDpcbiBcdGNsb3NlKG1hcF9mZCk7XG4gXHRyZXR1cm4gLTE7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjIwOTliZjEwMjA5MzBcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jXG5AQCAtMCwwICYjNDM7MSwzODEgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7I2luY2x1ZGUgXHUwMDNjY3R5cGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3BvbGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZnRvb2xfcmluZ2J1Zi5za2VsLmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgV0FJVF9TVEVQUyA1MDBcbiYjNDM7I2RlZmluZSBXQUlUX1VTIDEwMDAwXG4mIzQzO1xuJiM0MztzdHJ1Y3QgY29uc3VtZXIge1xuJiM0MztcdHBpZF90IHBpZDtcbiYjNDM7XHRpbnQgZmQ7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqYnBmdG9vbF9wYXRoKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBjaGFyICpwYXRoID0gZ2V0ZW52KFwmIzM0O0JQRlRPT0xcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRpZiAocGF0aClcbiYjNDM7XHRcdHJldHVybiBhY2Nlc3MocGF0aCwgWF9PSykgPyBOVUxMIDogcGF0aDtcbiYjNDM7XHRpZiAoIWFjY2VzcyhcJiMzNDsuL3Rvb2xzL3NiaW4vYnBmdG9vbFwmIzM0OywgWF9PSykpXG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7Li90b29scy9zYmluL2JwZnRvb2xcJiMzNDs7XG4mIzQzO1x0aWYgKCFhY2Nlc3MoXCYjMzQ7Li4vdG9vbHMvc2Jpbi9icGZ0b29sXCYjMzQ7LCBYX09LKSlcbiYjNDM7XHRcdHJldHVybiBcJiMzNDsuLi90b29scy9zYmluL2JwZnRvb2xcJiMzNDs7XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNvbnN1bWVyX2NsZWFudXAoc3RydWN0IGNvbnN1bWVyICpjaGlsZClcbiYjNDM7e1xuJiM0MztcdGlmIChjaGlsZC1cdTAwM2VwaWQgXHUwMDNlIDApIHtcbiYjNDM7XHRcdGtpbGwoY2hpbGQtXHUwMDNlcGlkLCBTSUdLSUxMKTtcbiYjNDM7XHRcdHdoaWxlICh3YWl0cGlkKGNoaWxkLVx1MDAzZXBpZCwgTlVMTCwgMCkgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vID09IEVJTlRSKVxuJiM0MztcdFx0XHQ7XG4mIzQzO1x0XHRjaGlsZC1cdTAwM2VwaWQgPSAtMTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKGNoaWxkLVx1MDAzZWZkIFx1MDAzZT0gMCkge1xuJiM0MztcdFx0Y2xvc2UoY2hpbGQtXHUwMDNlZmQpO1xuJiM0MztcdFx0Y2hpbGQtXHUwMDNlZmQgPSAtMTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGNvbnN1bWVyX3N0YXJ0KHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBtYXBfZmQsIGJvb2wganNvbixcbiYjNDM7XHRcdFx0ICAgY29uc3QgY2hhciAqb3B0aW9uLCBib29sIHBhaXIsIGJvb2wgY2FwdHVyZV9lcnJvcnMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbiYjNDM7XHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XG4mIzQzO1x0Y29uc3QgY2hhciAqcGF0aCA9IGJwZnRvb2xfcGF0aCgpO1xuJiM0MztcdGNoYXIgKmFyZ3ZbMTJdLCBpZFsxNl07XG4mIzQzO1x0aW50IG91dFsyXSwgcmVhZHlbMl0sIG4gPSAwLCBlcnIsIGVycl9mZDtcbiYjNDM7XHRzdHJ1Y3QgcG9sbGZkIHBmZDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHBhdGgsIFwmIzM0O2JwZnRvb2wgcGF0aCAoc2V0IEJQRlRPT0wgdG8gb3ZlcnJpZGUpXCYjMzQ7KSB8fFxuJiM0MztcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQobWFwX2ZkLCBcdTAwMjZpbmZvLCBcdTAwMjZsZW4pLCBcJiMzNDttYXAgaW5mb1wmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0c25wcmludGYoaWQsIHNpemVvZihpZCksIFwmIzM0OyV1XCYjMzQ7LCBpbmZvLmlkKTtcbiYjNDM7XHRhcmd2W24mIzQzOyYjNDM7XSA9IChjaGFyICopcGF0aDtcbiYjNDM7XHRpZiAoanNvbilcbiYjNDM7XHRcdGFyZ3ZbbiYjNDM7JiM0MztdID0gXCYjMzQ7LWpcJiMzNDs7XG4mIzQzO1x0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDttYXBcJiMzNDs7XG4mIzQzO1x0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDtldmVudF9waXBlXCYjMzQ7O1xuJiM0MztcdGFyZ3ZbbiYjNDM7JiM0MztdID0gXCYjMzQ7aWRcJiMzNDs7XG4mIzQzO1x0YXJndltuJiM0MzsmIzQzO10gPSBpZDtcbiYjNDM7XHRpZiAob3B0aW9uKSB7XG4mIzQzO1x0XHRhcmd2W24mIzQzOyYjNDM7XSA9IChjaGFyICopb3B0aW9uO1xuJiM0MztcdFx0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDswXCYjMzQ7O1xuJiM0MztcdFx0aWYgKHBhaXIpIHtcbiYjNDM7XHRcdFx0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDtpbmRleFwmIzM0OztcbiYjNDM7XHRcdFx0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDswXCYjMzQ7O1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRhcmd2W25dID0gTlVMTDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhwaXBlMihvdXQsIE9fQ0xPRVhFQyksIFwmIzM0O291dHB1dCBwaXBlXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhwaXBlMihyZWFkeSwgT19DTE9FWEVDKSwgXCYjMzQ7ZXhlYyBwaXBlXCYjMzQ7KSkge1xuJiM0MztcdFx0Y2xvc2Uob3V0WzBdKTtcbiYjNDM7XHRcdGNsb3NlKG91dFsxXSk7XG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcdGNoaWxkLVx1MDAzZXBpZCA9IGZvcmsoKTtcbiYjNDM7XHRpZiAoIWNoaWxkLVx1MDAzZXBpZCkge1xuJiM0MztcdFx0Y2xvc2Uob3V0WzBdKTtcbiYjNDM7XHRcdGNsb3NlKHJlYWR5WzBdKTtcbiYjNDM7XHRcdGVycl9mZCA9IGNhcHR1cmVfZXJyb3JzID8gb3V0WzFdIDogb3BlbihcJiMzNDsvZGV2L251bGxcJiMzNDssIE9fV1JPTkxZKTtcbiYjNDM7XHRcdGlmIChkdXAyKG91dFsxXSwgU1RET1VUX0ZJTEVOTykgXHUwMDNjIDAgfHxcbiYjNDM7XHRcdCAgICBkdXAyKGVycl9mZCwgU1RERVJSX0ZJTEVOTykgXHUwMDNjIDApXG4mIzQzO1x0XHRcdGdvdG8gZXhlY19mYWlsO1xuJiM0MztcdFx0aWYgKCFjYXB0dXJlX2Vycm9ycylcbiYjNDM7XHRcdFx0Y2xvc2UoZXJyX2ZkKTtcbiYjNDM7XHRcdGNsb3NlKG91dFsxXSk7XG4mIzQzO1x0XHRleGVjdihwYXRoLCBhcmd2KTtcbiYjNDM7ZXhlY19mYWlsOlxuJiM0MztcdFx0ZXJyID0gZXJybm87XG4mIzQzO1x0XHR3cml0ZShyZWFkeVsxXSwgXHUwMDI2ZXJyLCBzaXplb2YoZXJyKSk7XG4mIzQzO1x0XHRfZXhpdCgxMjcpO1xuJiM0MztcdH1cbiYjNDM7XHRjbG9zZShvdXRbMV0pO1xuJiM0MztcdGNsb3NlKHJlYWR5WzFdKTtcbiYjNDM7XHRjaGlsZC1cdTAwM2VmZCA9IG91dFswXTtcbiYjNDM7XHRwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSByZWFkeVswXSwgLmV2ZW50cyA9IFBPTExJTiB9O1xuJiM0MztcdC8qIEVPRiBvbiB0aGUgY2xvc2Utb24tZXhlYyBwaXBlIGRpc3Rpbmd1aXNoZXMgZXhlYyBmcm9tIGluaGVyaXRlZCBoYW5kbGVycy4gKi9cbiYjNDM7XHRlcnIgPSBjaGlsZC1cdTAwM2VwaWQgXHUwMDNlIDAgPyBwb2xsKFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSA6IC0xO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKGNoaWxkLVx1MDAzZXBpZCwgMCwgXCYjMzQ7Zm9ya1wmIzM0OykgfHxcbiYjNDM7XHQgICAgIUFTU0VSVF9HVChlcnIsIDAsIFwmIzM0O2V4ZWMgdGltZW91dFwmIzM0OykgfHxcbiYjNDM7XHQgICAgIUFTU0VSVF9FUShyZWFkKHJlYWR5WzBdLCBcdTAwMjZlcnIsIHNpemVvZihlcnIpKSwgMCwgXCYjMzQ7ZXhlY1wmIzM0OykpIHtcbiYjNDM7XHRcdGNsb3NlKHJlYWR5WzBdKTtcbiYjNDM7XHRcdGNvbnN1bWVyX2NsZWFudXAoY2hpbGQpO1xuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XHRjbG9zZShyZWFkeVswXSk7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGNvbnN1bWVyX2ZpbmlzaChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkLCBpbnQgc2lnbm8sIGJvb2wgc3VjY2VzcyxcbiYjNDM7XHRcdFx0ICAgIGNoYXIgKm91dHB1dCwgc2l6ZV90IHNpemUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgc3RhdHVzID0gMCwgaTtcbiYjNDM7XHRwaWRfdCByZXQgPSAwO1xuJiM0MztcdHNzaXplX3QgbjtcbiYjNDM7XHRzaXplX3QgdXNlZCA9IDA7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGZjbnRsKGNoaWxkLVx1MDAzZWZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKSwgXCYjMzQ7bm9uYmxvY2tpbmcgb3V0cHV0XCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRpZiAoc2lnbm8gXHUwMDI2XHUwMDI2ICFBU1NFUlRfT0soa2lsbChjaGlsZC1cdTAwM2VwaWQsIHNpZ25vKSwgXCYjMzQ7c2lnbmFsIGNvbnN1bWVyXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBXQUlUX1NURVBTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0d2hpbGUgKHVzZWQgXHUwMDNjIHNpemUgLSAxIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgICAgIChuID0gcmVhZChjaGlsZC1cdTAwM2VmZCwgb3V0cHV0ICYjNDM7IHVzZWQsIHNpemUgLSAxIC0gdXNlZCkpIFx1MDAzZSAwKVxuJiM0MztcdFx0XHR1c2VkICYjNDM7PSBuO1xuJiM0MztcdFx0cmV0ID0gd2FpdHBpZChjaGlsZC1cdTAwM2VwaWQsIFx1MDAyNnN0YXR1cywgV05PSEFORyk7XG4mIzQzO1x0XHRpZiAocmV0ID09IGNoaWxkLVx1MDAzZXBpZClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyAhPSBFSU5UUilcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR1c2xlZXAoV0FJVF9VUyk7XG4mIzQzO1x0fVxuJiM0MztcdGlmICghQVNTRVJUX0VRKHJldCwgY2hpbGQtXHUwMDNlcGlkLCBcJiMzNDtib3VuZGVkIGNvbnN1bWVyIGV4aXRcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdGNoaWxkLVx1MDAzZXBpZCA9IC0xO1xuJiM0MztcdHdoaWxlICh1c2VkIFx1MDAzYyBzaXplIC0gMSBcdTAwMjZcdTAwMjYgKG4gPSByZWFkKGNoaWxkLVx1MDAzZWZkLCBvdXRwdXQgJiM0MzsgdXNlZCwgc2l6ZSAtIDEgLSB1c2VkKSkgXHUwMDNlIDApXG4mIzQzO1x0XHR1c2VkICYjNDM7PSBuO1xuJiM0MztcdG91dHB1dFt1c2VkXSA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0cmV0dXJuIEFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcJiMzNDtub3JtYWwgZXhpdFwmIzM0OykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICAgIEFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpID09IDAsIHN1Y2Nlc3MsIFwmIzM0O2V4aXQgc3RhdHVzXCYjMzQ7KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZXJfcmVhZHkoc3RydWN0IGNvbnN1bWVyICpjaGlsZClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbG9uZyBjYXVnaHQ7XG4mIzQzO1x0Y2hhciBwYXRoWzY0XSwgbGluZVsyNTZdO1xuJiM0MztcdGludCBpO1xuJiM0MztcdEZJTEUgKmY7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXCYjMzQ7L3Byb2MvJWQvc3RhdHVzXCYjMzQ7LCBjaGlsZC1cdTAwM2VwaWQpO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFdBSVRfU1RFUFM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRmID0gZm9wZW4ocGF0aCwgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAoIWYpXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHtcbiYjNDM7XHRcdFx0aWYgKHNzY2FuZihsaW5lLCBcJiMzNDtTaWdDZ3Q6ICVsbHhcJiMzNDssIFx1MDAyNmNhdWdodCkgPT0gMSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdFx0ICAgIChjYXVnaHQgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyAoU0lHSU5UIC0gMSkpKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdFx0ICAgIChjYXVnaHQgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyAoU0lHVEVSTSAtIDEpKSkpIHtcbiYjNDM7XHRcdFx0XHRmY2xvc2UoZik7XG4mIzQzO1x0XHRcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGZjbG9zZShmKTtcbiYjNDM7XHRcdHVzbGVlcChXQUlUX1VTKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIEFTU0VSVF9UUlVFKGZhbHNlLCBcJiMzNDtjb25zdW1lciBzaWduYWwgaGFuZGxlcnMgcmVhZHlcJiMzNDspO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBlbWl0X3JlY29yZChzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsLCBpbnQgcmVjb3JkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBwYWNrZXRbNjRdID0ge307XG4mIzQzO1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBvcHRzLFxuJiM0MztcdFx0ICAgIC5kYXRhX2luID0gcGFja2V0LFxuJiM0MztcdFx0ICAgIC5kYXRhX3NpemVfaW4gPSBzaXplb2YocGFja2V0KSxcbiYjNDM7XHQpO1xuJiM0MztcbiYjNDM7XHRza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNvcmQgPSByZWNvcmQ7XG4mIzQzO1x0cmV0dXJuIEFTU0VSVF9PSyhicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLnByb2R1Y2UpLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgXHUwMDI2b3B0cyksIFwmIzM0O3Byb2R1Y2UgcmVjb3JkXCYjMzQ7KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgICAgQVNTRVJUX09LKHNrZWwtXHUwMDNlYnNzLVx1MDAzZW91dHB1dF9lcnIsIFwmIzM0O3JpbmdidWYgb3V0cHV0XCYjMzQ7KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZWQodW5zaWduZWQgbG9uZyAqcG9zaXRpb24sIHVuc2lnbmVkIGxvbmcgZXhwZWN0ZWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgV0FJVF9TVEVQUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChfX2F0b21pY19sb2FkX24ocG9zaXRpb24sIF9fQVRPTUlDX0FDUVVJUkUpID09IGV4cGVjdGVkKVxuJiM0MztcdFx0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRcdHVzbGVlcChXQUlUX1VTKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIEFTU0VSVF9FUSgqcG9zaXRpb24sIGV4cGVjdGVkLCBcJiMzNDtjb25zdW1lciBwb3NpdGlvblwmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNoZWNrX2pzb24oY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICpleHBlY3RlZClcbiYjNDM7e1xuJiM0MztcdGNoYXIgKnNyYyA9IG91dHB1dCwgKmRzdCA9IG91dHB1dDtcbiYjNDM7XHRib29sIHF1b3RlZCA9IGZhbHNlLCBlc2NhcGVkID0gZmFsc2U7XG4mIzQzO1xuJiM0MztcdC8qIElnbm9yZSBmb3JtYXR0aW5nIHdoaXRlc3BhY2Ugd2hpbGUgY2hlY2tpbmcgdGhlIGVudGlyZSBKU09OIGRvY3VtZW50LiAqL1xuJiM0MztcdHdoaWxlICgqc3JjKSB7XG4mIzQzO1x0XHRpZiAocXVvdGVkIHx8ICFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxuJiM0MztcdFx0XHQqZHN0JiM0MzsmIzQzOyA9ICpzcmM7XG4mIzQzO1x0XHRpZiAoIWVzY2FwZWQgXHUwMDI2XHUwMDI2ICpzcmMgPT0gJiMzOTtcJiMzNDsmIzM5OylcbiYjNDM7XHRcdFx0cXVvdGVkID0gIXF1b3RlZDtcbiYjNDM7XHRcdGVzY2FwZWQgPSAhZXNjYXBlZCBcdTAwMjZcdTAwMjYgcXVvdGVkIFx1MDAyNlx1MDAyNiAqc3JjID09ICYjMzk7XFxcXCYjMzk7O1xuJiM0MztcdFx0c3JjJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1x0KmRzdCA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwmIzM0O0pTT04gcmVjb3Jkc1wmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfY29uc3VtZXIoYm9vbCBqc29uLCBib29sIGlkbGUsIGludCBzaWdubylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9O1xuJiM0MztcdHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWw7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyAqcG9zaXRpb24gPSBNQVBfRkFJTEVEO1xuJiM0MztcdGludCBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpLCBmZDtcbiYjNDM7XHRjaGFyIG91dHB1dFs0MDk2XTtcbiYjNDM7XHRzdHJ1Y3QgcG9sbGZkIHBmZDtcbiYjNDM7XG4mIzQzO1x0c2tlbCA9IGJwZnRvb2xfcmluZ2J1Zl9fb3BlbigpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcJiMzNDtvcGVuXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cdTAwM2VtYXBzLnJpbmdidWYsIHBhZ2Vfc2l6ZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soYnBmdG9vbF9yaW5nYnVmX19sb2FkKHNrZWwpLCBcJiMzNDtsb2FkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZkID0gYnBmX21hcF9fZmQoc2tlbC1cdTAwM2VtYXBzLnJpbmdidWYpO1xuJiM0MztcdHBvc2l0aW9uID0gbW1hcChOVUxMLCBwYWdlX3NpemUsIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgZmQsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX05FUShwb3NpdGlvbiwgTUFQX0ZBSUxFRCwgXCYjMzQ7Y29uc3VtZXIgbW1hcFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIWlkbGUgXHUwMDI2XHUwMDI2ICghZW1pdF9yZWNvcmQoc2tlbCwgMCkgfHwgIWVtaXRfcmVjb3JkKHNrZWwsIDEpKSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghY29uc3VtZXJfc3RhcnQoXHUwMDI2Y2hpbGQsIGZkLCBqc29uLCBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8XG4mIzQzO1x0ICAgICFjb25zdW1lcl9yZWFkeShcdTAwMjZjaGlsZCkpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIWlkbGUpIHtcbiYjNDM7XHRcdC8qIEJvdGggcHJlZmlsbGVkIHJlY29yZHMgb2NjdXB5IDE2IGJ5dGVzIGluY2x1ZGluZyB0aGVpciBoZWFkZXJzLiAqL1xuJiM0MztcdFx0aWYgKCFjb25zdW1lZChwb3NpdGlvbiwgMzIpKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdHBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IGNoaWxkLmZkLCAuZXZlbnRzID0gUE9MTElOIH07XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9HVChwb2xsKFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSwgMCxcbiYjNDM7XHRcdFx0ICAgICAgIFwmIzM0O3JlY29yZHMgZmx1c2hlZCBiZWZvcmUgZXhpdFwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgXHUwMDI2IFBPTExJTiwgXCYjMzQ7cmVjb3JkIG91dHB1dCByZWFkYWJsZVwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMikgfHwgIWNvbnN1bWVkKHBvc2l0aW9uLCA2NCkpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIWNvbnN1bWVyX2ZpbmlzaChcdTAwMjZjaGlsZCwgc2lnbm8sIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWYgKGpzb24pXG4mIzQzO1x0XHRjaGVja19qc29uKG91dHB1dCwgaWRsZSA/IFwmIzM0O1tdXCYjMzQ7IDpcbiYjNDM7XHRcdFx0ICAgXCYjMzQ7W3tcXFwmIzM0O3NpemVcXFwmIzM0OzoyLFxcXCYjMzQ7ZGF0YVxcXCYjMzQ7OlswLDI1NV19LFwmIzM0O1xuJiM0MztcdFx0XHQgICBcJiMzNDt7XFxcJiMzNDtzaXplXFxcJiMzNDs6NSxcXFwmIzM0O2RhdGFcXFwmIzM0OzpbMSwyLDMsNCw1XX0sXCYjMzQ7XG4mIzQzO1x0XHRcdCAgIFwmIzM0O3tcXFwmIzM0O3NpemVcXFwmIzM0OzoxNyxcXFwmIzM0O2RhdGFcXFwmIzM0OzpbMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsXCYjMzQ7XG4mIzQzO1x0XHRcdCAgIFwmIzM0OzI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyXX1dXCYjMzQ7KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBpZGxlID8gXCYjMzQ7XCYjMzQ7IDpcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDs9PSBzaXplOiAyID09PT09XFxuMDAgZmZcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDs9PSBzaXplOiA1ID09PT09XFxuMDEgMDIgMDMgMDQgMDVcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDs9PSBzaXplOiAxNyA9PT09PVxcbjEwIDExIDEyIDEzIDE0IDE1IDE2IDE3ICBcJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsxOCAxOSAxYSAxYiAxYyAxZCAxZSAxZlxcbjIwXFxuXCYjMzQ7LCBcJiMzNDtwbGFpbiByZWNvcmRzXCYjMzQ7KTtcbiYjNDM7b3V0OlxuJiM0MztcdGNvbnN1bWVyX2NsZWFudXAoXHUwMDI2Y2hpbGQpO1xuJiM0MztcdGlmIChwb3NpdGlvbiAhPSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0bXVubWFwKHBvc2l0aW9uLCBwYWdlX3NpemUpO1xuJiM0MztcdGJwZnRvb2xfcmluZ2J1Zl9fZGVzdHJveShza2VsKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9wZXJmX2NvbnN1bWVyKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGxvbmcgc2Vjb25kcywgbmFub3NlY29uZHM7XG4mIzQzO1x0c3RydWN0IGJwZnRvb2xfcmluZ2J1ZiAqc2tlbDtcbiYjNDM7XHRjaGFyIG91dHB1dFsxNjM4NF0sIGV4cGVjdGVkWzE2Mzg0XTtcbiYjNDM7XHRpbnQgbnJfY3B1cywgY3B1LCBpbmRleCwgb2Zmc2V0ID0gMCwgaSwgdXNlZCA9IDAsIGZpZWxkcztcbiYjNDM7XHRzdHJ1Y3QgcG9sbGZkIHBmZDtcbiYjNDM7XG4mIzQzO1x0bnJfY3B1cyA9IGxpYmJwZl9udW1fcG9zc2libGVfY3B1cygpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKG5yX2NwdXMsIDAsIFwmIzM0O3Bvc3NpYmxlIGNwdXNcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdHNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7b3BlblwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXHUwMDNlbWFwcy5yaW5nYnVmLCBnZXRwYWdlc2l6ZSgpKTtcbiYjNDM7XHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cdTAwM2VtYXBzLnBlcmZidWYsIG5yX2NwdXMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGJwZnRvb2xfcmluZ2J1Zl9fbG9hZChza2VsKSwgXCYjMzQ7bG9hZFwmIzM0OykgfHxcbiYjNDM7XHQgICAgIWNvbnN1bWVyX3N0YXJ0KFx1MDAyNmNoaWxkLCBicGZfbWFwX19mZChza2VsLVx1MDAzZW1hcHMucGVyZmJ1ZiksIGZhbHNlLFxuJiM0MztcdFx0XHQgICAgTlVMTCwgZmFsc2UsIGZhbHNlKSB8fCAhY29uc3VtZXJfcmVhZHkoXHUwMDI2Y2hpbGQpIHx8XG4mIzQzO1x0ICAgICFlbWl0X3JlY29yZChza2VsLCAzKSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdC8qIE9uZSBsYXJnZSByZWNvcmQgZmx1c2hlcyB0aGUgZXhpc3RpbmcgYnVmZmVyZWQgcGVyZiBvdXRwdXQgY2FsbGJhY2suICovXG4mIzQzO1x0cGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gY2hpbGQuZmQsIC5ldmVudHMgPSBQT0xMSU4gfTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChwb2xsKFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSwgMCxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtwZXJmIHJlY29yZCBvdXRwdXRcJiMzNDspIHx8XG4mIzQzO1x0ICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyBcdTAwMjYgUE9MTElOLCBcJiMzNDtwZXJmIG91dHB1dCByZWFkYWJsZVwmIzM0OykgfHxcbiYjNDM7XHQgICAgIWNvbnN1bWVyX2ZpbmlzaChcdTAwMjZjaGlsZCwgU0lHSU5ULCB0cnVlLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpKSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZpZWxkcyA9IHNzY2FuZihvdXRwdXQsIFwmIzM0Oz09IEAlbGx1LiVsbHUgQ1BVOiAlZCBpbmRleDogJWQgPT09PT1cXG4lblwmIzM0OyxcbiYjNDM7XHRcdFx0XHUwMDI2c2Vjb25kcywgXHUwMDI2bmFub3NlY29uZHMsIFx1MDAyNmNwdSwgXHUwMDI2aW5kZXgsIFx1MDAyNm9mZnNldCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoZmllbGRzLCA0LCBcJiMzNDtwZXJmIGhlYWRlclwmIzM0OykgfHxcbiYjNDM7XHQgICAgIUFTU0VSVF9HVChvZmZzZXQsIDAsIFwmIzM0O3BlcmYgcGF5bG9hZCBvZmZzZXRcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0QVNTRVJUX0dUKHNlY29uZHMgKiAxMDAwMDAwMDAwVUxMICYjNDM7IG5hbm9zZWNvbmRzLCAwLCBcJiMzNDtwZXJmIHRpbWVzdGFtcFwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0xUKG5hbm9zZWNvbmRzLCAxMDAwMDAwMDAwVUxMLCBcJiMzNDtwZXJmIHRpbWVzdGFtcCBuYW5vc2Vjb25kc1wmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0dFKGNwdSwgMCwgXCYjMzQ7cGVyZiBjcHVcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9MVChjcHUsIG5yX2NwdXMsIFwmIzM0O3BlcmYgY3B1IHJhbmdlXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoaW5kZXgsIGNwdSwgXCYjMzQ7cGVyZiBpbmRleFwmIzM0Oyk7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc2l6ZW9mKHNrZWwtXHUwMDNlcm9kYXRhLVx1MDAzZXBlcmZfcGF5bG9hZCk7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRjb25zdCBjaGFyICpzZXBhcmF0b3IgPSAhaSA/IFwmIzM0O1wmIzM0OyA6ICEoaSAlIDE2KSA/IFwmIzM0O1xcblwmIzM0OyA6XG4mIzQzO1x0XHRcdFx0XHQhKGkgJSA4KSA/IFwmIzM0OyAgXCYjMzQ7IDogXCYjMzQ7IFwmIzM0OztcbiYjNDM7XG4mIzQzO1x0XHR1c2VkICYjNDM7PSBzbnByaW50ZihleHBlY3RlZCAmIzQzOyB1c2VkLCBzaXplb2YoZXhwZWN0ZWQpIC0gdXNlZCxcbiYjNDM7XHRcdFx0XHQgXCYjMzQ7JXMlMDJ4XCYjMzQ7LCBzZXBhcmF0b3IsIGkgPT0gMSA/IDB4ZmYgOiAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0c25wcmludGYoZXhwZWN0ZWQgJiM0MzsgdXNlZCwgc2l6ZW9mKGV4cGVjdGVkKSAtIHVzZWQsIFwmIzM0O1xcblwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX1NUUkVRKG91dHB1dCAmIzQzOyBvZmZzZXQsIGV4cGVjdGVkLCBcJiMzNDtwZXJmIHBheWxvYWRcJiMzNDspO1xuJiM0MztvdXQ6XG4mIzQzO1x0Y29uc3VtZXJfY2xlYW51cChcdTAwMjZjaGlsZCk7XG4mIzQzO1x0YnBmdG9vbF9yaW5nYnVmX19kZXN0cm95KHNrZWwpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3JlamVjdChlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBjb25zdCBjaGFyICpvcHRpb24sIGJvb2wgcGFpciwgYm9vbCBqc29uKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07XG4mIzQzO1x0Ym9vbCByaW5nID0gdHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRiB8fCB0eXBlID09IEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUY7XG4mIzQzO1x0Y29uc3QgY2hhciAqZXhwZWN0ZWQgPSBvcHRpb24gP1xuJiM0MztcdFx0XCYjMzQ7e1xcXCYjMzQ7ZXJyb3JcXFwmIzM0OzpcXFwmIzM0O3JpbmcgYnVmZmVyIG1hcHMgZG8gbm90IHN1cHBvcnQgY3B1IG9yIGluZGV4IGFyZ3VtZW50c1xcXCYjMzQ7fVwmIzM0OyA6XG4mIzQzO1x0XHRcJiMzNDt7XFxcJiMzNDtlcnJvclxcXCYjMzQ7OlxcXCYjMzQ7bWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcXFwmIzM0O31cJiMzNDs7XG4mIzQzO1x0Y2hhciBvdXRwdXRbNDA5Nl07XG4mIzQzO1x0aW50IGZkO1xuJiM0MztcbiYjNDM7XHRmZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsIE5VTEwsIHJpbmcgPyAwIDogNCwgcmluZyA/IDAgOiA0LFxuJiM0MztcdFx0XHQgICAgcmluZyA/IGdldHBhZ2VzaXplKCkgOiAxLCBOVUxMKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCYjMzQ7Y3JlYXRlIG1hcFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0aWYgKGNvbnN1bWVyX3N0YXJ0KFx1MDAyNmNoaWxkLCBmZCwganNvbiwgb3B0aW9uLCBwYWlyLCB0cnVlKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgY29uc3VtZXJfZmluaXNoKFx1MDAyNmNoaWxkLCAwLCBmYWxzZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpIHtcbiYjNDM7XHRcdGlmIChqc29uKVxuJiM0MztcdFx0XHRjaGVja19qc29uKG91dHB1dCwgZXhwZWN0ZWQpO1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRBU1NFUlRfR1Qoc3RybGVuKG91dHB1dCksIDAsIFwmIzM0O2Vycm9yIGRpYWdub3N0aWNcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XHRjb25zdW1lcl9jbGVhbnVwKFx1MDAyNmNoaWxkKTtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9icGZ0b29sX3JpbmdidWYodm9pZClcbiYjNDM7e1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3BlcmZfZXZlbnRfYXJyYXlcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9wZXJmX2NvbnN1bWVyKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cGxhaW5cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9jb25zdW1lcihmYWxzZSwgZmFsc2UsIFNJR0lOVCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7anNvblwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2NvbnN1bWVyKHRydWUsIGZhbHNlLCBTSUdURVJNKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtpZGxlX3NpZ2ludFwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2NvbnN1bWVyKGZhbHNlLCB0cnVlLCBTSUdJTlQpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2lkbGVfc2lndGVybV9qc29uXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfY29uc3VtZXIodHJ1ZSwgdHJ1ZSwgU0lHVEVSTSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X2FycmF5XCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9BUlJBWSwgTlVMTCwgZmFsc2UsIGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtyZWplY3RfdXNlcl9yaW5nYnVmXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X2NwdVwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCYjMzQ7Y3B1XCYjMzQ7LCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3JlamVjdF9pbmRleFwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCYjMzQ7aW5kZXhcJiMzNDssIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X2NwdV9pbmRleFwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCYjMzQ7Y3B1XCYjMzQ7LCB0cnVlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X3VzZXJfcmluZ2J1Zl9qc29uXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCB0cnVlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtyZWplY3RfY3B1X2luZGV4X2pzb25cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFwmIzM0O2NwdVwmIzM0OywgdHJ1ZSwgdHJ1ZSk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5iYmJjOTNjMzBhODMzXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNcbkBAIC0wLDAgJiM0MzsxLDQ3IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4mIzQzO1xuJiM0MztzdHJ1Y3Qge1xuJiM0MztcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUklOR0JVRik7XG4mIzQzO30gcmluZ2J1ZiBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7c3RydWN0IHtcbiYjNDM7XHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpO1xuJiM0MztcdF9fdWludChrZXlfc2l6ZSwgc2l6ZW9mKF9fdTMyKSk7XG4mIzQzO1x0X191aW50KHZhbHVlX3NpemUsIHNpemVvZihfX3UzMikpO1xuJiM0MztcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4mIzQzO30gcGVyZmJ1ZiBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogSW5jbHVkZSB0aGUgdTMyIHJhdyBzaXplIGluIHBlcmYmIzM5O3MgOC1ieXRlIGFsaWdubWVudCB0byBhdm9pZCBwYWRkaW5nLlxuJiM0MzsgKiBLZWVwIHBsYWluIG91dHB1dCBsYXJnZSBlbm91Z2ggdG8gZmx1c2ggc3RkaW8gYmVmb3JlIHRoZSBjb25zdW1lciBleGl0cy5cbiYjNDM7ICovXG4mIzQzO2NvbnN0IHVuc2lnbmVkIGNoYXIgcGVyZl9wYXlsb2FkWzQwOTJdID0geyAweDAwLCAweGZmIH07XG4mIzQzO1xuJiM0MztpbnQgcmVjb3JkO1xuJiM0MztpbnQgb3V0cHV0X2VycjtcbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtzb2NrZXRcJiMzNDspXG4mIzQzO2ludCBwcm9kdWNlKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYilcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGNoYXIgZmlyc3RbXSA9IHsgMHgwMCwgMHhmZiB9O1xuJiM0MztcdHVuc2lnbmVkIGNoYXIgc2Vjb25kW10gPSB7IDEsIDIsIDMsIDQsIDUgfTtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyIHRoaXJkW10gPSB7XG4mIzQzO1x0XHQweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LFxuJiM0MztcdFx0MHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRpZiAocmVjb3JkID09IDApXG4mIzQzO1x0XHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFx1MDAyNnJpbmdidWYsIGZpcnN0LCBzaXplb2YoZmlyc3QpLCAwKTtcbiYjNDM7XHRlbHNlIGlmIChyZWNvcmQgPT0gMSlcbiYjNDM7XHRcdG91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoXHUwMDI2cmluZ2J1Ziwgc2Vjb25kLCBzaXplb2Yoc2Vjb25kKSwgMCk7XG4mIzQzO1x0ZWxzZSBpZiAocmVjb3JkID09IDIpXG4mIzQzO1x0XHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFx1MDAyNnJpbmdidWYsIHRoaXJkLCBzaXplb2YodGhpcmQpLCAwKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRvdXRwdXRfZXJyID0gYnBmX3BlcmZfZXZlbnRfb3V0cHV0KHNrYiwgXHUwMDI2cGVyZmJ1ZiwgQlBGX0ZfQ1VSUkVOVF9DUFUsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICh2b2lkICopcGVyZl9wYXlsb2FkLCBzaXplb2YocGVyZl9wYXlsb2FkKSk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2NoYXIgTElDRU5TRVtdIFNFQyhcJiMzNDtsaWNlbnNlXCYjMzQ7KSA9IFwmIzM0O0dQTFwmIzM0OztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMjoyMDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBzZXJpZXMgZXhjbHVzaXZlbHkgbW9kaWZpZXMgdXNlci1zcGFjZSB0b29saW5nIChicGZ0b29sKSBhbmQgc2VsZnRlc3RzIHVuZGVyIHRoZSB0b29scy8gZGlyZWN0b3J5ICh0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmKS4gTm8ga2VybmVsIHJ1bnRpbWUgY29kZSwgbW9kdWxlcywgb3Igdm1saW51eCBpbWFnZXMgYXJlIG1vZGlmaWVkLCBzbyB0aGlzIGNoYW5nZSBkb2VzIG5vdCB3YXJyYW50IHN5emthbGxlciBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzCnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsCmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuCgotIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOgogIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQKICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLgogIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCwKICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuCgotIERPIE5PVCBCTElORExZIFRSVVNUICYjMzQ7Tk8gRlVOQ1RJT05BTCBDSEFOR0UmIzM0OyAoTkZDSSkgT1IgJiMzNDtSRUZBQ1RPUklORyYjMzQ7IENMQUlNUzoKICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzICYjMzQ7Y2xlYW51cHMmIzM0OywgJiMzNDtyZWZhY3RvcmluZ3MmIzM0Oywgb3Igc3RhdGUKICAmIzM0O05vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkJiMzNDsuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLgogIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudAogIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLgogIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuCgotIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOgogIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKiwKICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy4KICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyCiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczoKCi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczoKICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy4KICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKQogICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLgogICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHMKICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuCiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuCi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOgogICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6CiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmcKICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLgogICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOgotIENvcmUgU3Vic3lzdGVtczoKICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSwKICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy4KLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6CiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuCi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOgogICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLgotIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6CiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo0LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6CgotIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzoKICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1cwogIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0CiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuCiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzICYjMzQ7Zm9jdXNlZCYjMzQ7LAogIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy4KCi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOgogIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50cwogIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LgoKLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6CiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFjawogIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLgogIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlcgogIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZToKLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgotIENoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuCi0gU3RyaXAgYW55ICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGEyZDFjNWE2MDI4NzlkMzc5OTVmMzAxYzAyMGRjY2VmMGIzMGQyYjgKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIFNlcCA3IDAyOjIwOjI4IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdAppbmRleCA1ZGFmM2RlNWM3NDQ2Li5jNDRlNmY3OTdlNTc3IDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdApAQCAtMTIwLDcgJiM0MzsxMjAsOCBAQCBicGZ0b29sIG1hcCBwaW4gICAgICpNQVAqICAqRklMRSoKICAgICBjaGFyYWN0ZXIgKCYjMzk7LiYjMzk7KSwgd2hpY2ggaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHRlbnNpb25zIG9mICpicGZmcyouCiAKIGJwZnRvb2wgbWFwIGV2ZW50X3BpcGUgKk1BUCogW2NwdSAqTiogaW5kZXggKk0qXQotICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogbWFwLgomIzQzOyAgICBSZWFkIGV2ZW50cyBmcm9tIGEgKipCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSoqIG9yCiYjNDM7ICAgICoqQlBGX01BUF9UWVBFX1JJTkdCVUYqKiBtYXAuCiAKICAgICBJbnN0YWxsIHBlcmYgcmluZ3MgaW50byBhIHBlcmYgZXZlbnQgYXJyYXkgbWFwIGFuZCBkdW1wIG91dHB1dCBvZiBhbnkKICAgICAqKmJwZl9wZXJmX2V2ZW50X291dHB1dCoqXCAoKSBjYWxsIGluIHRoZSBrZXJuZWwuIEJ5IGRlZmF1bHQgcmVhZCB0aGUKQEAgLTEzNCw2ICYjNDM7MTM1LDE4IEBAIGJwZnRvb2wgbWFwIGV2ZW50X3BpcGUgKk1BUCogW2NwdSAqTiogaW5kZXggKk0qXQogICAgIGV4aXN0aW5nIHJpbmcuICBBbnkgb3RoZXIgYXBwbGljYXRpb24gd2lsbCBzdG9wIHJlY2VpdmluZyBldmVudHMgaWYgaXQKICAgICBpbnN0YWxsZWQgaXRzIHJpbmdzIGVhcmxpZXIuCiAKJiM0MzsgICAgRm9yIGEgcmluZyBidWZmZXIgbWFwLCBjb25zdW1lIHJlY29yZHMgc3VibWl0dGVkIGJ5IEJQRiBwcm9ncmFtcywgaW5jbHVkaW5nCiYjNDM7ICAgIHJlY29yZHMgYWxyZWFkeSBxdWV1ZWQgYmVmb3JlIHRoZSBjb21tYW5kIHN0YXJ0cy4gKipjcHUqKiBhbmQgKippbmRleCoqCiYjNDM7ICAgIGFyZSBub3Qgc3VwcG9ydGVkLiBFYWNoIHJlY29yZCBpcyBwcmludGVkIGFzIHJhdyBieXRlcywgaW5jbHVkaW5nIGVtYmVkZGVkCiYjNDM7ICAgIHplcm8gYnl0ZXMuIFBsYWluIG91dHB1dCByZXBvcnRzIHRoZSByZWNvcmQgc2l6ZSBmb2xsb3dlZCBieSBoZXhhZGVjaW1hbAomIzQzOyAgICBieXRlczsgSlNPTiBvdXRwdXQgY29udGFpbnMgKipzaXplKiogYW5kICoqZGF0YSoqIGZpZWxkcywgd2l0aCAqKmRhdGEqKiBhbgomIzQzOyAgICBhcnJheSBvZiBieXRlIHZhbHVlcy4gUmluZyBidWZmZXIgcmVjb3JkcyBoYXZlIG5vIGltcGxpY2l0IENQVSBvciB0aW1lc3RhbXAuCiYjNDM7CiYjNDM7ICAgIFJpbmcgYnVmZmVycyBzdXBwb3J0IGEgc2luZ2xlIGNvbnN1bWVyLiBUaGlzIGNvbW1hbmQgYWR2YW5jZXMgdGhlIHNoYXJlZAomIzQzOyAgICBjb25zdW1lciBwb3NpdGlvbiBhbmQgbXVzdCBub3QgcnVuIGFsb25nc2lkZSBhbm90aGVyIGNvbnN1bWVyIG9mIHRoZSBzYW1lCiYjNDM7ICAgIG1hcDsgaXQgZG9lcyBub3QgcHJvdmlkZSBhIHBhc3NpdmUgdmlldyBvZiBldmVudHMuICoqQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRioqCiYjNDM7ICAgIG1hcHMgYXJlIG5vdCBzdXBwb3J0ZWQuCiYjNDM7CiBicGZ0b29sIG1hcCBwZWVrICAqTUFQKgogICAgIFBlZWsgbmV4dCB2YWx1ZSBpbiB0aGUgcXVldWUgb3Igc3RhY2suCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wKaW5kZXggNzVjYmNiNTEyZWJhZS4uMTc1MGI0ODhjOWUzYiAxMDA2NDQKLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wKQEAgLTg3OCwxMSAmIzQzOzg3OCwxMSBAQCBfYnBmdG9vbCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgICAgICAgICAgICAgaWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgcGVyZl9ldmVudF9hcnJheQomIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX2lkc19mb3JfdHlwZSAmIzM5OyYjMzQ7dHlwZSYjMzQ7OiAmIzM0O1wocGVyZl9ldmVudF9hcnJheVx8cmluZ2J1ZlwpJiMzNDsmIzM5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9uYW1lc19mb3JfdHlwZSBwZXJmX2V2ZW50X2FycmF5CiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfbmFtZXNfZm9yX3R5cGUgJiMzOTsmIzM0O3R5cGUmIzM0OzogJiMzNDtcKHBlcmZfZXZlbnRfYXJyYXlcfHJpbmdidWZcKSYjMzQ7JiMzOTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgICAgICAgICAgICAgICBjcHUpCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMKaW5kZXggYmNiNzY3ZTJkNjczMy4uN2Q1NTUzMzFmNDQzYSAxMDA2NDQKLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYwpAQCAtMjcsNyAmIzQzOzI3LDcgQEAKIAogI2RlZmluZSBNTUFQX1BBR0VfQ05UCTE2CiAKLXN0YXRpYyB2b2xhdGlsZSBib29sIHN0b3A7CiYjNDM7c3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBzdG9wOwogCiBzdHJ1Y3QgcGVyZl9ldmVudF9zYW1wbGUgewogCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciBoZWFkZXI7CkBAIC00NCw3ICYjNDM7NDQsNiBAQCBzdHJ1Y3QgcGVyZl9ldmVudF9sb3N0IHsKIAogc3RhdGljIHZvaWQgaW50X2V4aXQoaW50IHNpZ25vKQogewotCWZwcmludGYoc3RkZXJyLCAmIzM0O1N0b3BwaW5nLi4uXG4mIzM0Oyk7CiAJc3RvcCA9IHRydWU7CiB9CiAKQEAgLTEwNyw2ICYjNDM7MTA2LDI3IEBAIHByaW50X2JwZl9vdXRwdXQodm9pZCAqcHJpdmF0ZV9kYXRhLCBpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgKmV2ZW50KQogCXJldHVybiBMSUJCUEZfUEVSRl9FVkVOVF9DT05UOwogfQogCiYjNDM7c3RhdGljIGludCBwcmludF9yaW5nYnVmX291dHB1dCh2b2lkICpjdHgsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQomIzQzO3sKJiM0MzsJaWYgKGpzb25fb3V0cHV0KSB7CiYjNDM7CQlqc29ud19zdGFydF9vYmplY3QoanNvbl93dHIpOwomIzQzOwkJanNvbndfdWludF9maWVsZChqc29uX3d0ciwgJiMzNDtzaXplJiMzNDssIHNpemUpOwomIzQzOwkJanNvbndfbmFtZShqc29uX3d0ciwgJiMzNDtkYXRhJiMzNDspOwomIzQzOwkJcHJpbnRfZGF0YV9qc29uKGRhdGEsIHNpemUpOwomIzQzOwkJanNvbndfZW5kX29iamVjdChqc29uX3d0cik7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlwcmludGYoJiMzNDs9PSBzaXplOiAlenUgPT09PT1cbiYjMzQ7LCBzaXplKTsKJiM0MzsJCWZwcmludF9oZXgoc3Rkb3V0LCBkYXRhLCBzaXplLCAmIzM0OyAmIzM0Oyk7CiYjNDM7CQlwcmludGYoJiMzNDtcbiYjMzQ7KTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZmZsdXNoKHN0ZG91dCkpCiYjNDM7CQlyZXR1cm4gZXJybm8gPyAtZXJybm8gOiAtRUlPOwomIzQzOwomIzQzOwkvKiBBIHByb2R1Y2VyIGNhbiBrZWVwIHBvbGwoKSBidXN5IGV2ZW4gYWZ0ZXIgYSBzaWduYWwgYXJyaXZlcy4gKi8KJiM0MzsJcmV0dXJuIHN0b3AgPyAtRUlOVFIgOiAwOwomIzQzO30KJiM0MzsKIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIHBlcmZfYXR0ciA9IHsKQEAgLTEyMywxOCAmIzQzOzE0MywyNiBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCS5jcHUgPSAtMSwKIAkJLmlkeCA9IC0xLAogCX07Ci0Jc3RydWN0IHBlcmZfYnVmZmVyICpwYjsKJiM0MzsJc3RydWN0IHBlcmZfYnVmZmVyICpwYiA9IE5VTEw7CiYjNDM7CXN0cnVjdCByaW5nX2J1ZmZlciAqcmIgPSBOVUxMOwogCV9fdTMyIG1hcF9pbmZvX2xlbjsKIAlpbnQgZXJyLCBtYXBfZmQ7CiAKJiM0MzsJc3RvcCA9IGZhbHNlOwogCW1hcF9pbmZvX2xlbiA9IHNpemVvZihtYXBfaW5mbyk7CiAJbWFwX2ZkID0gbWFwX3BhcnNlX2ZkX2FuZF9pbmZvKCZhbXA7YXJnYywgJmFtcDthcmd2LCAmYW1wO21hcF9pbmZvLCAmYW1wO21hcF9pbmZvX2xlbiwKIAkJCQkgICAgICAgMCk7CiAJaWYgKG1hcF9mZCAmbHQ7IDApCiAJCXJldHVybiAtMTsKIAotCWlmIChtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKSB7Ci0JCXBfZXJyKCYjMzQ7bWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkmIzM0Oyk7CiYjNDM7CWlmIChtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZICZhbXA7JmFtcDsKJiM0MzsJICAgIG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1JJTkdCVUYpIHsKJiM0MzsJCXBfZXJyKCYjMzQ7bWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXImIzM0Oyk7CiYjNDM7CQlnb3RvIGVycl9jbG9zZV9tYXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG1hcF9pbmZvLnR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgJmFtcDsmYW1wOyBhcmdjKSB7CiYjNDM7CQlwX2VycigmIzM0O3JpbmcgYnVmZmVyIG1hcHMgZG8gbm90IHN1cHBvcnQgY3B1IG9yIGluZGV4IGFyZ3VtZW50cyYjMzQ7KTsKIAkJZ290byBlcnJfY2xvc2VfbWFwOwogCX0KIApAQCAtMTg0LDE1ICYjNDM7MjEyLDI0IEBAIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJY3R4LmlkeCA9IDA7CiAJfQogCi0Jb3B0cy5jcHVfY250ID0gY3R4LmFsbF9jcHVzID8gMCA6IDE7Ci0Jb3B0cy5jcHVzID0gJmFtcDtjdHguY3B1OwotCW9wdHMubWFwX2tleXMgPSAmYW1wO2N0eC5pZHg7Ci0JcGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsICZhbXA7cGVyZl9hdHRyLAotCQkJCSAgcHJpbnRfYnBmX291dHB1dCwgJmFtcDtjdHgsICZhbXA7b3B0cyk7Ci0JaWYgKCFwYikgewotCQlwX2VycigmIzM0O2ZhaWxlZCB0byBjcmVhdGUgcGVyZiBidWZmZXI6ICVzICglZCkmIzM0OywKLQkJICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7Ci0JCWdvdG8gZXJyX2Nsb3NlX21hcDsKJiM0MzsJaWYgKG1hcF9pbmZvLnR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYpIHsKJiM0MzsJCXJiID0gcmluZ19idWZmZXJfX25ldyhtYXBfZmQsIHByaW50X3JpbmdidWZfb3V0cHV0LCBOVUxMLCBOVUxMKTsKJiM0MzsJCWlmICghcmIpIHsKJiM0MzsJCQlwX2VycigmIzM0O2ZhaWxlZCB0byBjcmVhdGUgcmluZyBidWZmZXI6ICVzICglZCkmIzM0OywKJiM0MzsJCQkgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTsKJiM0MzsJCQlnb3RvIGVycl9jbG9zZV9tYXA7CiYjNDM7CQl9CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlvcHRzLmNwdV9jbnQgPSBjdHguYWxsX2NwdXMgPyAwIDogMTsKJiM0MzsJCW9wdHMuY3B1cyA9ICZhbXA7Y3R4LmNwdTsKJiM0MzsJCW9wdHMubWFwX2tleXMgPSAmYW1wO2N0eC5pZHg7CiYjNDM7CQlwYiA9IHBlcmZfYnVmZmVyX19uZXdfcmF3KG1hcF9mZCwgTU1BUF9QQUdFX0NOVCwgJmFtcDtwZXJmX2F0dHIsCiYjNDM7CQkJCQkgIHByaW50X2JwZl9vdXRwdXQsICZhbXA7Y3R4LCAmYW1wO29wdHMpOwomIzQzOwkJaWYgKCFwYikgewomIzQzOwkJCXBfZXJyKCYjMzQ7ZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGJ1ZmZlcjogJXMgKCVkKSYjMzQ7LAomIzQzOwkJCSAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pOwomIzQzOwkJCWdvdG8gZXJyX2Nsb3NlX21hcDsKJiM0MzsJCX0KIAl9CiAKIAlzaWduYWwoU0lHSU5ULCBpbnRfZXhpdCk7CkBAIC0yMDIsMjUgJiM0MzsyMzksMzMgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCWlmIChqc29uX291dHB1dCkKIAkJanNvbndfc3RhcnRfYXJyYXkoanNvbl93dHIpOwogCiYjNDM7CWVyciA9IDA7CiAJd2hpbGUgKCFzdG9wKSB7Ci0JCWVyciA9IHBlcmZfYnVmZmVyX19wb2xsKHBiLCAyMDApOwomIzQzOwkJZXJyID0gcmIgPyByaW5nX2J1ZmZlcl9fcG9sbChyYiwgMjAwKSA6IHBlcmZfYnVmZmVyX19wb2xsKHBiLCAyMDApOwogCQlpZiAoZXJyICZsdDsgMCAmYW1wOyZhbXA7IGVyciAhPSAtRUlOVFIpIHsKLQkJCXBfZXJyKCYjMzQ7cGVyZiBidWZmZXIgcG9sbGluZyBmYWlsZWQ6ICVzICglZCkmIzM0OywKLQkJCSAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pOwotCQkJZ290byBlcnJfY2xvc2VfcGI7CiYjNDM7CQkJZnByaW50ZihzdGRlcnIsICYjMzQ7RXJyb3I6ICVzIGJ1ZmZlciBwb2xsaW5nIGZhaWxlZDogJXMgKCVkKVxuJiMzNDssCiYjNDM7CQkJCXJiID8gJiMzNDtyaW5nJiMzNDsgOiAmIzM0O3BlcmYmIzM0Oywgc3RyZXJyb3IoLWVyciksIC1lcnIpOwomIzQzOwkJCWJyZWFrOwogCQl9CiYjNDM7CQllcnIgPSAwOwogCX0KIAomIzQzOwlpZiAoc3RvcCkKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0O1N0b3BwaW5nLi4uXG4mIzM0Oyk7CiAJaWYgKGpzb25fb3V0cHV0KQogCQlqc29ud19lbmRfYXJyYXkoanNvbl93dHIpOwomIzQzOwlpZiAoZmZsdXNoKHN0ZG91dCkpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0O0Vycm9yOiBmYWlsZWQgdG8gd3JpdGUgZXZlbnRzOiAlc1xuJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CQllcnIgPSAtMTsKJiM0MzsJfQogCiYjNDM7CXJpbmdfYnVmZmVyX19mcmVlKHJiKTsKIAlwZXJmX2J1ZmZlcl9fZnJlZShwYik7CiYjNDM7CS8qIEJvdGggYnVmZmVyIG1hbmFnZXJzIGJvcnJvdyBtYXBfZmQuICovCiAJY2xvc2UobWFwX2ZkKTsKIAotCXJldHVybiAwOwomIzQzOwlyZXR1cm4gZXJyICZsdDsgMCA/IC0xIDogMDsKIAotZXJyX2Nsb3NlX3BiOgotCXBlcmZfYnVmZmVyX19mcmVlKHBiKTsKIGVycl9jbG9zZV9tYXA6CiAJY2xvc2UobWFwX2ZkKTsKIAlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjIwOTliZjEwMjA5MzAKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuYwpAQCAtMCwwICYjNDM7MSwzODEgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOyNpbmNsdWRlICZsdDtjdHlwZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtwb2xsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3NpZ25hbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvbW1hbi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvd2FpdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZ0b29sX3JpbmdidWYuc2tlbC5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIFdBSVRfU1RFUFMgNTAwCiYjNDM7I2RlZmluZSBXQUlUX1VTIDEwMDAwCiYjNDM7CiYjNDM7c3RydWN0IGNvbnN1bWVyIHsKJiM0MzsJcGlkX3QgcGlkOwomIzQzOwlpbnQgZmQ7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgY29uc3QgY2hhciAqYnBmdG9vbF9wYXRoKHZvaWQpCiYjNDM7ewomIzQzOwljb25zdCBjaGFyICpwYXRoID0gZ2V0ZW52KCYjMzQ7QlBGVE9PTCYjMzQ7KTsKJiM0MzsKJiM0MzsJaWYgKHBhdGgpCiYjNDM7CQlyZXR1cm4gYWNjZXNzKHBhdGgsIFhfT0spID8gTlVMTCA6IHBhdGg7CiYjNDM7CWlmICghYWNjZXNzKCYjMzQ7Li90b29scy9zYmluL2JwZnRvb2wmIzM0OywgWF9PSykpCiYjNDM7CQlyZXR1cm4gJiMzNDsuL3Rvb2xzL3NiaW4vYnBmdG9vbCYjMzQ7OwomIzQzOwlpZiAoIWFjY2VzcygmIzM0Oy4uL3Rvb2xzL3NiaW4vYnBmdG9vbCYjMzQ7LCBYX09LKSkKJiM0MzsJCXJldHVybiAmIzM0Oy4uL3Rvb2xzL3NiaW4vYnBmdG9vbCYjMzQ7OwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY29uc3VtZXJfY2xlYW51cChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkKQomIzQzO3sKJiM0MzsJaWYgKGNoaWxkLSZndDtwaWQgJmd0OyAwKSB7CiYjNDM7CQlraWxsKGNoaWxkLSZndDtwaWQsIFNJR0tJTEwpOwomIzQzOwkJd2hpbGUgKHdhaXRwaWQoY2hpbGQtJmd0O3BpZCwgTlVMTCwgMCkgJmx0OyAwICZhbXA7JmFtcDsgZXJybm8gPT0gRUlOVFIpCiYjNDM7CQkJOwomIzQzOwkJY2hpbGQtJmd0O3BpZCA9IC0xOwomIzQzOwl9CiYjNDM7CWlmIChjaGlsZC0mZ3Q7ZmQgJmd0Oz0gMCkgewomIzQzOwkJY2xvc2UoY2hpbGQtJmd0O2ZkKTsKJiM0MzsJCWNoaWxkLSZndDtmZCA9IC0xOwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIGNvbnN1bWVyX3N0YXJ0KHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBtYXBfZmQsIGJvb2wganNvbiwKJiM0MzsJCQkgICBjb25zdCBjaGFyICpvcHRpb24sIGJvb2wgcGFpciwgYm9vbCBjYXB0dXJlX2Vycm9ycykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9OwomIzQzOwlfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7CiYjNDM7CWNvbnN0IGNoYXIgKnBhdGggPSBicGZ0b29sX3BhdGgoKTsKJiM0MzsJY2hhciAqYXJndlsxMl0sIGlkWzE2XTsKJiM0MzsJaW50IG91dFsyXSwgcmVhZHlbMl0sIG4gPSAwLCBlcnIsIGVycl9mZDsKJiM0MzsJc3RydWN0IHBvbGxmZCBwZmQ7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihwYXRoLCAmIzM0O2JwZnRvb2wgcGF0aCAoc2V0IEJQRlRPT0wgdG8gb3ZlcnJpZGUpJiMzNDspIHx8CiYjNDM7CSAgICAhQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQobWFwX2ZkLCAmYW1wO2luZm8sICZhbXA7bGVuKSwgJiMzNDttYXAgaW5mbyYjMzQ7KSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJc25wcmludGYoaWQsIHNpemVvZihpZCksICYjMzQ7JXUmIzM0OywgaW5mby5pZCk7CiYjNDM7CWFyZ3ZbbiYjNDM7JiM0MztdID0gKGNoYXIgKilwYXRoOwomIzQzOwlpZiAoanNvbikKJiM0MzsJCWFyZ3ZbbiYjNDM7JiM0MztdID0gJiMzNDstaiYjMzQ7OwomIzQzOwlhcmd2W24mIzQzOyYjNDM7XSA9ICYjMzQ7bWFwJiMzNDs7CiYjNDM7CWFyZ3ZbbiYjNDM7JiM0MztdID0gJiMzNDtldmVudF9waXBlJiMzNDs7CiYjNDM7CWFyZ3ZbbiYjNDM7JiM0MztdID0gJiMzNDtpZCYjMzQ7OwomIzQzOwlhcmd2W24mIzQzOyYjNDM7XSA9IGlkOwomIzQzOwlpZiAob3B0aW9uKSB7CiYjNDM7CQlhcmd2W24mIzQzOyYjNDM7XSA9IChjaGFyICopb3B0aW9uOwomIzQzOwkJYXJndltuJiM0MzsmIzQzO10gPSAmIzM0OzAmIzM0OzsKJiM0MzsJCWlmIChwYWlyKSB7CiYjNDM7CQkJYXJndltuJiM0MzsmIzQzO10gPSAmIzM0O2luZGV4JiMzNDs7CiYjNDM7CQkJYXJndltuJiM0MzsmIzQzO10gPSAmIzM0OzAmIzM0OzsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlhcmd2W25dID0gTlVMTDsKJiM0MzsJaWYgKCFBU1NFUlRfT0socGlwZTIob3V0LCBPX0NMT0VYRUMpLCAmIzM0O291dHB1dCBwaXBlJiMzNDspKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhwaXBlMihyZWFkeSwgT19DTE9FWEVDKSwgJiMzNDtleGVjIHBpcGUmIzM0OykpIHsKJiM0MzsJCWNsb3NlKG91dFswXSk7CiYjNDM7CQljbG9zZShvdXRbMV0pOwomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CWNoaWxkLSZndDtwaWQgPSBmb3JrKCk7CiYjNDM7CWlmICghY2hpbGQtJmd0O3BpZCkgewomIzQzOwkJY2xvc2Uob3V0WzBdKTsKJiM0MzsJCWNsb3NlKHJlYWR5WzBdKTsKJiM0MzsJCWVycl9mZCA9IGNhcHR1cmVfZXJyb3JzID8gb3V0WzFdIDogb3BlbigmIzM0Oy9kZXYvbnVsbCYjMzQ7LCBPX1dST05MWSk7CiYjNDM7CQlpZiAoZHVwMihvdXRbMV0sIFNURE9VVF9GSUxFTk8pICZsdDsgMCB8fAomIzQzOwkJICAgIGR1cDIoZXJyX2ZkLCBTVERFUlJfRklMRU5PKSAmbHQ7IDApCiYjNDM7CQkJZ290byBleGVjX2ZhaWw7CiYjNDM7CQlpZiAoIWNhcHR1cmVfZXJyb3JzKQomIzQzOwkJCWNsb3NlKGVycl9mZCk7CiYjNDM7CQljbG9zZShvdXRbMV0pOwomIzQzOwkJZXhlY3YocGF0aCwgYXJndik7CiYjNDM7ZXhlY19mYWlsOgomIzQzOwkJZXJyID0gZXJybm87CiYjNDM7CQl3cml0ZShyZWFkeVsxXSwgJmFtcDtlcnIsIHNpemVvZihlcnIpKTsKJiM0MzsJCV9leGl0KDEyNyk7CiYjNDM7CX0KJiM0MzsJY2xvc2Uob3V0WzFdKTsKJiM0MzsJY2xvc2UocmVhZHlbMV0pOwomIzQzOwljaGlsZC0mZ3Q7ZmQgPSBvdXRbMF07CiYjNDM7CXBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IHJlYWR5WzBdLCAuZXZlbnRzID0gUE9MTElOIH07CiYjNDM7CS8qIEVPRiBvbiB0aGUgY2xvc2Utb24tZXhlYyBwaXBlIGRpc3Rpbmd1aXNoZXMgZXhlYyBmcm9tIGluaGVyaXRlZCBoYW5kbGVycy4gKi8KJiM0MzsJZXJyID0gY2hpbGQtJmd0O3BpZCAmZ3Q7IDAgPyBwb2xsKCZhbXA7cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApIDogLTE7CiYjNDM7CWlmICghQVNTRVJUX0dUKGNoaWxkLSZndDtwaWQsIDAsICYjMzQ7Zm9yayYjMzQ7KSB8fAomIzQzOwkgICAgIUFTU0VSVF9HVChlcnIsIDAsICYjMzQ7ZXhlYyB0aW1lb3V0JiMzNDspIHx8CiYjNDM7CSAgICAhQVNTRVJUX0VRKHJlYWQocmVhZHlbMF0sICZhbXA7ZXJyLCBzaXplb2YoZXJyKSksIDAsICYjMzQ7ZXhlYyYjMzQ7KSkgewomIzQzOwkJY2xvc2UocmVhZHlbMF0pOwomIzQzOwkJY29uc3VtZXJfY2xlYW51cChjaGlsZCk7CiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsJY2xvc2UocmVhZHlbMF0pOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZXJfZmluaXNoKHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBzaWdubywgYm9vbCBzdWNjZXNzLAomIzQzOwkJCSAgICBjaGFyICpvdXRwdXQsIHNpemVfdCBzaXplKQomIzQzO3sKJiM0MzsJaW50IHN0YXR1cyA9IDAsIGk7CiYjNDM7CXBpZF90IHJldCA9IDA7CiYjNDM7CXNzaXplX3QgbjsKJiM0MzsJc2l6ZV90IHVzZWQgPSAwOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhmY250bChjaGlsZC0mZ3Q7ZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spLCAmIzM0O25vbmJsb2NraW5nIG91dHB1dCYjMzQ7KSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJaWYgKHNpZ25vICZhbXA7JmFtcDsgIUFTU0VSVF9PSyhraWxsKGNoaWxkLSZndDtwaWQsIHNpZ25vKSwgJiMzNDtzaWduYWwgY29uc3VtZXImIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBXQUlUX1NURVBTOyBpJiM0MzsmIzQzOykgewomIzQzOwkJd2hpbGUgKHVzZWQgJmx0OyBzaXplIC0gMSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgICAgKG4gPSByZWFkKGNoaWxkLSZndDtmZCwgb3V0cHV0ICYjNDM7IHVzZWQsIHNpemUgLSAxIC0gdXNlZCkpICZndDsgMCkKJiM0MzsJCQl1c2VkICYjNDM7PSBuOwomIzQzOwkJcmV0ID0gd2FpdHBpZChjaGlsZC0mZ3Q7cGlkLCAmYW1wO3N0YXR1cywgV05PSEFORyk7CiYjNDM7CQlpZiAocmV0ID09IGNoaWxkLSZndDtwaWQpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlpZiAocmV0ICZsdDsgMCAmYW1wOyZhbXA7IGVycm5vICE9IEVJTlRSKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJdXNsZWVwKFdBSVRfVVMpOwomIzQzOwl9CiYjNDM7CWlmICghQVNTRVJUX0VRKHJldCwgY2hpbGQtJmd0O3BpZCwgJiMzNDtib3VuZGVkIGNvbnN1bWVyIGV4aXQmIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CWNoaWxkLSZndDtwaWQgPSAtMTsKJiM0MzsJd2hpbGUgKHVzZWQgJmx0OyBzaXplIC0gMSAmYW1wOyZhbXA7IChuID0gcmVhZChjaGlsZC0mZ3Q7ZmQsIG91dHB1dCAmIzQzOyB1c2VkLCBzaXplIC0gMSAtIHVzZWQpKSAmZ3Q7IDApCiYjNDM7CQl1c2VkICYjNDM7PSBuOwomIzQzOwlvdXRwdXRbdXNlZF0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CXJldHVybiBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtub3JtYWwgZXhpdCYjMzQ7KSAmYW1wOyZhbXA7CiYjNDM7CSAgICAgICBBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSA9PSAwLCBzdWNjZXNzLCAmIzM0O2V4aXQgc3RhdHVzJiMzNDspOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBjb25zdW1lcl9yZWFkeShzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBsb25nIGNhdWdodDsKJiM0MzsJY2hhciBwYXRoWzY0XSwgbGluZVsyNTZdOwomIzQzOwlpbnQgaTsKJiM0MzsJRklMRSAqZjsKJiM0MzsKJiM0MzsJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAmIzM0Oy9wcm9jLyVkL3N0YXR1cyYjMzQ7LCBjaGlsZC0mZ3Q7cGlkKTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFdBSVRfU1RFUFM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlmID0gZm9wZW4ocGF0aCwgJiMzNDtyJiMzNDspOwomIzQzOwkJaWYgKCFmKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHsKJiM0MzsJCQlpZiAoc3NjYW5mKGxpbmUsICYjMzQ7U2lnQ2d0OiAlbGx4JiMzNDssICZhbXA7Y2F1Z2h0KSA9PSAxICZhbXA7JmFtcDsKJiM0MzsJCQkgICAgKGNhdWdodCAmYW1wOyAoMVVMTCAmbHQ7Jmx0OyAoU0lHSU5UIC0gMSkpKSAmYW1wOyZhbXA7CiYjNDM7CQkJICAgIChjYXVnaHQgJmFtcDsgKDFVTEwgJmx0OyZsdDsgKFNJR1RFUk0gLSAxKSkpKSB7CiYjNDM7CQkJCWZjbG9zZShmKTsKJiM0MzsJCQkJcmV0dXJuIHRydWU7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwkJZmNsb3NlKGYpOwomIzQzOwkJdXNsZWVwKFdBSVRfVVMpOwomIzQzOwl9CiYjNDM7CXJldHVybiBBU1NFUlRfVFJVRShmYWxzZSwgJiMzNDtjb25zdW1lciBzaWduYWwgaGFuZGxlcnMgcmVhZHkmIzM0Oyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIGVtaXRfcmVjb3JkKHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWwsIGludCByZWNvcmQpCiYjNDM7ewomIzQzOwljaGFyIHBhY2tldFs2NF0gPSB7fTsKJiM0MzsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMsCiYjNDM7CQkgICAgLmRhdGFfaW4gPSBwYWNrZXQsCiYjNDM7CQkgICAgLmRhdGFfc2l6ZV9pbiA9IHNpemVvZihwYWNrZXQpLAomIzQzOwkpOwomIzQzOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3JlY29yZCA9IHJlY29yZDsKJiM0MzsJcmV0dXJuIEFTU0VSVF9PSyhicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy5wcm9kdWNlKSwKJiM0MzsJCQkJCSAgICAgICZhbXA7b3B0cyksICYjMzQ7cHJvZHVjZSByZWNvcmQmIzM0OykgJmFtcDsmYW1wOwomIzQzOwkgICAgICAgQVNTRVJUX09LKHNrZWwtJmd0O2Jzcy0mZ3Q7b3V0cHV0X2VyciwgJiMzNDtyaW5nYnVmIG91dHB1dCYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZWQodW5zaWduZWQgbG9uZyAqcG9zaXRpb24sIHVuc2lnbmVkIGxvbmcgZXhwZWN0ZWQpCiYjNDM7ewomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFdBSVRfU1RFUFM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoX19hdG9taWNfbG9hZF9uKHBvc2l0aW9uLCBfX0FUT01JQ19BQ1FVSVJFKSA9PSBleHBlY3RlZCkKJiM0MzsJCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJCXVzbGVlcChXQUlUX1VTKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gQVNTRVJUX0VRKCpwb3NpdGlvbiwgZXhwZWN0ZWQsICYjMzQ7Y29uc3VtZXIgcG9zaXRpb24mIzM0Oyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNoZWNrX2pzb24oY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICpleHBlY3RlZCkKJiM0Mzt7CiYjNDM7CWNoYXIgKnNyYyA9IG91dHB1dCwgKmRzdCA9IG91dHB1dDsKJiM0MzsJYm9vbCBxdW90ZWQgPSBmYWxzZSwgZXNjYXBlZCA9IGZhbHNlOwomIzQzOwomIzQzOwkvKiBJZ25vcmUgZm9ybWF0dGluZyB3aGl0ZXNwYWNlIHdoaWxlIGNoZWNraW5nIHRoZSBlbnRpcmUgSlNPTiBkb2N1bWVudC4gKi8KJiM0MzsJd2hpbGUgKCpzcmMpIHsKJiM0MzsJCWlmIChxdW90ZWQgfHwgIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnNyYykpCiYjNDM7CQkJKmRzdCYjNDM7JiM0MzsgPSAqc3JjOwomIzQzOwkJaWYgKCFlc2NhcGVkICZhbXA7JmFtcDsgKnNyYyA9PSAmIzM5OyYjMzQ7JiMzOTspCiYjNDM7CQkJcXVvdGVkID0gIXF1b3RlZDsKJiM0MzsJCWVzY2FwZWQgPSAhZXNjYXBlZCAmYW1wOyZhbXA7IHF1b3RlZCAmYW1wOyZhbXA7ICpzcmMgPT0gJiMzOTtcXCYjMzk7OwomIzQzOwkJc3JjJiM0MzsmIzQzOzsKJiM0MzsJfQomIzQzOwkqZHN0ID0gJiMzOTtcMCYjMzk7OwomIzQzOwlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtKU09OIHJlY29yZHMmIzM0Oyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfY29uc3VtZXIoYm9vbCBqc29uLCBib29sIGlkbGUsIGludCBzaWdubykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9OwomIzQzOwlzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsOwomIzQzOwl1bnNpZ25lZCBsb25nICpwb3NpdGlvbiA9IE1BUF9GQUlMRUQ7CiYjNDM7CWludCBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpLCBmZDsKJiM0MzsJY2hhciBvdXRwdXRbNDA5Nl07CiYjNDM7CXN0cnVjdCBwb2xsZmQgcGZkOwomIzQzOwomIzQzOwlza2VsID0gYnBmdG9vbF9yaW5nYnVmX19vcGVuKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O29wZW4mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLSZndDttYXBzLnJpbmdidWYsIHBhZ2Vfc2l6ZSk7CiYjNDM7CWlmICghQVNTRVJUX09LKGJwZnRvb2xfcmluZ2J1Zl9fbG9hZChza2VsKSwgJiMzNDtsb2FkJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWZkID0gYnBmX21hcF9fZmQoc2tlbC0mZ3Q7bWFwcy5yaW5nYnVmKTsKJiM0MzsJcG9zaXRpb24gPSBtbWFwKE5VTEwsIHBhZ2Vfc2l6ZSwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBmZCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX05FUShwb3NpdGlvbiwgTUFQX0ZBSUxFRCwgJiMzNDtjb25zdW1lciBtbWFwJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghaWRsZSAmYW1wOyZhbXA7ICghZW1pdF9yZWNvcmQoc2tlbCwgMCkgfHwgIWVtaXRfcmVjb3JkKHNrZWwsIDEpKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZiAoIWNvbnN1bWVyX3N0YXJ0KCZhbXA7Y2hpbGQsIGZkLCBqc29uLCBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8CiYjNDM7CSAgICAhY29uc3VtZXJfcmVhZHkoJmFtcDtjaGlsZCkpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFpZGxlKSB7CiYjNDM7CQkvKiBCb3RoIHByZWZpbGxlZCByZWNvcmRzIG9jY3VweSAxNiBieXRlcyBpbmNsdWRpbmcgdGhlaXIgaGVhZGVycy4gKi8KJiM0MzsJCWlmICghY29uc3VtZWQocG9zaXRpb24sIDMyKSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCXBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IGNoaWxkLmZkLCAuZXZlbnRzID0gUE9MTElOIH07CiYjNDM7CQlpZiAoIUFTU0VSVF9HVChwb2xsKCZhbXA7cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApLCAwLAomIzQzOwkJCSAgICAgICAmIzM0O3JlY29yZHMgZmx1c2hlZCBiZWZvcmUgZXhpdCYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyAmYW1wOyBQT0xMSU4sICYjMzQ7cmVjb3JkIG91dHB1dCByZWFkYWJsZSYjMzQ7KSB8fAomIzQzOwkJICAgICFlbWl0X3JlY29yZChza2VsLCAyKSB8fCAhY29uc3VtZWQocG9zaXRpb24sIDY0KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlpZiAoIWNvbnN1bWVyX2ZpbmlzaCgmYW1wO2NoaWxkLCBzaWdubywgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKGpzb24pCiYjNDM7CQljaGVja19qc29uKG91dHB1dCwgaWRsZSA/ICYjMzQ7W10mIzM0OyA6CiYjNDM7CQkJICAgJiMzNDtbe1wmIzM0O3NpemVcJiMzNDs6MixcJiMzNDtkYXRhXCYjMzQ7OlswLDI1NV19LCYjMzQ7CiYjNDM7CQkJICAgJiMzNDt7XCYjMzQ7c2l6ZVwmIzM0Ozo1LFwmIzM0O2RhdGFcJiMzNDs6WzEsMiwzLDQsNV19LCYjMzQ7CiYjNDM7CQkJICAgJiMzNDt7XCYjMzQ7c2l6ZVwmIzM0OzoxNyxcJiMzNDtkYXRhXCYjMzQ7OlsxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywmIzM0OwomIzQzOwkJCSAgICYjMzQ7MjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzJdfV0mIzM0Oyk7CiYjNDM7CWVsc2UKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyAmIzM0OyYjMzQ7IDoKJiM0MzsJCQkgICAgICYjMzQ7PT0gc2l6ZTogMiA9PT09PVxuMDAgZmZcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0Oz09IHNpemU6IDUgPT09PT1cbjAxIDAyIDAzIDA0IDA1XG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDs9PSBzaXplOiAxNyA9PT09PVxuMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgICYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OzE4IDE5IDFhIDFiIDFjIDFkIDFlIDFmXG4yMFxuJiMzNDssICYjMzQ7cGxhaW4gcmVjb3JkcyYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWNvbnN1bWVyX2NsZWFudXAoJmFtcDtjaGlsZCk7CiYjNDM7CWlmIChwb3NpdGlvbiAhPSBNQVBfRkFJTEVEKQomIzQzOwkJbXVubWFwKHBvc2l0aW9uLCBwYWdlX3NpemUpOwomIzQzOwlicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfcGVyZl9jb25zdW1lcih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07CiYjNDM7CXVuc2lnbmVkIGxvbmcgbG9uZyBzZWNvbmRzLCBuYW5vc2Vjb25kczsKJiM0MzsJc3RydWN0IGJwZnRvb2xfcmluZ2J1ZiAqc2tlbDsKJiM0MzsJY2hhciBvdXRwdXRbMTYzODRdLCBleHBlY3RlZFsxNjM4NF07CiYjNDM7CWludCBucl9jcHVzLCBjcHUsIGluZGV4LCBvZmZzZXQgPSAwLCBpLCB1c2VkID0gMCwgZmllbGRzOwomIzQzOwlzdHJ1Y3QgcG9sbGZkIHBmZDsKJiM0MzsKJiM0MzsJbnJfY3B1cyA9IGxpYmJwZl9udW1fcG9zc2libGVfY3B1cygpOwomIzQzOwlpZiAoIUFTU0VSVF9HVChucl9jcHVzLCAwLCAmIzM0O3Bvc3NpYmxlIGNwdXMmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CXNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsICYjMzQ7b3BlbiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJYnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtJmd0O21hcHMucmluZ2J1ZiwgZ2V0cGFnZXNpemUoKSk7CiYjNDM7CWJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLSZndDttYXBzLnBlcmZidWYsIG5yX2NwdXMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhicGZ0b29sX3JpbmdidWZfX2xvYWQoc2tlbCksICYjMzQ7bG9hZCYjMzQ7KSB8fAomIzQzOwkgICAgIWNvbnN1bWVyX3N0YXJ0KCZhbXA7Y2hpbGQsIGJwZl9tYXBfX2ZkKHNrZWwtJmd0O21hcHMucGVyZmJ1ZiksIGZhbHNlLAomIzQzOwkJCSAgICBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8ICFjb25zdW1lcl9yZWFkeSgmYW1wO2NoaWxkKSB8fAomIzQzOwkgICAgIWVtaXRfcmVjb3JkKHNrZWwsIDMpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CS8qIE9uZSBsYXJnZSByZWNvcmQgZmx1c2hlcyB0aGUgZXhpc3RpbmcgYnVmZmVyZWQgcGVyZiBvdXRwdXQgY2FsbGJhY2suICovCiYjNDM7CXBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IGNoaWxkLmZkLCAuZXZlbnRzID0gUE9MTElOIH07CiYjNDM7CWlmICghQVNTRVJUX0dUKHBvbGwoJmFtcDtwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCksIDAsCiYjNDM7CQkgICAgICAgJiMzNDtwZXJmIHJlY29yZCBvdXRwdXQmIzM0OykgfHwKJiM0MzsJICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyAmYW1wOyBQT0xMSU4sICYjMzQ7cGVyZiBvdXRwdXQgcmVhZGFibGUmIzM0OykgfHwKJiM0MzsJICAgICFjb25zdW1lcl9maW5pc2goJmFtcDtjaGlsZCwgU0lHSU5ULCB0cnVlLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmaWVsZHMgPSBzc2NhbmYob3V0cHV0LCAmIzM0Oz09IEAlbGx1LiVsbHUgQ1BVOiAlZCBpbmRleDogJWQgPT09PT1cbiVuJiMzNDssCiYjNDM7CQkJJmFtcDtzZWNvbmRzLCAmYW1wO25hbm9zZWNvbmRzLCAmYW1wO2NwdSwgJmFtcDtpbmRleCwgJmFtcDtvZmZzZXQpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShmaWVsZHMsIDQsICYjMzQ7cGVyZiBoZWFkZXImIzM0OykgfHwKJiM0MzsJICAgICFBU1NFUlRfR1Qob2Zmc2V0LCAwLCAmIzM0O3BlcmYgcGF5bG9hZCBvZmZzZXQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJQVNTRVJUX0dUKHNlY29uZHMgKiAxMDAwMDAwMDAwVUxMICYjNDM7IG5hbm9zZWNvbmRzLCAwLCAmIzM0O3BlcmYgdGltZXN0YW1wJiMzNDspOwomIzQzOwlBU1NFUlRfTFQobmFub3NlY29uZHMsIDEwMDAwMDAwMDBVTEwsICYjMzQ7cGVyZiB0aW1lc3RhbXAgbmFub3NlY29uZHMmIzM0Oyk7CiYjNDM7CUFTU0VSVF9HRShjcHUsIDAsICYjMzQ7cGVyZiBjcHUmIzM0Oyk7CiYjNDM7CUFTU0VSVF9MVChjcHUsIG5yX2NwdXMsICYjMzQ7cGVyZiBjcHUgcmFuZ2UmIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShpbmRleCwgY3B1LCAmIzM0O3BlcmYgaW5kZXgmIzM0Oyk7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBzaXplb2Yoc2tlbC0mZ3Q7cm9kYXRhLSZndDtwZXJmX3BheWxvYWQpOyBpJiM0MzsmIzQzOykgewomIzQzOwkJY29uc3QgY2hhciAqc2VwYXJhdG9yID0gIWkgPyAmIzM0OyYjMzQ7IDogIShpICUgMTYpID8gJiMzNDtcbiYjMzQ7IDoKJiM0MzsJCQkJCSEoaSAlIDgpID8gJiMzNDsgICYjMzQ7IDogJiMzNDsgJiMzNDs7CiYjNDM7CiYjNDM7CQl1c2VkICYjNDM7PSBzbnByaW50ZihleHBlY3RlZCAmIzQzOyB1c2VkLCBzaXplb2YoZXhwZWN0ZWQpIC0gdXNlZCwKJiM0MzsJCQkJICYjMzQ7JXMlMDJ4JiMzNDssIHNlcGFyYXRvciwgaSA9PSAxID8gMHhmZiA6IDApOwomIzQzOwl9CiYjNDM7CXNucHJpbnRmKGV4cGVjdGVkICYjNDM7IHVzZWQsIHNpemVvZihleHBlY3RlZCkgLSB1c2VkLCAmIzM0O1xuJiMzNDspOwomIzQzOwlBU1NFUlRfU1RSRVEob3V0cHV0ICYjNDM7IG9mZnNldCwgZXhwZWN0ZWQsICYjMzQ7cGVyZiBwYXlsb2FkJiMzNDspOwomIzQzO291dDoKJiM0MzsJY29uc3VtZXJfY2xlYW51cCgmYW1wO2NoaWxkKTsKJiM0MzsJYnBmdG9vbF9yaW5nYnVmX19kZXN0cm95KHNrZWwpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3JlamVjdChlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBjb25zdCBjaGFyICpvcHRpb24sIGJvb2wgcGFpciwgYm9vbCBqc29uKQomIzQzO3sKJiM0MzsJc3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07CiYjNDM7CWJvb2wgcmluZyA9IHR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgfHwgdHlwZSA9PSBCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGOwomIzQzOwljb25zdCBjaGFyICpleHBlY3RlZCA9IG9wdGlvbiA/CiYjNDM7CQkmIzM0O3tcJiMzNDtlcnJvclwmIzM0OzpcJiMzNDtyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHNcJiMzNDt9JiMzNDsgOgomIzQzOwkJJiMzNDt7XCYjMzQ7ZXJyb3JcJiMzNDs6XCYjMzQ7bWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcJiMzNDt9JiMzNDs7CiYjNDM7CWNoYXIgb3V0cHV0WzQwOTZdOwomIzQzOwlpbnQgZmQ7CiYjNDM7CiYjNDM7CWZkID0gYnBmX21hcF9jcmVhdGUodHlwZSwgTlVMTCwgcmluZyA/IDAgOiA0LCByaW5nID8gMCA6IDQsCiYjNDM7CQkJICAgIHJpbmcgPyBnZXRwYWdlc2l6ZSgpIDogMSwgTlVMTCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O2NyZWF0ZSBtYXAmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlmIChjb25zdW1lcl9zdGFydCgmYW1wO2NoaWxkLCBmZCwganNvbiwgb3B0aW9uLCBwYWlyLCB0cnVlKSAmYW1wOyZhbXA7CiYjNDM7CSAgICBjb25zdW1lcl9maW5pc2goJmFtcDtjaGlsZCwgMCwgZmFsc2UsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKSB7CiYjNDM7CQlpZiAoanNvbikKJiM0MzsJCQljaGVja19qc29uKG91dHB1dCwgZXhwZWN0ZWQpOwomIzQzOwkJZWxzZQomIzQzOwkJCUFTU0VSVF9HVChzdHJsZW4ob3V0cHV0KSwgMCwgJiMzNDtlcnJvciBkaWFnbm9zdGljJiMzNDspOwomIzQzOwl9CiYjNDM7CWNvbnN1bWVyX2NsZWFudXAoJmFtcDtjaGlsZCk7CiYjNDM7CWNsb3NlKGZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X2JwZnRvb2xfcmluZ2J1Zih2b2lkKQomIzQzO3sKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtwZXJmX2V2ZW50X2FycmF5JiMzNDspKQomIzQzOwkJdGVzdF9wZXJmX2NvbnN1bWVyKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cGxhaW4mIzM0OykpCiYjNDM7CQl0ZXN0X2NvbnN1bWVyKGZhbHNlLCBmYWxzZSwgU0lHSU5UKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtqc29uJiMzNDspKQomIzQzOwkJdGVzdF9jb25zdW1lcih0cnVlLCBmYWxzZSwgU0lHVEVSTSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7aWRsZV9zaWdpbnQmIzM0OykpCiYjNDM7CQl0ZXN0X2NvbnN1bWVyKGZhbHNlLCB0cnVlLCBTSUdJTlQpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2lkbGVfc2lndGVybV9qc29uJiMzNDspKQomIzQzOwkJdGVzdF9jb25zdW1lcih0cnVlLCB0cnVlLCBTSUdURVJNKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtyZWplY3RfYXJyYXkmIzM0OykpCiYjNDM7CQl0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfQVJSQVksIE5VTEwsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmVqZWN0X3VzZXJfcmluZ2J1ZiYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmVqZWN0X2NwdSYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCAmIzM0O2NwdSYjMzQ7LCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JlamVjdF9pbmRleCYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCAmIzM0O2luZGV4JiMzNDssIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmVqZWN0X2NwdV9pbmRleCYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCAmIzM0O2NwdSYjMzQ7LCB0cnVlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmVqZWN0X3VzZXJfcmluZ2J1Zl9qc29uJiMzNDspKQomIzQzOwkJdGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRiwgTlVMTCwgZmFsc2UsIHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JlamVjdF9jcHVfaW5kZXhfanNvbiYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCAmIzM0O2NwdSYjMzQ7LCB0cnVlLCB0cnVlKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uYmJiYzkzYzMwYTgzMwotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9icGZ0b29sX3JpbmdidWYuYwpAQCAtMCwwICYjNDM7MSw0NyBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2JwZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1JJTkdCVUYpOwomIzQzO30gcmluZ2J1ZiBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpOwomIzQzOwlfX3VpbnQoa2V5X3NpemUsIHNpemVvZihfX3UzMikpOwomIzQzOwlfX3VpbnQodmFsdWVfc2l6ZSwgc2l6ZW9mKF9fdTMyKSk7CiYjNDM7CV9fdWludChtYXhfZW50cmllcywgMSk7CiYjNDM7fSBwZXJmYnVmIFNFQygmIzM0Oy5tYXBzJiMzNDspOwomIzQzOwomIzQzOy8qCiYjNDM7ICogSW5jbHVkZSB0aGUgdTMyIHJhdyBzaXplIGluIHBlcmYmIzM5O3MgOC1ieXRlIGFsaWdubWVudCB0byBhdm9pZCBwYWRkaW5nLgomIzQzOyAqIEtlZXAgcGxhaW4gb3V0cHV0IGxhcmdlIGVub3VnaCB0byBmbHVzaCBzdGRpbyBiZWZvcmUgdGhlIGNvbnN1bWVyIGV4aXRzLgomIzQzOyAqLwomIzQzO2NvbnN0IHVuc2lnbmVkIGNoYXIgcGVyZl9wYXlsb2FkWzQwOTJdID0geyAweDAwLCAweGZmIH07CiYjNDM7CiYjNDM7aW50IHJlY29yZDsKJiM0MztpbnQgb3V0cHV0X2VycjsKJiM0MzsKJiM0MztTRUMoJiMzNDtzb2NrZXQmIzM0OykKJiM0MztpbnQgcHJvZHVjZShzdHJ1Y3QgX19za19idWZmICpza2IpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBjaGFyIGZpcnN0W10gPSB7IDB4MDAsIDB4ZmYgfTsKJiM0MzsJdW5zaWduZWQgY2hhciBzZWNvbmRbXSA9IHsgMSwgMiwgMywgNCwgNSB9OwomIzQzOwl1bnNpZ25lZCBjaGFyIHRoaXJkW10gPSB7CiYjNDM7CQkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAomIzQzOwkJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJaWYgKHJlY29yZCA9PSAwKQomIzQzOwkJb3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dCgmYW1wO3JpbmdidWYsIGZpcnN0LCBzaXplb2YoZmlyc3QpLCAwKTsKJiM0MzsJZWxzZSBpZiAocmVjb3JkID09IDEpCiYjNDM7CQlvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KCZhbXA7cmluZ2J1Ziwgc2Vjb25kLCBzaXplb2Yoc2Vjb25kKSwgMCk7CiYjNDM7CWVsc2UgaWYgKHJlY29yZCA9PSAyKQomIzQzOwkJb3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dCgmYW1wO3JpbmdidWYsIHRoaXJkLCBzaXplb2YodGhpcmQpLCAwKTsKJiM0MzsJZWxzZQomIzQzOwkJb3V0cHV0X2VyciA9IGJwZl9wZXJmX2V2ZW50X291dHB1dChza2IsICZhbXA7cGVyZmJ1ZiwgQlBGX0ZfQ1VSUkVOVF9DUFUsCiYjNDM7CQkJCQkJICAgKHZvaWQgKilwZXJmX3BheWxvYWQsIHNpemVvZihwZXJmX3BheWxvYWQpKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgTElDRU5TRVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMjoyMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTE5NAoJCQkJCQkJb3V0cHV0OiAxMDIKCQkJCQkJCXRob3VnaHRzOiA0OTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyBFdmFsdWF0aW9uOiBUaGlzIFBhdGNoIFNlcmllcyoqCgpPa2F5LCBsZXQmIzM5O3Mgc2VlLiBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRvIGFzc2VzcyBpZiB0aGlzIHBhdGNoIHNlcmllcyB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLiBUaGUgZmlyc3Qgc3RlcCBpcyB0byBkaXZlIGludG8gdGhlIGRpZmYuIFRoZSBmaWxlcyB0b3VjaGVkIGFyZSBhbGwgbG9jYXRlZCBpbiBgdG9vbHMvYDogc3BlY2lmaWNhbGx5LCBgdG9vbHMvYnBmL2JwZnRvb2wvYCBhbmQgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9gLiBXZSBoYXZlOiBgRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RgLCB0aGUgYGJwZnRvb2xgIGJhc2ggY29tcGxldGlvbiBzY3JpcHQsIGBtYXBfcGVyZl9yaW5nLmNgIHdpdGhpbiBgYnBmdG9vbGAsIGFuZCBhIGZldyByZWxhdGVkIHRlc3RzIGluIHRoZSBgc2VsZnRlc3RzYCBkaXJlY3RvcnkuCgpOb3csIGxldCYjMzk7cyBkb3VibGUtY2hlY2sgdGhlIGZ1enppbmcgZ3VpZGVsaW5lcy4gU2VjdGlvbiAyIGNsZWFybHkgbGF5cyBvdXQgdGhlICYjMzQ7bmVnYXRpdmUgY3JpdGVyaWEmIzM0OyAtIHRoZSBjYXNlcyB3aGVyZSB3ZSAqZG9uJiMzOTt0KiBmdXp6LiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgYWxpZ25zIHdpdGggdGhlIHJ1bGVzLiBUaGUgZ3VpZGVsaW5lcyBleHBsaWNpdGx5IHN0YXRlIHRoYXQgY2hhbmdlcyB3aXRoaW4gdXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyB0aGF0ICpkb24mIzM5O3QqIGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlIChgdm1saW51eGApIG9yIGtlcm5lbCBtb2R1bGVzIGFyZSBhIG5vLWdvIGZvciBmdXp6aW5nLgoKR2l2ZW4gdGhhdCBhbGwgdGhlIG1vZGlmaWNhdGlvbnMgYXJlIHNxdWFyZWx5IHdpdGhpbiB0aGUgYHRvb2xzL2AgZGlyZWN0b3J5LCBzcGVjaWZpY2FsbHkgd2l0aGluIGBicGZ0b29sYCAod2hpY2ggaXMgYSB1c2VyLXNwYWNlIHRvb2wpIGFuZCB0aGUgYXNzb2NpYXRlZCBCUEYgc2VsZnRlc3RzLCBpdCBzZWVtcyBjbGVhciB0aGlzIGZhbGxzIHVuZGVyIHRoZSAmIzM0O25vdCB3b3J0aCBmdXp6aW5nJiMzNDsgY2F0ZWdvcnkuIE5vbmUgb2YgdGhlc2UgY2hhbmdlcyB0b3VjaCBhbnkga2VybmVsIHJ1bnRpbWUgY29kZSAodGhlIGNyaXRpY2FsIGB2bWxpbnV4YCBvciBtb2R1bGUgY29kZSkuIEl0JiMzOTtzIGFsbCBzZWxmLWNvbnRhaW5lZC4KClRoZXJlZm9yZSwgbXkgZmluYWwgY29uY2x1c2lvbiBpcyB0aGF0IGBXb3J0aEZ1enppbmcgPSBmYWxzZWAuIENvbnNlcXVlbnRseSwgYEZvY3VzU3ltYm9sc2Agd2lsbCBiZSBlbXB0eSwgYXMgd2lsbCBgRW5hYmxlQ29uZmlnc2AuIFRoZSByZWFzb25pbmcgaXMgdGhhdCB0aGUgcGF0Y2ggc2VyaWVzIGlzIGVudGlyZWx5IGNvbmZpbmVkIHRvIHVzZXItc3BhY2UgdG9vbGluZyBhbmQgdGVzdHMsIGxlYXZpbmcgdGhlIGtlcm5lbCBydW50aW1lIHVuYWZmZWN0ZWQuIEkgd2lsbCBub3cgY2FsbCBgc2V0LXJlc3VsdHNgIHdpdGggdGhpcyBhbmFseXNpcyBhbmQgbW92ZSBvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMjoyMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFtdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHNlcmllcyBleGNsdXNpdmVseSBtb2RpZmllcyB1c2VyLXNwYWNlIHRvb2xpbmcgKGJwZnRvb2wpIGFuZCBzZWxmdGVzdHMgdW5kZXIgdGhlIHRvb2xzLyBkaXJlY3RvcnkgKHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYpLiBObyBrZXJuZWwgcnVudGltZSBjb2RlLCBtb2R1bGVzLCBvciB2bWxpbnV4IGltYWdlcyBhcmUgbW9kaWZpZWQsIHNvIHRoaXMgY2hhbmdlIGRvZXMgbm90IHdhcnJhbnQgc3l6a2FsbGVyIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBzZXJpZXMgZXhjbHVzaXZlbHkgbW9kaWZpZXMgdXNlci1zcGFjZSB0b29saW5nIChicGZ0b29sKSBhbmQgc2VsZnRlc3RzIHVuZGVyIHRoZSB0b29scy8gZGlyZWN0b3J5ICh0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmKS4gTm8ga2VybmVsIHJ1bnRpbWUgY29kZSwgbW9kdWxlcywgb3Igdm1saW51eCBpbWFnZXMgYXJlIG1vZGlmaWVkLCBzbyB0aGlzIGNoYW5nZSBkb2VzIG5vdCB3YXJyYW50IHN5emthbGxlciBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMjoyMDwvdGQ+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+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDdUMDI6MjA6MzAuODg0Mzc2ODIxWiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjIyMjE4NzMzNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNlcmllcyBleGNsdXNpdmVseSBtb2RpZmllcyB1c2VyLXNwYWNlIHRvb2xpbmcgKGJwZnRvb2wpIGFuZCBzZWxmdGVzdHMgdW5kZXIgdGhlIHRvb2xzLyBkaXJlY3RvcnkgKHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYpLiBObyBrZXJuZWwgcnVudGltZSBjb2RlLCBtb2R1bGVzLCBvciB2bWxpbnV4IGltYWdlcyBhcmUgbW9kaWZpZWQsIHNvIHRoaXMgY2hhbmdlIGRvZXMgbm90IHdhcnJhbnQgc3l6a2FsbGVyIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwMjoyMDozMC44ODQzODI2MDFaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2ODgwOTQzMDgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBhMmQxYzVhNjAyODc5ZDM3OTk1ZjMwMWMwMjBkY2NlZjBiMzBkMmI4XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gU2VwIDcgMDI6MjA6MjggMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLmM0NGU2Zjc5N2U1NzcgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbkBAIC0xMjAsNyArMTIwLDggQEAgYnBmdG9vbCBtYXAgcGluICAgICAqTUFQKiAgKkZJTEUqXFxuICAgICBjaGFyYWN0ZXIgKCcuJyksIHdoaWNoIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyBvZiAqYnBmZnMqLlxcbiBcXG4gYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdXFxuLSAgICBSZWFkIGV2ZW50cyBmcm9tIGEgKipCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSoqIG1hcC5cXG4rICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogb3JcXG4rICAgICoqQlBGX01BUF9UWVBFX1JJTkdCVUYqKiBtYXAuXFxuIFxcbiAgICAgSW5zdGFsbCBwZXJmIHJpbmdzIGludG8gYSBwZXJmIGV2ZW50IGFycmF5IG1hcCBhbmQgZHVtcCBvdXRwdXQgb2YgYW55XFxuICAgICAqKmJwZl9wZXJmX2V2ZW50X291dHB1dCoqXFxcXCAoKSBjYWxsIGluIHRoZSBrZXJuZWwuIEJ5IGRlZmF1bHQgcmVhZCB0aGVcXG5AQCAtMTM0LDYgKzEzNSwxOCBAQCBicGZ0b29sIG1hcCBldmVudF9waXBlICpNQVAqIFtjcHUgKk4qIGluZGV4ICpNKl1cXG4gICAgIGV4aXN0aW5nIHJpbmcuICBBbnkgb3RoZXIgYXBwbGljYXRpb24gd2lsbCBzdG9wIHJlY2VpdmluZyBldmVudHMgaWYgaXRcXG4gICAgIGluc3RhbGxlZCBpdHMgcmluZ3MgZWFybGllci5cXG4gXFxuKyAgICBGb3IgYSByaW5nIGJ1ZmZlciBtYXAsIGNvbnN1bWUgcmVjb3JkcyBzdWJtaXR0ZWQgYnkgQlBGIHByb2dyYW1zLCBpbmNsdWRpbmdcXG4rICAgIHJlY29yZHMgYWxyZWFkeSBxdWV1ZWQgYmVmb3JlIHRoZSBjb21tYW5kIHN0YXJ0cy4gKipjcHUqKiBhbmQgKippbmRleCoqXFxuKyAgICBhcmUgbm90IHN1cHBvcnRlZC4gRWFjaCByZWNvcmQgaXMgcHJpbnRlZCBhcyByYXcgYnl0ZXMsIGluY2x1ZGluZyBlbWJlZGRlZFxcbisgICAgemVybyBieXRlcy4gUGxhaW4gb3V0cHV0IHJlcG9ydHMgdGhlIHJlY29yZCBzaXplIGZvbGxvd2VkIGJ5IGhleGFkZWNpbWFsXFxuKyAgICBieXRlczsgSlNPTiBvdXRwdXQgY29udGFpbnMgKipzaXplKiogYW5kICoqZGF0YSoqIGZpZWxkcywgd2l0aCAqKmRhdGEqKiBhblxcbisgICAgYXJyYXkgb2YgYnl0ZSB2YWx1ZXMuIFJpbmcgYnVmZmVyIHJlY29yZHMgaGF2ZSBubyBpbXBsaWNpdCBDUFUgb3IgdGltZXN0YW1wLlxcbitcXG4rICAgIFJpbmcgYnVmZmVycyBzdXBwb3J0IGEgc2luZ2xlIGNvbnN1bWVyLiBUaGlzIGNvbW1hbmQgYWR2YW5jZXMgdGhlIHNoYXJlZFxcbisgICAgY29uc3VtZXIgcG9zaXRpb24gYW5kIG11c3Qgbm90IHJ1biBhbG9uZ3NpZGUgYW5vdGhlciBjb25zdW1lciBvZiB0aGUgc2FtZVxcbisgICAgbWFwOyBpdCBkb2VzIG5vdCBwcm92aWRlIGEgcGFzc2l2ZSB2aWV3IG9mIGV2ZW50cy4gKipCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGKipcXG4rICAgIG1hcHMgYXJlIG5vdCBzdXBwb3J0ZWQuXFxuK1xcbiBicGZ0b29sIG1hcCBwZWVrICAqTUFQKlxcbiAgICAgUGVlayBuZXh0IHZhbHVlIGluIHRoZSBxdWV1ZSBvciBzdGFjay5cXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcXG5pbmRleCA3NWNiY2I1MTJlYmFlLi4xNzUwYjQ4OGM5ZTNiIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcXG5AQCAtODc4LDExICs4NzgsMTEgQEAgX2JwZnRvb2woKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7XFxuICAgICAgICAgICAgICAgICAgICAgICAgIGlkKVxcbi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgcGVyZl9ldmVudF9hcnJheVxcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgJ1xcXCJ0eXBlXFxcIjogXFxcIlxcXFwocGVyZl9ldmVudF9hcnJheVxcXFx8cmluZ2J1ZlxcXFwpXFxcIidcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKVxcbi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9uYW1lc19mb3JfdHlwZSBwZXJmX2V2ZW50X2FycmF5XFxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX25hbWVzX2Zvcl90eXBlICdcXFwidHlwZVxcXCI6IFxcXCJcXFxcKHBlcmZfZXZlbnRfYXJyYXlcXFxcfHJpbmdidWZcXFxcKVxcXCInXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgY3B1KVxcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmNcXG5pbmRleCBiY2I3NjdlMmQ2NzMzLi43ZDU1NTMzMWY0NDNhIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xcbkBAIC0yNyw3ICsyNyw3IEBAXFxuIFxcbiAjZGVmaW5lIE1NQVBfUEFHRV9DTlRcXHQxNlxcbiBcXG4tc3RhdGljIHZvbGF0aWxlIGJvb2wgc3RvcDtcXG4rc3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBzdG9wO1xcbiBcXG4gc3RydWN0IHBlcmZfZXZlbnRfc2FtcGxlIHtcXG4gXFx0c3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyIGhlYWRlcjtcXG5AQCAtNDQsNyArNDQsNiBAQCBzdHJ1Y3QgcGVyZl9ldmVudF9sb3N0IHtcXG4gXFxuIHN0YXRpYyB2b2lkIGludF9leGl0KGludCBzaWdubylcXG4ge1xcbi1cXHRmcHJpbnRmKHN0ZGVyciwgXFxcIlN0b3BwaW5nLi4uXFxcXG5cXFwiKTtcXG4gXFx0c3RvcCA9IHRydWU7XFxuIH1cXG4gXFxuQEAgLTEwNyw2ICsxMDYsMjcgQEAgcHJpbnRfYnBmX291dHB1dCh2b2lkICpwcml2YXRlX2RhdGEsIGludCBjcHUsIHN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciAqZXZlbnQpXFxuIFxcdHJldHVybiBMSUJCUEZfUEVSRl9FVkVOVF9DT05UO1xcbiB9XFxuIFxcbitzdGF0aWMgaW50IHByaW50X3JpbmdidWZfb3V0cHV0KHZvaWQgKmN0eCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpXFxuK3tcXG4rXFx0aWYgKGpzb25fb3V0cHV0KSB7XFxuK1xcdFxcdGpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7XFxuK1xcdFxcdGpzb253X3VpbnRfZmllbGQoanNvbl93dHIsIFxcXCJzaXplXFxcIiwgc2l6ZSk7XFxuK1xcdFxcdGpzb253X25hbWUoanNvbl93dHIsIFxcXCJkYXRhXFxcIik7XFxuK1xcdFxcdHByaW50X2RhdGFfanNvbihkYXRhLCBzaXplKTtcXG4rXFx0XFx0anNvbndfZW5kX29iamVjdChqc29uX3d0cik7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHByaW50ZihcXFwiPT0gc2l6ZTogJXp1ID09PT09XFxcXG5cXFwiLCBzaXplKTtcXG4rXFx0XFx0ZnByaW50X2hleChzdGRvdXQsIGRhdGEsIHNpemUsIFxcXCIgXFxcIik7XFxuK1xcdFxcdHByaW50ZihcXFwiXFxcXG5cXFwiKTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGZmbHVzaChzdGRvdXQpKVxcbitcXHRcXHRyZXR1cm4gZXJybm8gPyAtZXJybm8gOiAtRUlPO1xcbitcXG4rXFx0LyogQSBwcm9kdWNlciBjYW4ga2VlcCBwb2xsKCkgYnVzeSBldmVuIGFmdGVyIGEgc2lnbmFsIGFycml2ZXMuICovXFxuK1xcdHJldHVybiBzdG9wID8gLUVJTlRSIDogMDtcXG4rfVxcbitcXG4gaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiB7XFxuIFxcdHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgcGVyZl9hdHRyID0ge1xcbkBAIC0xMjMsMTggKzE0MywyNiBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdC5jcHUgPSAtMSxcXG4gXFx0XFx0LmlkeCA9IC0xLFxcbiBcXHR9O1xcbi1cXHRzdHJ1Y3QgcGVyZl9idWZmZXIgKnBiO1xcbitcXHRzdHJ1Y3QgcGVyZl9idWZmZXIgKnBiID0gTlVMTDtcXG4rXFx0c3RydWN0IHJpbmdfYnVmZmVyICpyYiA9IE5VTEw7XFxuIFxcdF9fdTMyIG1hcF9pbmZvX2xlbjtcXG4gXFx0aW50IGVyciwgbWFwX2ZkO1xcbiBcXG4rXFx0c3RvcCA9IGZhbHNlO1xcbiBcXHRtYXBfaW5mb19sZW4gPSBzaXplb2YobWFwX2luZm8pO1xcbiBcXHRtYXBfZmQgPSBtYXBfcGFyc2VfZmRfYW5kX2luZm8oXFx1MDAyNmFyZ2MsIFxcdTAwMjZhcmd2LCBcXHUwMDI2bWFwX2luZm8sIFxcdTAwMjZtYXBfaW5mb19sZW4sXFxuIFxcdFxcdFxcdFxcdCAgICAgICAwKTtcXG4gXFx0aWYgKG1hcF9mZCBcXHUwMDNjIDApXFxuIFxcdFxcdHJldHVybiAtMTtcXG4gXFxuLVxcdGlmIChtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKSB7XFxuLVxcdFxcdHBfZXJyKFxcXCJtYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheVxcXCIpO1xcbitcXHRpZiAobWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgbWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUklOR0JVRikge1xcbitcXHRcXHRwX2VycihcXFwibWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcXFwiKTtcXG4rXFx0XFx0Z290byBlcnJfY2xvc2VfbWFwO1xcbitcXHR9XFxuK1xcbitcXHRpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRiBcXHUwMDI2XFx1MDAyNiBhcmdjKSB7XFxuK1xcdFxcdHBfZXJyKFxcXCJyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHNcXFwiKTtcXG4gXFx0XFx0Z290byBlcnJfY2xvc2VfbWFwO1xcbiBcXHR9XFxuIFxcbkBAIC0xODQsMTUgKzIxMiwyNCBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdGN0eC5pZHggPSAwO1xcbiBcXHR9XFxuIFxcbi1cXHRvcHRzLmNwdV9jbnQgPSBjdHguYWxsX2NwdXMgPyAwIDogMTtcXG4tXFx0b3B0cy5jcHVzID0gXFx1MDAyNmN0eC5jcHU7XFxuLVxcdG9wdHMubWFwX2tleXMgPSBcXHUwMDI2Y3R4LmlkeDtcXG4tXFx0cGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsIFxcdTAwMjZwZXJmX2F0dHIsXFxuLVxcdFxcdFxcdFxcdCAgcHJpbnRfYnBmX291dHB1dCwgXFx1MDAyNmN0eCwgXFx1MDAyNm9wdHMpO1xcbi1cXHRpZiAoIXBiKSB7XFxuLVxcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpXFxcIixcXG4tXFx0XFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XFxuLVxcdFxcdGdvdG8gZXJyX2Nsb3NlX21hcDtcXG4rXFx0aWYgKG1hcF9pbmZvLnR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYpIHtcXG4rXFx0XFx0cmIgPSByaW5nX2J1ZmZlcl9fbmV3KG1hcF9mZCwgcHJpbnRfcmluZ2J1Zl9vdXRwdXQsIE5VTEwsIE5VTEwpO1xcbitcXHRcXHRpZiAoIXJiKSB7XFxuK1xcdFxcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gY3JlYXRlIHJpbmcgYnVmZmVyOiAlcyAoJWQpXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XFxuK1xcdFxcdFxcdGdvdG8gZXJyX2Nsb3NlX21hcDtcXG4rXFx0XFx0fVxcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRvcHRzLmNwdV9jbnQgPSBjdHguYWxsX2NwdXMgPyAwIDogMTtcXG4rXFx0XFx0b3B0cy5jcHVzID0gXFx1MDAyNmN0eC5jcHU7XFxuK1xcdFxcdG9wdHMubWFwX2tleXMgPSBcXHUwMDI2Y3R4LmlkeDtcXG4rXFx0XFx0cGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsIFxcdTAwMjZwZXJmX2F0dHIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgcHJpbnRfYnBmX291dHB1dCwgXFx1MDAyNmN0eCwgXFx1MDAyNm9wdHMpO1xcbitcXHRcXHRpZiAoIXBiKSB7XFxuK1xcdFxcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XFxuK1xcdFxcdFxcdGdvdG8gZXJyX2Nsb3NlX21hcDtcXG4rXFx0XFx0fVxcbiBcXHR9XFxuIFxcbiBcXHRzaWduYWwoU0lHSU5ULCBpbnRfZXhpdCk7XFxuQEAgLTIwMiwyNSArMjM5LDMzIEBAIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0aWYgKGpzb25fb3V0cHV0KVxcbiBcXHRcXHRqc29ud19zdGFydF9hcnJheShqc29uX3d0cik7XFxuIFxcbitcXHRlcnIgPSAwO1xcbiBcXHR3aGlsZSAoIXN0b3ApIHtcXG4tXFx0XFx0ZXJyID0gcGVyZl9idWZmZXJfX3BvbGwocGIsIDIwMCk7XFxuK1xcdFxcdGVyciA9IHJiID8gcmluZ19idWZmZXJfX3BvbGwocmIsIDIwMCkgOiBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTtcXG4gXFx0XFx0aWYgKGVyciBcXHUwMDNjIDAgXFx1MDAyNlxcdTAwMjYgZXJyICE9IC1FSU5UUikge1xcbi1cXHRcXHRcXHRwX2VycihcXFwicGVyZiBidWZmZXIgcG9sbGluZyBmYWlsZWQ6ICVzICglZClcXFwiLFxcbi1cXHRcXHRcXHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcXG4tXFx0XFx0XFx0Z290byBlcnJfY2xvc2VfcGI7XFxuK1xcdFxcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiRXJyb3I6ICVzIGJ1ZmZlciBwb2xsaW5nIGZhaWxlZDogJXMgKCVkKVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0cmIgPyBcXFwicmluZ1xcXCIgOiBcXFwicGVyZlxcXCIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdH1cXG4rXFx0XFx0ZXJyID0gMDtcXG4gXFx0fVxcbiBcXG4rXFx0aWYgKHN0b3ApXFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiU3RvcHBpbmcuLi5cXFxcblxcXCIpO1xcbiBcXHRpZiAoanNvbl9vdXRwdXQpXFxuIFxcdFxcdGpzb253X2VuZF9hcnJheShqc29uX3d0cik7XFxuK1xcdGlmIChmZmx1c2goc3Rkb3V0KSkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIkVycm9yOiBmYWlsZWQgdG8gd3JpdGUgZXZlbnRzOiAlc1xcXFxuXFxcIiwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0XFx0ZXJyID0gLTE7XFxuK1xcdH1cXG4gXFxuK1xcdHJpbmdfYnVmZmVyX19mcmVlKHJiKTtcXG4gXFx0cGVyZl9idWZmZXJfX2ZyZWUocGIpO1xcbitcXHQvKiBCb3RoIGJ1ZmZlciBtYW5hZ2VycyBib3Jyb3cgbWFwX2ZkLiAqL1xcbiBcXHRjbG9zZShtYXBfZmQpO1xcbiBcXG4tXFx0cmV0dXJuIDA7XFxuK1xcdHJldHVybiBlcnIgXFx1MDAzYyAwID8gLTEgOiAwO1xcbiBcXG4tZXJyX2Nsb3NlX3BiOlxcbi1cXHRwZXJmX2J1ZmZlcl9fZnJlZShwYik7XFxuIGVycl9jbG9zZV9tYXA6XFxuIFxcdGNsb3NlKG1hcF9mZCk7XFxuIFxcdHJldHVybiAtMTtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMjA5OWJmMTAyMDkzMFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY1xcbkBAIC0wLDAgKzEsMzgxIEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKyNpbmNsdWRlIFxcdTAwM2NjdHlwZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3BvbGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3NpZ25hbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy93YWl0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJicGZ0b29sX3JpbmdidWYuc2tlbC5oXFxcIlxcbitcXG4rI2RlZmluZSBXQUlUX1NURVBTIDUwMFxcbisjZGVmaW5lIFdBSVRfVVMgMTAwMDBcXG4rXFxuK3N0cnVjdCBjb25zdW1lciB7XFxuK1xcdHBpZF90IHBpZDtcXG4rXFx0aW50IGZkO1xcbit9O1xcbitcXG4rc3RhdGljIGNvbnN0IGNoYXIgKmJwZnRvb2xfcGF0aCh2b2lkKVxcbit7XFxuK1xcdGNvbnN0IGNoYXIgKnBhdGggPSBnZXRlbnYoXFxcIkJQRlRPT0xcXFwiKTtcXG4rXFxuK1xcdGlmIChwYXRoKVxcbitcXHRcXHRyZXR1cm4gYWNjZXNzKHBhdGgsIFhfT0spID8gTlVMTCA6IHBhdGg7XFxuK1xcdGlmICghYWNjZXNzKFxcXCIuL3Rvb2xzL3NiaW4vYnBmdG9vbFxcXCIsIFhfT0spKVxcbitcXHRcXHRyZXR1cm4gXFxcIi4vdG9vbHMvc2Jpbi9icGZ0b29sXFxcIjtcXG4rXFx0aWYgKCFhY2Nlc3MoXFxcIi4uL3Rvb2xzL3NiaW4vYnBmdG9vbFxcXCIsIFhfT0spKVxcbitcXHRcXHRyZXR1cm4gXFxcIi4uL3Rvb2xzL3NiaW4vYnBmdG9vbFxcXCI7XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBjb25zdW1lcl9jbGVhbnVwKHN0cnVjdCBjb25zdW1lciAqY2hpbGQpXFxuK3tcXG4rXFx0aWYgKGNoaWxkLVxcdTAwM2VwaWQgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdGtpbGwoY2hpbGQtXFx1MDAzZXBpZCwgU0lHS0lMTCk7XFxuK1xcdFxcdHdoaWxlICh3YWl0cGlkKGNoaWxkLVxcdTAwM2VwaWQsIE5VTEwsIDApIFxcdTAwM2MgMCBcXHUwMDI2XFx1MDAyNiBlcnJubyA9PSBFSU5UUilcXG4rXFx0XFx0XFx0O1xcbitcXHRcXHRjaGlsZC1cXHUwMDNlcGlkID0gLTE7XFxuK1xcdH1cXG4rXFx0aWYgKGNoaWxkLVxcdTAwM2VmZCBcXHUwMDNlPSAwKSB7XFxuK1xcdFxcdGNsb3NlKGNoaWxkLVxcdTAwM2VmZCk7XFxuK1xcdFxcdGNoaWxkLVxcdTAwM2VmZCA9IC0xO1xcbitcXHR9XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGNvbnN1bWVyX3N0YXJ0KHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBtYXBfZmQsIGJvb2wganNvbixcXG4rXFx0XFx0XFx0ICAgY29uc3QgY2hhciAqb3B0aW9uLCBib29sIHBhaXIsIGJvb2wgY2FwdHVyZV9lcnJvcnMpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307XFxuK1xcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcXG4rXFx0Y29uc3QgY2hhciAqcGF0aCA9IGJwZnRvb2xfcGF0aCgpO1xcbitcXHRjaGFyICphcmd2WzEyXSwgaWRbMTZdO1xcbitcXHRpbnQgb3V0WzJdLCByZWFkeVsyXSwgbiA9IDAsIGVyciwgZXJyX2ZkO1xcbitcXHRzdHJ1Y3QgcG9sbGZkIHBmZDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihwYXRoLCBcXFwiYnBmdG9vbCBwYXRoIChzZXQgQlBGVE9PTCB0byBvdmVycmlkZSlcXFwiKSB8fFxcbitcXHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKG1hcF9mZCwgXFx1MDAyNmluZm8sIFxcdTAwMjZsZW4pLCBcXFwibWFwIGluZm9cXFwiKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRzbnByaW50ZihpZCwgc2l6ZW9mKGlkKSwgXFxcIiV1XFxcIiwgaW5mby5pZCk7XFxuK1xcdGFyZ3ZbbisrXSA9IChjaGFyICopcGF0aDtcXG4rXFx0aWYgKGpzb24pXFxuK1xcdFxcdGFyZ3ZbbisrXSA9IFxcXCItalxcXCI7XFxuK1xcdGFyZ3ZbbisrXSA9IFxcXCJtYXBcXFwiO1xcbitcXHRhcmd2W24rK10gPSBcXFwiZXZlbnRfcGlwZVxcXCI7XFxuK1xcdGFyZ3ZbbisrXSA9IFxcXCJpZFxcXCI7XFxuK1xcdGFyZ3ZbbisrXSA9IGlkO1xcbitcXHRpZiAob3B0aW9uKSB7XFxuK1xcdFxcdGFyZ3ZbbisrXSA9IChjaGFyICopb3B0aW9uO1xcbitcXHRcXHRhcmd2W24rK10gPSBcXFwiMFxcXCI7XFxuK1xcdFxcdGlmIChwYWlyKSB7XFxuK1xcdFxcdFxcdGFyZ3ZbbisrXSA9IFxcXCJpbmRleFxcXCI7XFxuK1xcdFxcdFxcdGFyZ3ZbbisrXSA9IFxcXCIwXFxcIjtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdGFyZ3Zbbl0gPSBOVUxMO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhwaXBlMihvdXQsIE9fQ0xPRVhFQyksIFxcXCJvdXRwdXQgcGlwZVxcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdGlmICghQVNTRVJUX09LKHBpcGUyKHJlYWR5LCBPX0NMT0VYRUMpLCBcXFwiZXhlYyBwaXBlXFxcIikpIHtcXG4rXFx0XFx0Y2xvc2Uob3V0WzBdKTtcXG4rXFx0XFx0Y2xvc2Uob3V0WzFdKTtcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcdGNoaWxkLVxcdTAwM2VwaWQgPSBmb3JrKCk7XFxuK1xcdGlmICghY2hpbGQtXFx1MDAzZXBpZCkge1xcbitcXHRcXHRjbG9zZShvdXRbMF0pO1xcbitcXHRcXHRjbG9zZShyZWFkeVswXSk7XFxuK1xcdFxcdGVycl9mZCA9IGNhcHR1cmVfZXJyb3JzID8gb3V0WzFdIDogb3BlbihcXFwiL2Rldi9udWxsXFxcIiwgT19XUk9OTFkpO1xcbitcXHRcXHRpZiAoZHVwMihvdXRbMV0sIFNURE9VVF9GSUxFTk8pIFxcdTAwM2MgMCB8fFxcbitcXHRcXHQgICAgZHVwMihlcnJfZmQsIFNUREVSUl9GSUxFTk8pIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0Z290byBleGVjX2ZhaWw7XFxuK1xcdFxcdGlmICghY2FwdHVyZV9lcnJvcnMpXFxuK1xcdFxcdFxcdGNsb3NlKGVycl9mZCk7XFxuK1xcdFxcdGNsb3NlKG91dFsxXSk7XFxuK1xcdFxcdGV4ZWN2KHBhdGgsIGFyZ3YpO1xcbitleGVjX2ZhaWw6XFxuK1xcdFxcdGVyciA9IGVycm5vO1xcbitcXHRcXHR3cml0ZShyZWFkeVsxXSwgXFx1MDAyNmVyciwgc2l6ZW9mKGVycikpO1xcbitcXHRcXHRfZXhpdCgxMjcpO1xcbitcXHR9XFxuK1xcdGNsb3NlKG91dFsxXSk7XFxuK1xcdGNsb3NlKHJlYWR5WzFdKTtcXG4rXFx0Y2hpbGQtXFx1MDAzZWZkID0gb3V0WzBdO1xcbitcXHRwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSByZWFkeVswXSwgLmV2ZW50cyA9IFBPTExJTiB9O1xcbitcXHQvKiBFT0Ygb24gdGhlIGNsb3NlLW9uLWV4ZWMgcGlwZSBkaXN0aW5ndWlzaGVzIGV4ZWMgZnJvbSBpbmhlcml0ZWQgaGFuZGxlcnMuICovXFxuK1xcdGVyciA9IGNoaWxkLVxcdTAwM2VwaWQgXFx1MDAzZSAwID8gcG9sbChcXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApIDogLTE7XFxuK1xcdGlmICghQVNTRVJUX0dUKGNoaWxkLVxcdTAwM2VwaWQsIDAsIFxcXCJmb3JrXFxcIikgfHxcXG4rXFx0ICAgICFBU1NFUlRfR1QoZXJyLCAwLCBcXFwiZXhlYyB0aW1lb3V0XFxcIikgfHxcXG4rXFx0ICAgICFBU1NFUlRfRVEocmVhZChyZWFkeVswXSwgXFx1MDAyNmVyciwgc2l6ZW9mKGVycikpLCAwLCBcXFwiZXhlY1xcXCIpKSB7XFxuK1xcdFxcdGNsb3NlKHJlYWR5WzBdKTtcXG4rXFx0XFx0Y29uc3VtZXJfY2xlYW51cChjaGlsZCk7XFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXHRjbG9zZShyZWFkeVswXSk7XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBjb25zdW1lcl9maW5pc2goc3RydWN0IGNvbnN1bWVyICpjaGlsZCwgaW50IHNpZ25vLCBib29sIHN1Y2Nlc3MsXFxuK1xcdFxcdFxcdCAgICBjaGFyICpvdXRwdXQsIHNpemVfdCBzaXplKVxcbit7XFxuK1xcdGludCBzdGF0dXMgPSAwLCBpO1xcbitcXHRwaWRfdCByZXQgPSAwO1xcbitcXHRzc2l6ZV90IG47XFxuK1xcdHNpemVfdCB1c2VkID0gMDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX09LKGZjbnRsKGNoaWxkLVxcdTAwM2VmZCwgRl9TRVRGTCwgT19OT05CTE9DSyksIFxcXCJub25ibG9ja2luZyBvdXRwdXRcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRpZiAoc2lnbm8gXFx1MDAyNlxcdTAwMjYgIUFTU0VSVF9PSyhraWxsKGNoaWxkLVxcdTAwM2VwaWQsIHNpZ25vKSwgXFxcInNpZ25hbCBjb25zdW1lclxcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBXQUlUX1NURVBTOyBpKyspIHtcXG4rXFx0XFx0d2hpbGUgKHVzZWQgXFx1MDAzYyBzaXplIC0gMSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgICAgKG4gPSByZWFkKGNoaWxkLVxcdTAwM2VmZCwgb3V0cHV0ICsgdXNlZCwgc2l6ZSAtIDEgLSB1c2VkKSkgXFx1MDAzZSAwKVxcbitcXHRcXHRcXHR1c2VkICs9IG47XFxuK1xcdFxcdHJldCA9IHdhaXRwaWQoY2hpbGQtXFx1MDAzZXBpZCwgXFx1MDAyNnN0YXR1cywgV05PSEFORyk7XFxuK1xcdFxcdGlmIChyZXQgPT0gY2hpbGQtXFx1MDAzZXBpZClcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzYyAwIFxcdTAwMjZcXHUwMDI2IGVycm5vICE9IEVJTlRSKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0dXNsZWVwKFdBSVRfVVMpO1xcbitcXHR9XFxuK1xcdGlmICghQVNTRVJUX0VRKHJldCwgY2hpbGQtXFx1MDAzZXBpZCwgXFxcImJvdW5kZWQgY29uc3VtZXIgZXhpdFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdGNoaWxkLVxcdTAwM2VwaWQgPSAtMTtcXG4rXFx0d2hpbGUgKHVzZWQgXFx1MDAzYyBzaXplIC0gMSBcXHUwMDI2XFx1MDAyNiAobiA9IHJlYWQoY2hpbGQtXFx1MDAzZWZkLCBvdXRwdXQgKyB1c2VkLCBzaXplIC0gMSAtIHVzZWQpKSBcXHUwMDNlIDApXFxuK1xcdFxcdHVzZWQgKz0gbjtcXG4rXFx0b3V0cHV0W3VzZWRdID0gJ1xcXFwwJztcXG4rXFx0cmV0dXJuIEFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcXFwibm9ybWFsIGV4aXRcXFwiKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgICAgQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cykgPT0gMCwgc3VjY2VzcywgXFxcImV4aXQgc3RhdHVzXFxcIik7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGNvbnN1bWVyX3JlYWR5KHN0cnVjdCBjb25zdW1lciAqY2hpbGQpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBsb25nIGNhdWdodDtcXG4rXFx0Y2hhciBwYXRoWzY0XSwgbGluZVsyNTZdO1xcbitcXHRpbnQgaTtcXG4rXFx0RklMRSAqZjtcXG4rXFxuK1xcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXFxcIi9wcm9jLyVkL3N0YXR1c1xcXCIsIGNoaWxkLVxcdTAwM2VwaWQpO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgV0FJVF9TVEVQUzsgaSsrKSB7XFxuK1xcdFxcdGYgPSBmb3BlbihwYXRoLCBcXFwiclxcXCIpO1xcbitcXHRcXHRpZiAoIWYpXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmKSkge1xcbitcXHRcXHRcXHRpZiAoc3NjYW5mKGxpbmUsIFxcXCJTaWdDZ3Q6ICVsbHhcXFwiLCBcXHUwMDI2Y2F1Z2h0KSA9PSAxIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdFxcdCAgICAoY2F1Z2h0IFxcdTAwMjYgKDFVTEwgXFx1MDAzY1xcdTAwM2MgKFNJR0lOVCAtIDEpKSkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0XFx0ICAgIChjYXVnaHQgXFx1MDAyNiAoMVVMTCBcXHUwMDNjXFx1MDAzYyAoU0lHVEVSTSAtIDEpKSkpIHtcXG4rXFx0XFx0XFx0XFx0ZmNsb3NlKGYpO1xcbitcXHRcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcdFxcdGZjbG9zZShmKTtcXG4rXFx0XFx0dXNsZWVwKFdBSVRfVVMpO1xcbitcXHR9XFxuK1xcdHJldHVybiBBU1NFUlRfVFJVRShmYWxzZSwgXFxcImNvbnN1bWVyIHNpZ25hbCBoYW5kbGVycyByZWFkeVxcXCIpO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBlbWl0X3JlY29yZChzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsLCBpbnQgcmVjb3JkKVxcbit7XFxuK1xcdGNoYXIgcGFja2V0WzY0XSA9IHt9O1xcbitcXG4rXFx0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMsXFxuK1xcdFxcdCAgICAuZGF0YV9pbiA9IHBhY2tldCxcXG4rXFx0XFx0ICAgIC5kYXRhX3NpemVfaW4gPSBzaXplb2YocGFja2V0KSxcXG4rXFx0KTtcXG4rXFxuK1xcdHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjb3JkID0gcmVjb3JkO1xcbitcXHRyZXR1cm4gQVNTRVJUX09LKGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXFx1MDAzZXByb2dzLnByb2R1Y2UpLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBcXHUwMDI2b3B0cyksIFxcXCJwcm9kdWNlIHJlY29yZFxcXCIpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAgICBBU1NFUlRfT0soc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VvdXRwdXRfZXJyLCBcXFwicmluZ2J1ZiBvdXRwdXRcXFwiKTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgY29uc3VtZWQodW5zaWduZWQgbG9uZyAqcG9zaXRpb24sIHVuc2lnbmVkIGxvbmcgZXhwZWN0ZWQpXFxuK3tcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgV0FJVF9TVEVQUzsgaSsrKSB7XFxuK1xcdFxcdGlmIChfX2F0b21pY19sb2FkX24ocG9zaXRpb24sIF9fQVRPTUlDX0FDUVVJUkUpID09IGV4cGVjdGVkKVxcbitcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0XFx0dXNsZWVwKFdBSVRfVVMpO1xcbitcXHR9XFxuK1xcdHJldHVybiBBU1NFUlRfRVEoKnBvc2l0aW9uLCBleHBlY3RlZCwgXFxcImNvbnN1bWVyIHBvc2l0aW9uXFxcIik7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNoZWNrX2pzb24oY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICpleHBlY3RlZClcXG4re1xcbitcXHRjaGFyICpzcmMgPSBvdXRwdXQsICpkc3QgPSBvdXRwdXQ7XFxuK1xcdGJvb2wgcXVvdGVkID0gZmFsc2UsIGVzY2FwZWQgPSBmYWxzZTtcXG4rXFxuK1xcdC8qIElnbm9yZSBmb3JtYXR0aW5nIHdoaXRlc3BhY2Ugd2hpbGUgY2hlY2tpbmcgdGhlIGVudGlyZSBKU09OIGRvY3VtZW50LiAqL1xcbitcXHR3aGlsZSAoKnNyYykge1xcbitcXHRcXHRpZiAocXVvdGVkIHx8ICFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxcbitcXHRcXHRcXHQqZHN0KysgPSAqc3JjO1xcbitcXHRcXHRpZiAoIWVzY2FwZWQgXFx1MDAyNlxcdTAwMjYgKnNyYyA9PSAnXFxcIicpXFxuK1xcdFxcdFxcdHF1b3RlZCA9ICFxdW90ZWQ7XFxuK1xcdFxcdGVzY2FwZWQgPSAhZXNjYXBlZCBcXHUwMDI2XFx1MDAyNiBxdW90ZWQgXFx1MDAyNlxcdTAwMjYgKnNyYyA9PSAnXFxcXFxcXFwnO1xcbitcXHRcXHRzcmMrKztcXG4rXFx0fVxcbitcXHQqZHN0ID0gJ1xcXFwwJztcXG4rXFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFxcXCJKU09OIHJlY29yZHNcXFwiKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9jb25zdW1lcihib29sIGpzb24sIGJvb2wgaWRsZSwgaW50IHNpZ25vKVxcbit7XFxuK1xcdHN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9O1xcbitcXHRzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsO1xcbitcXHR1bnNpZ25lZCBsb25nICpwb3NpdGlvbiA9IE1BUF9GQUlMRUQ7XFxuK1xcdGludCBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpLCBmZDtcXG4rXFx0Y2hhciBvdXRwdXRbNDA5Nl07XFxuK1xcdHN0cnVjdCBwb2xsZmQgcGZkO1xcbitcXG4rXFx0c2tlbCA9IGJwZnRvb2xfcmluZ2J1Zl9fb3BlbigpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcIm9wZW5cXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cXHUwMDNlbWFwcy5yaW5nYnVmLCBwYWdlX3NpemUpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhicGZ0b29sX3JpbmdidWZfX2xvYWQoc2tlbCksIFxcXCJsb2FkXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmZCA9IGJwZl9tYXBfX2ZkKHNrZWwtXFx1MDAzZW1hcHMucmluZ2J1Zik7XFxuK1xcdHBvc2l0aW9uID0gbW1hcChOVUxMLCBwYWdlX3NpemUsIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgZmQsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9ORVEocG9zaXRpb24sIE1BUF9GQUlMRUQsIFxcXCJjb25zdW1lciBtbWFwXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAoIWlkbGUgXFx1MDAyNlxcdTAwMjYgKCFlbWl0X3JlY29yZChza2VsLCAwKSB8fCAhZW1pdF9yZWNvcmQoc2tlbCwgMSkpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFjb25zdW1lcl9zdGFydChcXHUwMDI2Y2hpbGQsIGZkLCBqc29uLCBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8XFxuK1xcdCAgICAhY29uc3VtZXJfcmVhZHkoXFx1MDAyNmNoaWxkKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghaWRsZSkge1xcbitcXHRcXHQvKiBCb3RoIHByZWZpbGxlZCByZWNvcmRzIG9jY3VweSAxNiBieXRlcyBpbmNsdWRpbmcgdGhlaXIgaGVhZGVycy4gKi9cXG4rXFx0XFx0aWYgKCFjb25zdW1lZChwb3NpdGlvbiwgMzIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0cGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gY2hpbGQuZmQsIC5ldmVudHMgPSBQT0xMSU4gfTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfR1QocG9sbChcXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApLCAwLFxcbitcXHRcXHRcXHQgICAgICAgXFxcInJlY29yZHMgZmx1c2hlZCBiZWZvcmUgZXhpdFxcXCIpIHx8XFxuK1xcdFxcdCAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgXFx1MDAyNiBQT0xMSU4sIFxcXCJyZWNvcmQgb3V0cHV0IHJlYWRhYmxlXFxcIikgfHxcXG4rXFx0XFx0ICAgICFlbWl0X3JlY29yZChza2VsLCAyKSB8fCAhY29uc3VtZWQocG9zaXRpb24sIDY0KSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFx0aWYgKCFjb25zdW1lcl9maW5pc2goXFx1MDAyNmNoaWxkLCBzaWdubywgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAoanNvbilcXG4rXFx0XFx0Y2hlY2tfanNvbihvdXRwdXQsIGlkbGUgPyBcXFwiW11cXFwiIDpcXG4rXFx0XFx0XFx0ICAgXFxcIlt7XFxcXFxcXCJzaXplXFxcXFxcXCI6MixcXFxcXFxcImRhdGFcXFxcXFxcIjpbMCwyNTVdfSxcXFwiXFxuK1xcdFxcdFxcdCAgIFxcXCJ7XFxcXFxcXCJzaXplXFxcXFxcXCI6NSxcXFxcXFxcImRhdGFcXFxcXFxcIjpbMSwyLDMsNCw1XX0sXFxcIlxcbitcXHRcXHRcXHQgICBcXFwie1xcXFxcXFwic2l6ZVxcXFxcXFwiOjE3LFxcXFxcXFwiZGF0YVxcXFxcXFwiOlsxNiwxNywxOCwxOSwyMCwyMSwyMiwyMyxcXFwiXFxuK1xcdFxcdFxcdCAgIFxcXCIyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMl19XVxcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyBcXFwiXFxcIiA6XFxuK1xcdFxcdFxcdCAgICAgXFxcIj09IHNpemU6IDIgPT09PT1cXFxcbjAwIGZmXFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIj09IHNpemU6IDUgPT09PT1cXFxcbjAxIDAyIDAzIDA0IDA1XFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIj09IHNpemU6IDE3ID09PT09XFxcXG4xMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAgXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCIxOCAxOSAxYSAxYiAxYyAxZCAxZSAxZlxcXFxuMjBcXFxcblxcXCIsIFxcXCJwbGFpbiByZWNvcmRzXFxcIik7XFxuK291dDpcXG4rXFx0Y29uc3VtZXJfY2xlYW51cChcXHUwMDI2Y2hpbGQpO1xcbitcXHRpZiAocG9zaXRpb24gIT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0bXVubWFwKHBvc2l0aW9uLCBwYWdlX3NpemUpO1xcbitcXHRicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfcGVyZl9jb25zdW1lcih2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9O1xcbitcXHR1bnNpZ25lZCBsb25nIGxvbmcgc2Vjb25kcywgbmFub3NlY29uZHM7XFxuK1xcdHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWw7XFxuK1xcdGNoYXIgb3V0cHV0WzE2Mzg0XSwgZXhwZWN0ZWRbMTYzODRdO1xcbitcXHRpbnQgbnJfY3B1cywgY3B1LCBpbmRleCwgb2Zmc2V0ID0gMCwgaSwgdXNlZCA9IDAsIGZpZWxkcztcXG4rXFx0c3RydWN0IHBvbGxmZCBwZmQ7XFxuK1xcbitcXHRucl9jcHVzID0gbGliYnBmX251bV9wb3NzaWJsZV9jcHVzKCk7XFxuK1xcdGlmICghQVNTRVJUX0dUKG5yX2NwdXMsIDAsIFxcXCJwb3NzaWJsZSBjcHVzXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0c2tlbCA9IGJwZnRvb2xfcmluZ2J1Zl9fb3BlbigpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcIm9wZW5cXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cXHUwMDNlbWFwcy5yaW5nYnVmLCBnZXRwYWdlc2l6ZSgpKTtcXG4rXFx0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXFx1MDAzZW1hcHMucGVyZmJ1ZiwgbnJfY3B1cyk7XFxuK1xcdGlmICghQVNTRVJUX09LKGJwZnRvb2xfcmluZ2J1Zl9fbG9hZChza2VsKSwgXFxcImxvYWRcXFwiKSB8fFxcbitcXHQgICAgIWNvbnN1bWVyX3N0YXJ0KFxcdTAwMjZjaGlsZCwgYnBmX21hcF9fZmQoc2tlbC1cXHUwMDNlbWFwcy5wZXJmYnVmKSwgZmFsc2UsXFxuK1xcdFxcdFxcdCAgICBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8ICFjb25zdW1lcl9yZWFkeShcXHUwMDI2Y2hpbGQpIHx8XFxuK1xcdCAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMykpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHQvKiBPbmUgbGFyZ2UgcmVjb3JkIGZsdXNoZXMgdGhlIGV4aXN0aW5nIGJ1ZmZlcmVkIHBlcmYgb3V0cHV0IGNhbGxiYWNrLiAqL1xcbitcXHRwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSBjaGlsZC5mZCwgLmV2ZW50cyA9IFBPTExJTiB9O1xcbitcXHRpZiAoIUFTU0VSVF9HVChwb2xsKFxcdTAwMjZwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCksIDAsXFxuK1xcdFxcdCAgICAgICBcXFwicGVyZiByZWNvcmQgb3V0cHV0XFxcIikgfHxcXG4rXFx0ICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyBcXHUwMDI2IFBPTExJTiwgXFxcInBlcmYgb3V0cHV0IHJlYWRhYmxlXFxcIikgfHxcXG4rXFx0ICAgICFjb25zdW1lcl9maW5pc2goXFx1MDAyNmNoaWxkLCBTSUdJTlQsIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZmllbGRzID0gc3NjYW5mKG91dHB1dCwgXFxcIj09IEAlbGx1LiVsbHUgQ1BVOiAlZCBpbmRleDogJWQgPT09PT1cXFxcbiVuXFxcIixcXG4rXFx0XFx0XFx0XFx1MDAyNnNlY29uZHMsIFxcdTAwMjZuYW5vc2Vjb25kcywgXFx1MDAyNmNwdSwgXFx1MDAyNmluZGV4LCBcXHUwMDI2b2Zmc2V0KTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoZmllbGRzLCA0LCBcXFwicGVyZiBoZWFkZXJcXFwiKSB8fFxcbitcXHQgICAgIUFTU0VSVF9HVChvZmZzZXQsIDAsIFxcXCJwZXJmIHBheWxvYWQgb2Zmc2V0XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRBU1NFUlRfR1Qoc2Vjb25kcyAqIDEwMDAwMDAwMDBVTEwgKyBuYW5vc2Vjb25kcywgMCwgXFxcInBlcmYgdGltZXN0YW1wXFxcIik7XFxuK1xcdEFTU0VSVF9MVChuYW5vc2Vjb25kcywgMTAwMDAwMDAwMFVMTCwgXFxcInBlcmYgdGltZXN0YW1wIG5hbm9zZWNvbmRzXFxcIik7XFxuK1xcdEFTU0VSVF9HRShjcHUsIDAsIFxcXCJwZXJmIGNwdVxcXCIpO1xcbitcXHRBU1NFUlRfTFQoY3B1LCBucl9jcHVzLCBcXFwicGVyZiBjcHUgcmFuZ2VcXFwiKTtcXG4rXFx0QVNTRVJUX0VRKGluZGV4LCBjcHUsIFxcXCJwZXJmIGluZGV4XFxcIik7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBzaXplb2Yoc2tlbC1cXHUwMDNlcm9kYXRhLVxcdTAwM2VwZXJmX3BheWxvYWQpOyBpKyspIHtcXG4rXFx0XFx0Y29uc3QgY2hhciAqc2VwYXJhdG9yID0gIWkgPyBcXFwiXFxcIiA6ICEoaSAlIDE2KSA/IFxcXCJcXFxcblxcXCIgOlxcbitcXHRcXHRcXHRcXHRcXHQhKGkgJSA4KSA/IFxcXCIgIFxcXCIgOiBcXFwiIFxcXCI7XFxuK1xcbitcXHRcXHR1c2VkICs9IHNucHJpbnRmKGV4cGVjdGVkICsgdXNlZCwgc2l6ZW9mKGV4cGVjdGVkKSAtIHVzZWQsXFxuK1xcdFxcdFxcdFxcdCBcXFwiJXMlMDJ4XFxcIiwgc2VwYXJhdG9yLCBpID09IDEgPyAweGZmIDogMCk7XFxuK1xcdH1cXG4rXFx0c25wcmludGYoZXhwZWN0ZWQgKyB1c2VkLCBzaXplb2YoZXhwZWN0ZWQpIC0gdXNlZCwgXFxcIlxcXFxuXFxcIik7XFxuK1xcdEFTU0VSVF9TVFJFUShvdXRwdXQgKyBvZmZzZXQsIGV4cGVjdGVkLCBcXFwicGVyZiBwYXlsb2FkXFxcIik7XFxuK291dDpcXG4rXFx0Y29uc3VtZXJfY2xlYW51cChcXHUwMDI2Y2hpbGQpO1xcbitcXHRicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfcmVqZWN0KGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbiwgYm9vbCBwYWlyLCBib29sIGpzb24pXFxuK3tcXG4rXFx0c3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07XFxuK1xcdGJvb2wgcmluZyA9IHR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgfHwgdHlwZSA9PSBCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGO1xcbitcXHRjb25zdCBjaGFyICpleHBlY3RlZCA9IG9wdGlvbiA/XFxuK1xcdFxcdFxcXCJ7XFxcXFxcXCJlcnJvclxcXFxcXFwiOlxcXFxcXFwicmluZyBidWZmZXIgbWFwcyBkbyBub3Qgc3VwcG9ydCBjcHUgb3IgaW5kZXggYXJndW1lbnRzXFxcXFxcXCJ9XFxcIiA6XFxuK1xcdFxcdFxcXCJ7XFxcXFxcXCJlcnJvclxcXFxcXFwiOlxcXFxcXFwibWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcXFxcXFxcIn1cXFwiO1xcbitcXHRjaGFyIG91dHB1dFs0MDk2XTtcXG4rXFx0aW50IGZkO1xcbitcXG4rXFx0ZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBOVUxMLCByaW5nID8gMCA6IDQsIHJpbmcgPyAwIDogNCxcXG4rXFx0XFx0XFx0ICAgIHJpbmcgPyBnZXRwYWdlc2l6ZSgpIDogMSwgTlVMTCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwiY3JlYXRlIG1hcFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlmIChjb25zdW1lcl9zdGFydChcXHUwMDI2Y2hpbGQsIGZkLCBqc29uLCBvcHRpb24sIHBhaXIsIHRydWUpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBjb25zdW1lcl9maW5pc2goXFx1MDAyNmNoaWxkLCAwLCBmYWxzZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpIHtcXG4rXFx0XFx0aWYgKGpzb24pXFxuK1xcdFxcdFxcdGNoZWNrX2pzb24ob3V0cHV0LCBleHBlY3RlZCk7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0QVNTRVJUX0dUKHN0cmxlbihvdXRwdXQpLCAwLCBcXFwiZXJyb3IgZGlhZ25vc3RpY1xcXCIpO1xcbitcXHR9XFxuK1xcdGNvbnN1bWVyX2NsZWFudXAoXFx1MDAyNmNoaWxkKTtcXG4rXFx0Y2xvc2UoZmQpO1xcbit9XFxuK1xcbit2b2lkIHRlc3RfYnBmdG9vbF9yaW5nYnVmKHZvaWQpXFxuK3tcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInBlcmZfZXZlbnRfYXJyYXlcXFwiKSlcXG4rXFx0XFx0dGVzdF9wZXJmX2NvbnN1bWVyKCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJwbGFpblxcXCIpKVxcbitcXHRcXHR0ZXN0X2NvbnN1bWVyKGZhbHNlLCBmYWxzZSwgU0lHSU5UKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImpzb25cXFwiKSlcXG4rXFx0XFx0dGVzdF9jb25zdW1lcih0cnVlLCBmYWxzZSwgU0lHVEVSTSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJpZGxlX3NpZ2ludFxcXCIpKVxcbitcXHRcXHR0ZXN0X2NvbnN1bWVyKGZhbHNlLCB0cnVlLCBTSUdJTlQpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiaWRsZV9zaWd0ZXJtX2pzb25cXFwiKSlcXG4rXFx0XFx0dGVzdF9jb25zdW1lcih0cnVlLCB0cnVlLCBTSUdURVJNKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInJlamVjdF9hcnJheVxcXCIpKVxcbitcXHRcXHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfQVJSQVksIE5VTEwsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyZWplY3RfdXNlcl9yaW5nYnVmXFxcIikpXFxuK1xcdFxcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyZWplY3RfY3B1XFxcIikpXFxuK1xcdFxcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCBcXFwiY3B1XFxcIiwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInJlamVjdF9pbmRleFxcXCIpKVxcbitcXHRcXHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXFxcImluZGV4XFxcIiwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInJlamVjdF9jcHVfaW5kZXhcXFwiKSlcXG4rXFx0XFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFxcXCJjcHVcXFwiLCB0cnVlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyZWplY3RfdXNlcl9yaW5nYnVmX2pzb25cXFwiKSlcXG4rXFx0XFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRiwgTlVMTCwgZmFsc2UsIHRydWUpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicmVqZWN0X2NwdV9pbmRleF9qc29uXFxcIikpXFxuK1xcdFxcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCBcXFwiY3B1XFxcIiwgdHJ1ZSwgdHJ1ZSk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi5iYmJjOTNjMzBhODMzXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9icGZ0b29sX3JpbmdidWYuY1xcbkBAIC0wLDAgKzEsNDcgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JwZi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcXHUwMDNlXFxuK1xcbitzdHJ1Y3Qge1xcbitcXHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1JJTkdCVUYpO1xcbit9IHJpbmdidWYgU0VDKFxcXCIubWFwc1xcXCIpO1xcbitcXG4rc3RydWN0IHtcXG4rXFx0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKTtcXG4rXFx0X191aW50KGtleV9zaXplLCBzaXplb2YoX191MzIpKTtcXG4rXFx0X191aW50KHZhbHVlX3NpemUsIHNpemVvZihfX3UzMikpO1xcbitcXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xcbit9IHBlcmZidWYgU0VDKFxcXCIubWFwc1xcXCIpO1xcbitcXG4rLypcXG4rICogSW5jbHVkZSB0aGUgdTMyIHJhdyBzaXplIGluIHBlcmYncyA4LWJ5dGUgYWxpZ25tZW50IHRvIGF2b2lkIHBhZGRpbmcuXFxuKyAqIEtlZXAgcGxhaW4gb3V0cHV0IGxhcmdlIGVub3VnaCB0byBmbHVzaCBzdGRpbyBiZWZvcmUgdGhlIGNvbnN1bWVyIGV4aXRzLlxcbisgKi9cXG4rY29uc3QgdW5zaWduZWQgY2hhciBwZXJmX3BheWxvYWRbNDA5Ml0gPSB7IDB4MDAsIDB4ZmYgfTtcXG4rXFxuK2ludCByZWNvcmQ7XFxuK2ludCBvdXRwdXRfZXJyO1xcbitcXG4rU0VDKFxcXCJzb2NrZXRcXFwiKVxcbitpbnQgcHJvZHVjZShzdHJ1Y3QgX19za19idWZmICpza2IpXFxuK3tcXG4rXFx0dW5zaWduZWQgY2hhciBmaXJzdFtdID0geyAweDAwLCAweGZmIH07XFxuK1xcdHVuc2lnbmVkIGNoYXIgc2Vjb25kW10gPSB7IDEsIDIsIDMsIDQsIDUgfTtcXG4rXFx0dW5zaWduZWQgY2hhciB0aGlyZFtdID0ge1xcbitcXHRcXHQweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LFxcbitcXHRcXHQweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAweDIwLFxcbitcXHR9O1xcbitcXG4rXFx0aWYgKHJlY29yZCA9PSAwKVxcbitcXHRcXHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFxcdTAwMjZyaW5nYnVmLCBmaXJzdCwgc2l6ZW9mKGZpcnN0KSwgMCk7XFxuK1xcdGVsc2UgaWYgKHJlY29yZCA9PSAxKVxcbitcXHRcXHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFxcdTAwMjZyaW5nYnVmLCBzZWNvbmQsIHNpemVvZihzZWNvbmQpLCAwKTtcXG4rXFx0ZWxzZSBpZiAocmVjb3JkID09IDIpXFxuK1xcdFxcdG91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoXFx1MDAyNnJpbmdidWYsIHRoaXJkLCBzaXplb2YodGhpcmQpLCAwKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRvdXRwdXRfZXJyID0gYnBmX3BlcmZfZXZlbnRfb3V0cHV0KHNrYiwgXFx1MDAyNnBlcmZidWYsIEJQRl9GX0NVUlJFTlRfQ1BVLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAodm9pZCAqKXBlcmZfcGF5bG9hZCwgc2l6ZW9mKHBlcmZfcGF5bG9hZCkpO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rY2hhciBMSUNFTlNFW10gU0VDKFxcXCJsaWNlbnNlXFxcIikgPSBcXFwiR1BMXFxcIjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDI6MjA6MzIuNTczNTEzMjE4WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo0NTMzMDM3Mjg4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzZXJpZXMgZXhjbHVzaXZlbHkgbW9kaWZpZXMgdXNlci1zcGFjZSB0b29saW5nIChicGZ0b29sKSBhbmQgc2VsZnRlc3RzIHVuZGVyIHRoZSB0b29scy8gZGlyZWN0b3J5ICh0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmKS4gTm8ga2VybmVsIHJ1bnRpbWUgY29kZSwgbW9kdWxlcywgb3Igdm1saW51eCBpbWFnZXMgYXJlIG1vZGlmaWVkLCBzbyB0aGlzIGNoYW5nZSBkb2VzIG5vdCB3YXJyYW50IHN5emthbGxlciBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBhMmQxYzVhNjAyODc5ZDM3OTk1ZjMwMWMwMjBkY2NlZjBiMzBkMmI4XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAwMjoyMDoyOCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLmM0NGU2Zjc5N2U1NzcgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbkBAIC0xMjAsNyArMTIwLDggQEAgYnBmdG9vbCBtYXAgcGluICAgICAqTUFQKiAgKkZJTEUqXG4gICAgIGNoYXJhY3RlciAoJy4nKSwgd2hpY2ggaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHRlbnNpb25zIG9mICpicGZmcyouXG4gXG4gYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdXG4tICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogbWFwLlxuKyAgICBSZWFkIGV2ZW50cyBmcm9tIGEgKipCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSoqIG9yXG4rICAgICoqQlBGX01BUF9UWVBFX1JJTkdCVUYqKiBtYXAuXG4gXG4gICAgIEluc3RhbGwgcGVyZiByaW5ncyBpbnRvIGEgcGVyZiBldmVudCBhcnJheSBtYXAgYW5kIGR1bXAgb3V0cHV0IG9mIGFueVxuICAgICAqKmJwZl9wZXJmX2V2ZW50X291dHB1dCoqXFwgKCkgY2FsbCBpbiB0aGUga2VybmVsLiBCeSBkZWZhdWx0IHJlYWQgdGhlXG5AQCAtMTM0LDYgKzEzNSwxOCBAQCBicGZ0b29sIG1hcCBldmVudF9waXBlICpNQVAqIFtjcHUgKk4qIGluZGV4ICpNKl1cbiAgICAgZXhpc3RpbmcgcmluZy4gIEFueSBvdGhlciBhcHBsaWNhdGlvbiB3aWxsIHN0b3AgcmVjZWl2aW5nIGV2ZW50cyBpZiBpdFxuICAgICBpbnN0YWxsZWQgaXRzIHJpbmdzIGVhcmxpZXIuXG4gXG4rICAgIEZvciBhIHJpbmcgYnVmZmVyIG1hcCwgY29uc3VtZSByZWNvcmRzIHN1Ym1pdHRlZCBieSBCUEYgcHJvZ3JhbXMsIGluY2x1ZGluZ1xuKyAgICByZWNvcmRzIGFscmVhZHkgcXVldWVkIGJlZm9yZSB0aGUgY29tbWFuZCBzdGFydHMuICoqY3B1KiogYW5kICoqaW5kZXgqKlxuKyAgICBhcmUgbm90IHN1cHBvcnRlZC4gRWFjaCByZWNvcmQgaXMgcHJpbnRlZCBhcyByYXcgYnl0ZXMsIGluY2x1ZGluZyBlbWJlZGRlZFxuKyAgICB6ZXJvIGJ5dGVzLiBQbGFpbiBvdXRwdXQgcmVwb3J0cyB0aGUgcmVjb3JkIHNpemUgZm9sbG93ZWQgYnkgaGV4YWRlY2ltYWxcbisgICAgYnl0ZXM7IEpTT04gb3V0cHV0IGNvbnRhaW5zICoqc2l6ZSoqIGFuZCAqKmRhdGEqKiBmaWVsZHMsIHdpdGggKipkYXRhKiogYW5cbisgICAgYXJyYXkgb2YgYnl0ZSB2YWx1ZXMuIFJpbmcgYnVmZmVyIHJlY29yZHMgaGF2ZSBubyBpbXBsaWNpdCBDUFUgb3IgdGltZXN0YW1wLlxuK1xuKyAgICBSaW5nIGJ1ZmZlcnMgc3VwcG9ydCBhIHNpbmdsZSBjb25zdW1lci4gVGhpcyBjb21tYW5kIGFkdmFuY2VzIHRoZSBzaGFyZWRcbisgICAgY29uc3VtZXIgcG9zaXRpb24gYW5kIG11c3Qgbm90IHJ1biBhbG9uZ3NpZGUgYW5vdGhlciBjb25zdW1lciBvZiB0aGUgc2FtZVxuKyAgICBtYXA7IGl0IGRvZXMgbm90IHByb3ZpZGUgYSBwYXNzaXZlIHZpZXcgb2YgZXZlbnRzLiAqKkJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYqKlxuKyAgICBtYXBzIGFyZSBub3Qgc3VwcG9ydGVkLlxuK1xuIGJwZnRvb2wgbWFwIHBlZWsgICpNQVAqXG4gICAgIFBlZWsgbmV4dCB2YWx1ZSBpbiB0aGUgcXVldWUgb3Igc3RhY2suXG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxuaW5kZXggNzVjYmNiNTEyZWJhZS4uMTc1MGI0ODhjOWUzYiAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxuQEAgLTg3OCwxMSArODc4LDExIEBAIF9icGZ0b29sKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOztcbiAgICAgICAgICAgICAgICAgICAgICAgICBpZClcbi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgcGVyZl9ldmVudF9hcnJheVxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX2lkc19mb3JfdHlwZSAnXCJ0eXBlXCI6IFwiXFwocGVyZl9ldmVudF9hcnJheVxcfHJpbmdidWZcXClcIidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOztcbiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKVxuLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX25hbWVzX2Zvcl90eXBlIHBlcmZfZXZlbnRfYXJyYXlcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9uYW1lc19mb3JfdHlwZSAnXCJ0eXBlXCI6IFwiXFwocGVyZl9ldmVudF9hcnJheVxcfHJpbmdidWZcXClcIidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOztcbiAgICAgICAgICAgICAgICAgICAgICAgICBjcHUpXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jXG5pbmRleCBiY2I3NjdlMmQ2NzMzLi43ZDU1NTMzMWY0NDNhIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmNcbkBAIC0yNyw3ICsyNyw3IEBAXG4gXG4gI2RlZmluZSBNTUFQX1BBR0VfQ05UXHQxNlxuIFxuLXN0YXRpYyB2b2xhdGlsZSBib29sIHN0b3A7XG4rc3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBzdG9wO1xuIFxuIHN0cnVjdCBwZXJmX2V2ZW50X3NhbXBsZSB7XG4gXHRzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgaGVhZGVyO1xuQEAgLTQ0LDcgKzQ0LDYgQEAgc3RydWN0IHBlcmZfZXZlbnRfbG9zdCB7XG4gXG4gc3RhdGljIHZvaWQgaW50X2V4aXQoaW50IHNpZ25vKVxuIHtcbi1cdGZwcmludGYoc3RkZXJyLCBcIlN0b3BwaW5nLi4uXFxuXCIpO1xuIFx0c3RvcCA9IHRydWU7XG4gfVxuIFxuQEAgLTEwNyw2ICsxMDYsMjcgQEAgcHJpbnRfYnBmX291dHB1dCh2b2lkICpwcml2YXRlX2RhdGEsIGludCBjcHUsIHN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciAqZXZlbnQpXG4gXHRyZXR1cm4gTElCQlBGX1BFUkZfRVZFTlRfQ09OVDtcbiB9XG4gXG4rc3RhdGljIGludCBwcmludF9yaW5nYnVmX291dHB1dCh2b2lkICpjdHgsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKVxuK3tcbitcdGlmIChqc29uX291dHB1dCkge1xuK1x0XHRqc29ud19zdGFydF9vYmplY3QoanNvbl93dHIpO1xuK1x0XHRqc29ud191aW50X2ZpZWxkKGpzb25fd3RyLCBcInNpemVcIiwgc2l6ZSk7XG4rXHRcdGpzb253X25hbWUoanNvbl93dHIsIFwiZGF0YVwiKTtcbitcdFx0cHJpbnRfZGF0YV9qc29uKGRhdGEsIHNpemUpO1xuK1x0XHRqc29ud19lbmRfb2JqZWN0KGpzb25fd3RyKTtcbitcdH0gZWxzZSB7XG4rXHRcdHByaW50ZihcIj09IHNpemU6ICV6dSA9PT09PVxcblwiLCBzaXplKTtcbitcdFx0ZnByaW50X2hleChzdGRvdXQsIGRhdGEsIHNpemUsIFwiIFwiKTtcbitcdFx0cHJpbnRmKFwiXFxuXCIpO1xuK1x0fVxuK1xuK1x0aWYgKGZmbHVzaChzdGRvdXQpKVxuK1x0XHRyZXR1cm4gZXJybm8gPyAtZXJybm8gOiAtRUlPO1xuK1xuK1x0LyogQSBwcm9kdWNlciBjYW4ga2VlcCBwb2xsKCkgYnVzeSBldmVuIGFmdGVyIGEgc2lnbmFsIGFycml2ZXMuICovXG4rXHRyZXR1cm4gc3RvcCA/IC1FSU5UUiA6IDA7XG4rfVxuK1xuIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiB7XG4gXHRzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIHBlcmZfYXR0ciA9IHtcbkBAIC0xMjMsMTggKzE0MywyNiBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdC5jcHUgPSAtMSxcbiBcdFx0LmlkeCA9IC0xLFxuIFx0fTtcbi1cdHN0cnVjdCBwZXJmX2J1ZmZlciAqcGI7XG4rXHRzdHJ1Y3QgcGVyZl9idWZmZXIgKnBiID0gTlVMTDtcbitcdHN0cnVjdCByaW5nX2J1ZmZlciAqcmIgPSBOVUxMO1xuIFx0X191MzIgbWFwX2luZm9fbGVuO1xuIFx0aW50IGVyciwgbWFwX2ZkO1xuIFxuK1x0c3RvcCA9IGZhbHNlO1xuIFx0bWFwX2luZm9fbGVuID0gc2l6ZW9mKG1hcF9pbmZvKTtcbiBcdG1hcF9mZCA9IG1hcF9wYXJzZV9mZF9hbmRfaW5mbyhcdTAwMjZhcmdjLCBcdTAwMjZhcmd2LCBcdTAwMjZtYXBfaW5mbywgXHUwMDI2bWFwX2luZm9fbGVuLFxuIFx0XHRcdFx0ICAgICAgIDApO1xuIFx0aWYgKG1hcF9mZCBcdTAwM2MgMClcbiBcdFx0cmV0dXJuIC0xO1xuIFxuLVx0aWYgKG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpIHtcbi1cdFx0cF9lcnIoXCJtYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheVwiKTtcbitcdGlmIChtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZIFx1MDAyNlx1MDAyNlxuK1x0ICAgIG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1JJTkdCVUYpIHtcbitcdFx0cF9lcnIoXCJtYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheSBvciByaW5nIGJ1ZmZlclwiKTtcbitcdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuK1x0fVxuK1xuK1x0aWYgKG1hcF9pbmZvLnR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgXHUwMDI2XHUwMDI2IGFyZ2MpIHtcbitcdFx0cF9lcnIoXCJyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHNcIik7XG4gXHRcdGdvdG8gZXJyX2Nsb3NlX21hcDtcbiBcdH1cbiBcbkBAIC0xODQsMTUgKzIxMiwyNCBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdGN0eC5pZHggPSAwO1xuIFx0fVxuIFxuLVx0b3B0cy5jcHVfY250ID0gY3R4LmFsbF9jcHVzID8gMCA6IDE7XG4tXHRvcHRzLmNwdXMgPSBcdTAwMjZjdHguY3B1O1xuLVx0b3B0cy5tYXBfa2V5cyA9IFx1MDAyNmN0eC5pZHg7XG4tXHRwYiA9IHBlcmZfYnVmZmVyX19uZXdfcmF3KG1hcF9mZCwgTU1BUF9QQUdFX0NOVCwgXHUwMDI2cGVyZl9hdHRyLFxuLVx0XHRcdFx0ICBwcmludF9icGZfb3V0cHV0LCBcdTAwMjZjdHgsIFx1MDAyNm9wdHMpO1xuLVx0aWYgKCFwYikge1xuLVx0XHRwX2VycihcImZhaWxlZCB0byBjcmVhdGUgcGVyZiBidWZmZXI6ICVzICglZClcIixcbi1cdFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XG4tXHRcdGdvdG8gZXJyX2Nsb3NlX21hcDtcbitcdGlmIChtYXBfaW5mby50eXBlID09IEJQRl9NQVBfVFlQRV9SSU5HQlVGKSB7XG4rXHRcdHJiID0gcmluZ19idWZmZXJfX25ldyhtYXBfZmQsIHByaW50X3JpbmdidWZfb3V0cHV0LCBOVUxMLCBOVUxMKTtcbitcdFx0aWYgKCFyYikge1xuK1x0XHRcdHBfZXJyKFwiZmFpbGVkIHRvIGNyZWF0ZSByaW5nIGJ1ZmZlcjogJXMgKCVkKVwiLFxuK1x0XHRcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xuK1x0XHRcdGdvdG8gZXJyX2Nsb3NlX21hcDtcbitcdFx0fVxuK1x0fSBlbHNlIHtcbitcdFx0b3B0cy5jcHVfY250ID0gY3R4LmFsbF9jcHVzID8gMCA6IDE7XG4rXHRcdG9wdHMuY3B1cyA9IFx1MDAyNmN0eC5jcHU7XG4rXHRcdG9wdHMubWFwX2tleXMgPSBcdTAwMjZjdHguaWR4O1xuK1x0XHRwYiA9IHBlcmZfYnVmZmVyX19uZXdfcmF3KG1hcF9mZCwgTU1BUF9QQUdFX0NOVCwgXHUwMDI2cGVyZl9hdHRyLFxuK1x0XHRcdFx0XHQgIHByaW50X2JwZl9vdXRwdXQsIFx1MDAyNmN0eCwgXHUwMDI2b3B0cyk7XG4rXHRcdGlmICghcGIpIHtcbitcdFx0XHRwX2VycihcImZhaWxlZCB0byBjcmVhdGUgcGVyZiBidWZmZXI6ICVzICglZClcIixcbitcdFx0XHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcbitcdFx0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4rXHRcdH1cbiBcdH1cbiBcbiBcdHNpZ25hbChTSUdJTlQsIGludF9leGl0KTtcbkBAIC0yMDIsMjUgKzIzOSwzMyBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRpZiAoanNvbl9vdXRwdXQpXG4gXHRcdGpzb253X3N0YXJ0X2FycmF5KGpzb25fd3RyKTtcbiBcbitcdGVyciA9IDA7XG4gXHR3aGlsZSAoIXN0b3ApIHtcbi1cdFx0ZXJyID0gcGVyZl9idWZmZXJfX3BvbGwocGIsIDIwMCk7XG4rXHRcdGVyciA9IHJiID8gcmluZ19idWZmZXJfX3BvbGwocmIsIDIwMCkgOiBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTtcbiBcdFx0aWYgKGVyciBcdTAwM2MgMCBcdTAwMjZcdTAwMjYgZXJyICE9IC1FSU5UUikge1xuLVx0XHRcdHBfZXJyKFwicGVyZiBidWZmZXIgcG9sbGluZyBmYWlsZWQ6ICVzICglZClcIixcbi1cdFx0XHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcbi1cdFx0XHRnb3RvIGVycl9jbG9zZV9wYjtcbitcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCJFcnJvcjogJXMgYnVmZmVyIHBvbGxpbmcgZmFpbGVkOiAlcyAoJWQpXFxuXCIsXG4rXHRcdFx0XHRyYiA/IFwicmluZ1wiIDogXCJwZXJmXCIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTtcbitcdFx0XHRicmVhaztcbiBcdFx0fVxuK1x0XHRlcnIgPSAwO1xuIFx0fVxuIFxuK1x0aWYgKHN0b3ApXG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIlN0b3BwaW5nLi4uXFxuXCIpO1xuIFx0aWYgKGpzb25fb3V0cHV0KVxuIFx0XHRqc29ud19lbmRfYXJyYXkoanNvbl93dHIpO1xuK1x0aWYgKGZmbHVzaChzdGRvdXQpKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIkVycm9yOiBmYWlsZWQgdG8gd3JpdGUgZXZlbnRzOiAlc1xcblwiLCBzdHJlcnJvcihlcnJubykpO1xuK1x0XHRlcnIgPSAtMTtcbitcdH1cbiBcbitcdHJpbmdfYnVmZmVyX19mcmVlKHJiKTtcbiBcdHBlcmZfYnVmZmVyX19mcmVlKHBiKTtcbitcdC8qIEJvdGggYnVmZmVyIG1hbmFnZXJzIGJvcnJvdyBtYXBfZmQuICovXG4gXHRjbG9zZShtYXBfZmQpO1xuIFxuLVx0cmV0dXJuIDA7XG4rXHRyZXR1cm4gZXJyIFx1MDAzYyAwID8gLTEgOiAwO1xuIFxuLWVycl9jbG9zZV9wYjpcbi1cdHBlcmZfYnVmZmVyX19mcmVlKHBiKTtcbiBlcnJfY2xvc2VfbWFwOlxuIFx0Y2xvc2UobWFwX2ZkKTtcbiBcdHJldHVybiAtMTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMjA5OWJmMTAyMDkzMFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmNcbkBAIC0wLDAgKzEsMzgxIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisjaW5jbHVkZSBcdTAwM2NjdHlwZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3BvbGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3NpZ25hbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbisjaW5jbHVkZSBcImJwZnRvb2xfcmluZ2J1Zi5za2VsLmhcIlxuK1xuKyNkZWZpbmUgV0FJVF9TVEVQUyA1MDBcbisjZGVmaW5lIFdBSVRfVVMgMTAwMDBcbitcbitzdHJ1Y3QgY29uc3VtZXIge1xuK1x0cGlkX3QgcGlkO1xuK1x0aW50IGZkO1xuK307XG4rXG4rc3RhdGljIGNvbnN0IGNoYXIgKmJwZnRvb2xfcGF0aCh2b2lkKVxuK3tcbitcdGNvbnN0IGNoYXIgKnBhdGggPSBnZXRlbnYoXCJCUEZUT09MXCIpO1xuK1xuK1x0aWYgKHBhdGgpXG4rXHRcdHJldHVybiBhY2Nlc3MocGF0aCwgWF9PSykgPyBOVUxMIDogcGF0aDtcbitcdGlmICghYWNjZXNzKFwiLi90b29scy9zYmluL2JwZnRvb2xcIiwgWF9PSykpXG4rXHRcdHJldHVybiBcIi4vdG9vbHMvc2Jpbi9icGZ0b29sXCI7XG4rXHRpZiAoIWFjY2VzcyhcIi4uL3Rvb2xzL3NiaW4vYnBmdG9vbFwiLCBYX09LKSlcbitcdFx0cmV0dXJuIFwiLi4vdG9vbHMvc2Jpbi9icGZ0b29sXCI7XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIHZvaWQgY29uc3VtZXJfY2xlYW51cChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkKVxuK3tcbitcdGlmIChjaGlsZC1cdTAwM2VwaWQgXHUwMDNlIDApIHtcbitcdFx0a2lsbChjaGlsZC1cdTAwM2VwaWQsIFNJR0tJTEwpO1xuK1x0XHR3aGlsZSAod2FpdHBpZChjaGlsZC1cdTAwM2VwaWQsIE5VTEwsIDApIFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyA9PSBFSU5UUilcbitcdFx0XHQ7XG4rXHRcdGNoaWxkLVx1MDAzZXBpZCA9IC0xO1xuK1x0fVxuK1x0aWYgKGNoaWxkLVx1MDAzZWZkIFx1MDAzZT0gMCkge1xuK1x0XHRjbG9zZShjaGlsZC1cdTAwM2VmZCk7XG4rXHRcdGNoaWxkLVx1MDAzZWZkID0gLTE7XG4rXHR9XG4rfVxuK1xuK3N0YXRpYyBib29sIGNvbnN1bWVyX3N0YXJ0KHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBtYXBfZmQsIGJvb2wganNvbixcbitcdFx0XHQgICBjb25zdCBjaGFyICpvcHRpb24sIGJvb2wgcGFpciwgYm9vbCBjYXB0dXJlX2Vycm9ycylcbit7XG4rXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbitcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbitcdGNvbnN0IGNoYXIgKnBhdGggPSBicGZ0b29sX3BhdGgoKTtcbitcdGNoYXIgKmFyZ3ZbMTJdLCBpZFsxNl07XG4rXHRpbnQgb3V0WzJdLCByZWFkeVsyXSwgbiA9IDAsIGVyciwgZXJyX2ZkO1xuK1x0c3RydWN0IHBvbGxmZCBwZmQ7XG4rXG4rXHRpZiAoIUFTU0VSVF9PS19QVFIocGF0aCwgXCJicGZ0b29sIHBhdGggKHNldCBCUEZUT09MIHRvIG92ZXJyaWRlKVwiKSB8fFxuK1x0ICAgICFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChtYXBfZmQsIFx1MDAyNmluZm8sIFx1MDAyNmxlbiksIFwibWFwIGluZm9cIikpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdHNucHJpbnRmKGlkLCBzaXplb2YoaWQpLCBcIiV1XCIsIGluZm8uaWQpO1xuK1x0YXJndltuKytdID0gKGNoYXIgKilwYXRoO1xuK1x0aWYgKGpzb24pXG4rXHRcdGFyZ3ZbbisrXSA9IFwiLWpcIjtcbitcdGFyZ3ZbbisrXSA9IFwibWFwXCI7XG4rXHRhcmd2W24rK10gPSBcImV2ZW50X3BpcGVcIjtcbitcdGFyZ3ZbbisrXSA9IFwiaWRcIjtcbitcdGFyZ3ZbbisrXSA9IGlkO1xuK1x0aWYgKG9wdGlvbikge1xuK1x0XHRhcmd2W24rK10gPSAoY2hhciAqKW9wdGlvbjtcbitcdFx0YXJndltuKytdID0gXCIwXCI7XG4rXHRcdGlmIChwYWlyKSB7XG4rXHRcdFx0YXJndltuKytdID0gXCJpbmRleFwiO1xuK1x0XHRcdGFyZ3ZbbisrXSA9IFwiMFwiO1xuK1x0XHR9XG4rXHR9XG4rXHRhcmd2W25dID0gTlVMTDtcbitcdGlmICghQVNTRVJUX09LKHBpcGUyKG91dCwgT19DTE9FWEVDKSwgXCJvdXRwdXQgcGlwZVwiKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0aWYgKCFBU1NFUlRfT0socGlwZTIocmVhZHksIE9fQ0xPRVhFQyksIFwiZXhlYyBwaXBlXCIpKSB7XG4rXHRcdGNsb3NlKG91dFswXSk7XG4rXHRcdGNsb3NlKG91dFsxXSk7XG4rXHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcdGNoaWxkLVx1MDAzZXBpZCA9IGZvcmsoKTtcbitcdGlmICghY2hpbGQtXHUwMDNlcGlkKSB7XG4rXHRcdGNsb3NlKG91dFswXSk7XG4rXHRcdGNsb3NlKHJlYWR5WzBdKTtcbitcdFx0ZXJyX2ZkID0gY2FwdHVyZV9lcnJvcnMgPyBvdXRbMV0gOiBvcGVuKFwiL2Rldi9udWxsXCIsIE9fV1JPTkxZKTtcbitcdFx0aWYgKGR1cDIob3V0WzFdLCBTVERPVVRfRklMRU5PKSBcdTAwM2MgMCB8fFxuK1x0XHQgICAgZHVwMihlcnJfZmQsIFNUREVSUl9GSUxFTk8pIFx1MDAzYyAwKVxuK1x0XHRcdGdvdG8gZXhlY19mYWlsO1xuK1x0XHRpZiAoIWNhcHR1cmVfZXJyb3JzKVxuK1x0XHRcdGNsb3NlKGVycl9mZCk7XG4rXHRcdGNsb3NlKG91dFsxXSk7XG4rXHRcdGV4ZWN2KHBhdGgsIGFyZ3YpO1xuK2V4ZWNfZmFpbDpcbitcdFx0ZXJyID0gZXJybm87XG4rXHRcdHdyaXRlKHJlYWR5WzFdLCBcdTAwMjZlcnIsIHNpemVvZihlcnIpKTtcbitcdFx0X2V4aXQoMTI3KTtcbitcdH1cbitcdGNsb3NlKG91dFsxXSk7XG4rXHRjbG9zZShyZWFkeVsxXSk7XG4rXHRjaGlsZC1cdTAwM2VmZCA9IG91dFswXTtcbitcdHBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IHJlYWR5WzBdLCAuZXZlbnRzID0gUE9MTElOIH07XG4rXHQvKiBFT0Ygb24gdGhlIGNsb3NlLW9uLWV4ZWMgcGlwZSBkaXN0aW5ndWlzaGVzIGV4ZWMgZnJvbSBpbmhlcml0ZWQgaGFuZGxlcnMuICovXG4rXHRlcnIgPSBjaGlsZC1cdTAwM2VwaWQgXHUwMDNlIDAgPyBwb2xsKFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSA6IC0xO1xuK1x0aWYgKCFBU1NFUlRfR1QoY2hpbGQtXHUwMDNlcGlkLCAwLCBcImZvcmtcIikgfHxcbitcdCAgICAhQVNTRVJUX0dUKGVyciwgMCwgXCJleGVjIHRpbWVvdXRcIikgfHxcbitcdCAgICAhQVNTRVJUX0VRKHJlYWQocmVhZHlbMF0sIFx1MDAyNmVyciwgc2l6ZW9mKGVycikpLCAwLCBcImV4ZWNcIikpIHtcbitcdFx0Y2xvc2UocmVhZHlbMF0pO1xuK1x0XHRjb25zdW1lcl9jbGVhbnVwKGNoaWxkKTtcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1x0Y2xvc2UocmVhZHlbMF0pO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBib29sIGNvbnN1bWVyX2ZpbmlzaChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkLCBpbnQgc2lnbm8sIGJvb2wgc3VjY2VzcyxcbitcdFx0XHQgICAgY2hhciAqb3V0cHV0LCBzaXplX3Qgc2l6ZSlcbit7XG4rXHRpbnQgc3RhdHVzID0gMCwgaTtcbitcdHBpZF90IHJldCA9IDA7XG4rXHRzc2l6ZV90IG47XG4rXHRzaXplX3QgdXNlZCA9IDA7XG4rXG4rXHRpZiAoIUFTU0VSVF9PSyhmY250bChjaGlsZC1cdTAwM2VmZCwgRl9TRVRGTCwgT19OT05CTE9DSyksIFwibm9uYmxvY2tpbmcgb3V0cHV0XCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRpZiAoc2lnbm8gXHUwMDI2XHUwMDI2ICFBU1NFUlRfT0soa2lsbChjaGlsZC1cdTAwM2VwaWQsIHNpZ25vKSwgXCJzaWduYWwgY29uc3VtZXJcIikpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFdBSVRfU1RFUFM7IGkrKykge1xuK1x0XHR3aGlsZSAodXNlZCBcdTAwM2Mgc2l6ZSAtIDEgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICAgICAobiA9IHJlYWQoY2hpbGQtXHUwMDNlZmQsIG91dHB1dCArIHVzZWQsIHNpemUgLSAxIC0gdXNlZCkpIFx1MDAzZSAwKVxuK1x0XHRcdHVzZWQgKz0gbjtcbitcdFx0cmV0ID0gd2FpdHBpZChjaGlsZC1cdTAwM2VwaWQsIFx1MDAyNnN0YXR1cywgV05PSEFORyk7XG4rXHRcdGlmIChyZXQgPT0gY2hpbGQtXHUwMDNlcGlkKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyAhPSBFSU5UUilcbitcdFx0XHRicmVhaztcbitcdFx0dXNsZWVwKFdBSVRfVVMpO1xuK1x0fVxuK1x0aWYgKCFBU1NFUlRfRVEocmV0LCBjaGlsZC1cdTAwM2VwaWQsIFwiYm91bmRlZCBjb25zdW1lciBleGl0XCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRjaGlsZC1cdTAwM2VwaWQgPSAtMTtcbitcdHdoaWxlICh1c2VkIFx1MDAzYyBzaXplIC0gMSBcdTAwMjZcdTAwMjYgKG4gPSByZWFkKGNoaWxkLVx1MDAzZWZkLCBvdXRwdXQgKyB1c2VkLCBzaXplIC0gMSAtIHVzZWQpKSBcdTAwM2UgMClcbitcdFx0dXNlZCArPSBuO1xuK1x0b3V0cHV0W3VzZWRdID0gJ1xcMCc7XG4rXHRyZXR1cm4gQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwibm9ybWFsIGV4aXRcIikgXHUwMDI2XHUwMDI2XG4rXHQgICAgICAgQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cykgPT0gMCwgc3VjY2VzcywgXCJleGl0IHN0YXR1c1wiKTtcbit9XG4rXG4rc3RhdGljIGJvb2wgY29uc3VtZXJfcmVhZHkoc3RydWN0IGNvbnN1bWVyICpjaGlsZClcbit7XG4rXHR1bnNpZ25lZCBsb25nIGxvbmcgY2F1Z2h0O1xuK1x0Y2hhciBwYXRoWzY0XSwgbGluZVsyNTZdO1xuK1x0aW50IGk7XG4rXHRGSUxFICpmO1xuK1xuK1x0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBcIi9wcm9jLyVkL3N0YXR1c1wiLCBjaGlsZC1cdTAwM2VwaWQpO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgV0FJVF9TVEVQUzsgaSsrKSB7XG4rXHRcdGYgPSBmb3BlbihwYXRoLCBcInJcIik7XG4rXHRcdGlmICghZilcbitcdFx0XHRicmVhaztcbitcdFx0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHtcbitcdFx0XHRpZiAoc3NjYW5mKGxpbmUsIFwiU2lnQ2d0OiAlbGx4XCIsIFx1MDAyNmNhdWdodCkgPT0gMSBcdTAwMjZcdTAwMjZcbitcdFx0XHQgICAgKGNhdWdodCBcdTAwMjYgKDFVTEwgXHUwMDNjXHUwMDNjIChTSUdJTlQgLSAxKSkpIFx1MDAyNlx1MDAyNlxuK1x0XHRcdCAgICAoY2F1Z2h0IFx1MDAyNiAoMVVMTCBcdTAwM2NcdTAwM2MgKFNJR1RFUk0gLSAxKSkpKSB7XG4rXHRcdFx0XHRmY2xvc2UoZik7XG4rXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0XHR9XG4rXHRcdH1cbitcdFx0ZmNsb3NlKGYpO1xuK1x0XHR1c2xlZXAoV0FJVF9VUyk7XG4rXHR9XG4rXHRyZXR1cm4gQVNTRVJUX1RSVUUoZmFsc2UsIFwiY29uc3VtZXIgc2lnbmFsIGhhbmRsZXJzIHJlYWR5XCIpO1xuK31cbitcbitzdGF0aWMgYm9vbCBlbWl0X3JlY29yZChzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsLCBpbnQgcmVjb3JkKVxuK3tcbitcdGNoYXIgcGFja2V0WzY0XSA9IHt9O1xuK1xuK1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMsXG4rXHRcdCAgICAuZGF0YV9pbiA9IHBhY2tldCxcbitcdFx0ICAgIC5kYXRhX3NpemVfaW4gPSBzaXplb2YocGFja2V0KSxcbitcdCk7XG4rXG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNvcmQgPSByZWNvcmQ7XG4rXHRyZXR1cm4gQVNTRVJUX09LKGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MucHJvZHVjZSksXG4rXHRcdFx0XHRcdCAgICAgIFx1MDAyNm9wdHMpLCBcInByb2R1Y2UgcmVjb3JkXCIpIFx1MDAyNlx1MDAyNlxuK1x0ICAgICAgIEFTU0VSVF9PSyhza2VsLVx1MDAzZWJzcy1cdTAwM2VvdXRwdXRfZXJyLCBcInJpbmdidWYgb3V0cHV0XCIpO1xuK31cbitcbitzdGF0aWMgYm9vbCBjb25zdW1lZCh1bnNpZ25lZCBsb25nICpwb3NpdGlvbiwgdW5zaWduZWQgbG9uZyBleHBlY3RlZClcbit7XG4rXHRpbnQgaTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFdBSVRfU1RFUFM7IGkrKykge1xuK1x0XHRpZiAoX19hdG9taWNfbG9hZF9uKHBvc2l0aW9uLCBfX0FUT01JQ19BQ1FVSVJFKSA9PSBleHBlY3RlZClcbitcdFx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0dXNsZWVwKFdBSVRfVVMpO1xuK1x0fVxuK1x0cmV0dXJuIEFTU0VSVF9FUSgqcG9zaXRpb24sIGV4cGVjdGVkLCBcImNvbnN1bWVyIHBvc2l0aW9uXCIpO1xuK31cbitcbitzdGF0aWMgdm9pZCBjaGVja19qc29uKGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqZXhwZWN0ZWQpXG4re1xuK1x0Y2hhciAqc3JjID0gb3V0cHV0LCAqZHN0ID0gb3V0cHV0O1xuK1x0Ym9vbCBxdW90ZWQgPSBmYWxzZSwgZXNjYXBlZCA9IGZhbHNlO1xuK1xuK1x0LyogSWdub3JlIGZvcm1hdHRpbmcgd2hpdGVzcGFjZSB3aGlsZSBjaGVja2luZyB0aGUgZW50aXJlIEpTT04gZG9jdW1lbnQuICovXG4rXHR3aGlsZSAoKnNyYykge1xuK1x0XHRpZiAocXVvdGVkIHx8ICFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxuK1x0XHRcdCpkc3QrKyA9ICpzcmM7XG4rXHRcdGlmICghZXNjYXBlZCBcdTAwMjZcdTAwMjYgKnNyYyA9PSAnXCInKVxuK1x0XHRcdHF1b3RlZCA9ICFxdW90ZWQ7XG4rXHRcdGVzY2FwZWQgPSAhZXNjYXBlZCBcdTAwMjZcdTAwMjYgcXVvdGVkIFx1MDAyNlx1MDAyNiAqc3JjID09ICdcXFxcJztcbitcdFx0c3JjKys7XG4rXHR9XG4rXHQqZHN0ID0gJ1xcMCc7XG4rXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCJKU09OIHJlY29yZHNcIik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfY29uc3VtZXIoYm9vbCBqc29uLCBib29sIGlkbGUsIGludCBzaWdubylcbit7XG4rXHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcbitcdHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWw7XG4rXHR1bnNpZ25lZCBsb25nICpwb3NpdGlvbiA9IE1BUF9GQUlMRUQ7XG4rXHRpbnQgcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKSwgZmQ7XG4rXHRjaGFyIG91dHB1dFs0MDk2XTtcbitcdHN0cnVjdCBwb2xsZmQgcGZkO1xuK1xuK1x0c2tlbCA9IGJwZnRvb2xfcmluZ2J1Zl9fb3BlbigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwib3BlblwiKSlcbitcdFx0cmV0dXJuO1xuK1x0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXHUwMDNlbWFwcy5yaW5nYnVmLCBwYWdlX3NpemUpO1xuK1x0aWYgKCFBU1NFUlRfT0soYnBmdG9vbF9yaW5nYnVmX19sb2FkKHNrZWwpLCBcImxvYWRcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZmQgPSBicGZfbWFwX19mZChza2VsLVx1MDAzZW1hcHMucmluZ2J1Zik7XG4rXHRwb3NpdGlvbiA9IG1tYXAoTlVMTCwgcGFnZV9zaXplLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIGZkLCAwKTtcbitcdGlmICghQVNTRVJUX05FUShwb3NpdGlvbiwgTUFQX0ZBSUxFRCwgXCJjb25zdW1lciBtbWFwXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghaWRsZSBcdTAwMjZcdTAwMjYgKCFlbWl0X3JlY29yZChza2VsLCAwKSB8fCAhZW1pdF9yZWNvcmQoc2tlbCwgMSkpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghY29uc3VtZXJfc3RhcnQoXHUwMDI2Y2hpbGQsIGZkLCBqc29uLCBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8XG4rXHQgICAgIWNvbnN1bWVyX3JlYWR5KFx1MDAyNmNoaWxkKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIWlkbGUpIHtcbitcdFx0LyogQm90aCBwcmVmaWxsZWQgcmVjb3JkcyBvY2N1cHkgMTYgYnl0ZXMgaW5jbHVkaW5nIHRoZWlyIGhlYWRlcnMuICovXG4rXHRcdGlmICghY29uc3VtZWQocG9zaXRpb24sIDMyKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0cGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gY2hpbGQuZmQsIC5ldmVudHMgPSBQT0xMSU4gfTtcbitcdFx0aWYgKCFBU1NFUlRfR1QocG9sbChcdTAwMjZwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCksIDAsXG4rXHRcdFx0ICAgICAgIFwicmVjb3JkcyBmbHVzaGVkIGJlZm9yZSBleGl0XCIpIHx8XG4rXHRcdCAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgXHUwMDI2IFBPTExJTiwgXCJyZWNvcmQgb3V0cHV0IHJlYWRhYmxlXCIpIHx8XG4rXHRcdCAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMikgfHwgIWNvbnN1bWVkKHBvc2l0aW9uLCA2NCkpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRpZiAoIWNvbnN1bWVyX2ZpbmlzaChcdTAwMjZjaGlsZCwgc2lnbm8sIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmIChqc29uKVxuK1x0XHRjaGVja19qc29uKG91dHB1dCwgaWRsZSA/IFwiW11cIiA6XG4rXHRcdFx0ICAgXCJbe1xcXCJzaXplXFxcIjoyLFxcXCJkYXRhXFxcIjpbMCwyNTVdfSxcIlxuK1x0XHRcdCAgIFwie1xcXCJzaXplXFxcIjo1LFxcXCJkYXRhXFxcIjpbMSwyLDMsNCw1XX0sXCJcbitcdFx0XHQgICBcIntcXFwic2l6ZVxcXCI6MTcsXFxcImRhdGFcXFwiOlsxNiwxNywxOCwxOSwyMCwyMSwyMiwyMyxcIlxuK1x0XHRcdCAgIFwiMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzJdfV1cIik7XG4rXHRlbHNlXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyBcIlwiIDpcbitcdFx0XHQgICAgIFwiPT0gc2l6ZTogMiA9PT09PVxcbjAwIGZmXFxuXCJcbitcdFx0XHQgICAgIFwiPT0gc2l6ZTogNSA9PT09PVxcbjAxIDAyIDAzIDA0IDA1XFxuXCJcbitcdFx0XHQgICAgIFwiPT0gc2l6ZTogMTcgPT09PT1cXG4xMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAgXCJcbitcdFx0XHQgICAgIFwiMTggMTkgMWEgMWIgMWMgMWQgMWUgMWZcXG4yMFxcblwiLCBcInBsYWluIHJlY29yZHNcIik7XG4rb3V0OlxuK1x0Y29uc3VtZXJfY2xlYW51cChcdTAwMjZjaGlsZCk7XG4rXHRpZiAocG9zaXRpb24gIT0gTUFQX0ZBSUxFRClcbitcdFx0bXVubWFwKHBvc2l0aW9uLCBwYWdlX3NpemUpO1xuK1x0YnBmdG9vbF9yaW5nYnVmX19kZXN0cm95KHNrZWwpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X3BlcmZfY29uc3VtZXIodm9pZClcbit7XG4rXHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcbitcdHVuc2lnbmVkIGxvbmcgbG9uZyBzZWNvbmRzLCBuYW5vc2Vjb25kcztcbitcdHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWw7XG4rXHRjaGFyIG91dHB1dFsxNjM4NF0sIGV4cGVjdGVkWzE2Mzg0XTtcbitcdGludCBucl9jcHVzLCBjcHUsIGluZGV4LCBvZmZzZXQgPSAwLCBpLCB1c2VkID0gMCwgZmllbGRzO1xuK1x0c3RydWN0IHBvbGxmZCBwZmQ7XG4rXG4rXHRucl9jcHVzID0gbGliYnBmX251bV9wb3NzaWJsZV9jcHVzKCk7XG4rXHRpZiAoIUFTU0VSVF9HVChucl9jcHVzLCAwLCBcInBvc3NpYmxlIGNwdXNcIikpXG4rXHRcdHJldHVybjtcbitcdHNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcIm9wZW5cIikpXG4rXHRcdHJldHVybjtcbitcdGJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLVx1MDAzZW1hcHMucmluZ2J1ZiwgZ2V0cGFnZXNpemUoKSk7XG4rXHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cdTAwM2VtYXBzLnBlcmZidWYsIG5yX2NwdXMpO1xuK1x0aWYgKCFBU1NFUlRfT0soYnBmdG9vbF9yaW5nYnVmX19sb2FkKHNrZWwpLCBcImxvYWRcIikgfHxcbitcdCAgICAhY29uc3VtZXJfc3RhcnQoXHUwMDI2Y2hpbGQsIGJwZl9tYXBfX2ZkKHNrZWwtXHUwMDNlbWFwcy5wZXJmYnVmKSwgZmFsc2UsXG4rXHRcdFx0ICAgIE5VTEwsIGZhbHNlLCBmYWxzZSkgfHwgIWNvbnN1bWVyX3JlYWR5KFx1MDAyNmNoaWxkKSB8fFxuK1x0ICAgICFlbWl0X3JlY29yZChza2VsLCAzKSlcbitcdFx0Z290byBvdXQ7XG4rXHQvKiBPbmUgbGFyZ2UgcmVjb3JkIGZsdXNoZXMgdGhlIGV4aXN0aW5nIGJ1ZmZlcmVkIHBlcmYgb3V0cHV0IGNhbGxiYWNrLiAqL1xuK1x0cGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gY2hpbGQuZmQsIC5ldmVudHMgPSBQT0xMSU4gfTtcbitcdGlmICghQVNTRVJUX0dUKHBvbGwoXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApLCAwLFxuK1x0XHQgICAgICAgXCJwZXJmIHJlY29yZCBvdXRwdXRcIikgfHxcbitcdCAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgXHUwMDI2IFBPTExJTiwgXCJwZXJmIG91dHB1dCByZWFkYWJsZVwiKSB8fFxuK1x0ICAgICFjb25zdW1lcl9maW5pc2goXHUwMDI2Y2hpbGQsIFNJR0lOVCwgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZmllbGRzID0gc3NjYW5mKG91dHB1dCwgXCI9PSBAJWxsdS4lbGx1IENQVTogJWQgaW5kZXg6ICVkID09PT09XFxuJW5cIixcbitcdFx0XHRcdTAwMjZzZWNvbmRzLCBcdTAwMjZuYW5vc2Vjb25kcywgXHUwMDI2Y3B1LCBcdTAwMjZpbmRleCwgXHUwMDI2b2Zmc2V0KTtcbitcdGlmICghQVNTRVJUX0VRKGZpZWxkcywgNCwgXCJwZXJmIGhlYWRlclwiKSB8fFxuK1x0ICAgICFBU1NFUlRfR1Qob2Zmc2V0LCAwLCBcInBlcmYgcGF5bG9hZCBvZmZzZXRcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0QVNTRVJUX0dUKHNlY29uZHMgKiAxMDAwMDAwMDAwVUxMICsgbmFub3NlY29uZHMsIDAsIFwicGVyZiB0aW1lc3RhbXBcIik7XG4rXHRBU1NFUlRfTFQobmFub3NlY29uZHMsIDEwMDAwMDAwMDBVTEwsIFwicGVyZiB0aW1lc3RhbXAgbmFub3NlY29uZHNcIik7XG4rXHRBU1NFUlRfR0UoY3B1LCAwLCBcInBlcmYgY3B1XCIpO1xuK1x0QVNTRVJUX0xUKGNwdSwgbnJfY3B1cywgXCJwZXJmIGNwdSByYW5nZVwiKTtcbitcdEFTU0VSVF9FUShpbmRleCwgY3B1LCBcInBlcmYgaW5kZXhcIik7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzaXplb2Yoc2tlbC1cdTAwM2Vyb2RhdGEtXHUwMDNlcGVyZl9wYXlsb2FkKTsgaSsrKSB7XG4rXHRcdGNvbnN0IGNoYXIgKnNlcGFyYXRvciA9ICFpID8gXCJcIiA6ICEoaSAlIDE2KSA/IFwiXFxuXCIgOlxuK1x0XHRcdFx0XHQhKGkgJSA4KSA/IFwiICBcIiA6IFwiIFwiO1xuK1xuK1x0XHR1c2VkICs9IHNucHJpbnRmKGV4cGVjdGVkICsgdXNlZCwgc2l6ZW9mKGV4cGVjdGVkKSAtIHVzZWQsXG4rXHRcdFx0XHQgXCIlcyUwMnhcIiwgc2VwYXJhdG9yLCBpID09IDEgPyAweGZmIDogMCk7XG4rXHR9XG4rXHRzbnByaW50ZihleHBlY3RlZCArIHVzZWQsIHNpemVvZihleHBlY3RlZCkgLSB1c2VkLCBcIlxcblwiKTtcbitcdEFTU0VSVF9TVFJFUShvdXRwdXQgKyBvZmZzZXQsIGV4cGVjdGVkLCBcInBlcmYgcGF5bG9hZFwiKTtcbitvdXQ6XG4rXHRjb25zdW1lcl9jbGVhbnVwKFx1MDAyNmNoaWxkKTtcbitcdGJwZnRvb2xfcmluZ2J1Zl9fZGVzdHJveShza2VsKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9yZWplY3QoZW51bSBicGZfbWFwX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uLCBib29sIHBhaXIsIGJvb2wganNvbilcbit7XG4rXHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcbitcdGJvb2wgcmluZyA9IHR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgfHwgdHlwZSA9PSBCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGO1xuK1x0Y29uc3QgY2hhciAqZXhwZWN0ZWQgPSBvcHRpb24gP1xuK1x0XHRcIntcXFwiZXJyb3JcXFwiOlxcXCJyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHNcXFwifVwiIDpcbitcdFx0XCJ7XFxcImVycm9yXFxcIjpcXFwibWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcXFwifVwiO1xuK1x0Y2hhciBvdXRwdXRbNDA5Nl07XG4rXHRpbnQgZmQ7XG4rXG4rXHRmZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsIE5VTEwsIHJpbmcgPyAwIDogNCwgcmluZyA/IDAgOiA0LFxuK1x0XHRcdCAgICByaW5nID8gZ2V0cGFnZXNpemUoKSA6IDEsIE5VTEwpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwiY3JlYXRlIG1hcFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0aWYgKGNvbnN1bWVyX3N0YXJ0KFx1MDAyNmNoaWxkLCBmZCwganNvbiwgb3B0aW9uLCBwYWlyLCB0cnVlKSBcdTAwMjZcdTAwMjZcbitcdCAgICBjb25zdW1lcl9maW5pc2goXHUwMDI2Y2hpbGQsIDAsIGZhbHNlLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpKSkge1xuK1x0XHRpZiAoanNvbilcbitcdFx0XHRjaGVja19qc29uKG91dHB1dCwgZXhwZWN0ZWQpO1xuK1x0XHRlbHNlXG4rXHRcdFx0QVNTRVJUX0dUKHN0cmxlbihvdXRwdXQpLCAwLCBcImVycm9yIGRpYWdub3N0aWNcIik7XG4rXHR9XG4rXHRjb25zdW1lcl9jbGVhbnVwKFx1MDAyNmNoaWxkKTtcbitcdGNsb3NlKGZkKTtcbit9XG4rXG4rdm9pZCB0ZXN0X2JwZnRvb2xfcmluZ2J1Zih2b2lkKVxuK3tcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicGVyZl9ldmVudF9hcnJheVwiKSlcbitcdFx0dGVzdF9wZXJmX2NvbnN1bWVyKCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInBsYWluXCIpKVxuK1x0XHR0ZXN0X2NvbnN1bWVyKGZhbHNlLCBmYWxzZSwgU0lHSU5UKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwianNvblwiKSlcbitcdFx0dGVzdF9jb25zdW1lcih0cnVlLCBmYWxzZSwgU0lHVEVSTSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImlkbGVfc2lnaW50XCIpKVxuK1x0XHR0ZXN0X2NvbnN1bWVyKGZhbHNlLCB0cnVlLCBTSUdJTlQpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJpZGxlX3NpZ3Rlcm1fanNvblwiKSlcbitcdFx0dGVzdF9jb25zdW1lcih0cnVlLCB0cnVlLCBTSUdURVJNKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicmVqZWN0X2FycmF5XCIpKVxuK1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfQVJSQVksIE5VTEwsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJlamVjdF91c2VyX3JpbmdidWZcIikpXG4rXHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJlamVjdF9jcHVcIikpXG4rXHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCBcImNwdVwiLCBmYWxzZSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyZWplY3RfaW5kZXhcIikpXG4rXHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCBcImluZGV4XCIsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJlamVjdF9jcHVfaW5kZXhcIikpXG4rXHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCBcImNwdVwiLCB0cnVlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJlamVjdF91c2VyX3JpbmdidWZfanNvblwiKSlcbitcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRiwgTlVMTCwgZmFsc2UsIHRydWUpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyZWplY3RfY3B1X2luZGV4X2pzb25cIikpXG4rXHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCBcImNwdVwiLCB0cnVlLCB0cnVlKTtcbit9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYmJiYzkzYzMwYTgzM1xuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jXG5AQCAtMCwwICsxLDQ3IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUklOR0JVRik7XG4rfSByaW5nYnVmIFNFQyhcIi5tYXBzXCIpO1xuK1xuK3N0cnVjdCB7XG4rXHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpO1xuK1x0X191aW50KGtleV9zaXplLCBzaXplb2YoX191MzIpKTtcbitcdF9fdWludCh2YWx1ZV9zaXplLCBzaXplb2YoX191MzIpKTtcbitcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4rfSBwZXJmYnVmIFNFQyhcIi5tYXBzXCIpO1xuK1xuKy8qXG4rICogSW5jbHVkZSB0aGUgdTMyIHJhdyBzaXplIGluIHBlcmYncyA4LWJ5dGUgYWxpZ25tZW50IHRvIGF2b2lkIHBhZGRpbmcuXG4rICogS2VlcCBwbGFpbiBvdXRwdXQgbGFyZ2UgZW5vdWdoIHRvIGZsdXNoIHN0ZGlvIGJlZm9yZSB0aGUgY29uc3VtZXIgZXhpdHMuXG4rICovXG4rY29uc3QgdW5zaWduZWQgY2hhciBwZXJmX3BheWxvYWRbNDA5Ml0gPSB7IDB4MDAsIDB4ZmYgfTtcbitcbitpbnQgcmVjb3JkO1xuK2ludCBvdXRwdXRfZXJyO1xuK1xuK1NFQyhcInNvY2tldFwiKVxuK2ludCBwcm9kdWNlKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYilcbit7XG4rXHR1bnNpZ25lZCBjaGFyIGZpcnN0W10gPSB7IDB4MDAsIDB4ZmYgfTtcbitcdHVuc2lnbmVkIGNoYXIgc2Vjb25kW10gPSB7IDEsIDIsIDMsIDQsIDUgfTtcbitcdHVuc2lnbmVkIGNoYXIgdGhpcmRbXSA9IHtcbitcdFx0MHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNyxcbitcdFx0MHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCxcbitcdH07XG4rXG4rXHRpZiAocmVjb3JkID09IDApXG4rXHRcdG91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoXHUwMDI2cmluZ2J1ZiwgZmlyc3QsIHNpemVvZihmaXJzdCksIDApO1xuK1x0ZWxzZSBpZiAocmVjb3JkID09IDEpXG4rXHRcdG91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoXHUwMDI2cmluZ2J1Ziwgc2Vjb25kLCBzaXplb2Yoc2Vjb25kKSwgMCk7XG4rXHRlbHNlIGlmIChyZWNvcmQgPT0gMilcbitcdFx0b3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dChcdTAwMjZyaW5nYnVmLCB0aGlyZCwgc2l6ZW9mKHRoaXJkKSwgMCk7XG4rXHRlbHNlXG4rXHRcdG91dHB1dF9lcnIgPSBicGZfcGVyZl9ldmVudF9vdXRwdXQoc2tiLCBcdTAwMjZwZXJmYnVmLCBCUEZfRl9DVVJSRU5UX0NQVSxcbitcdFx0XHRcdFx0XHQgICAodm9pZCAqKXBlcmZfcGF5bG9hZCwgc2l6ZW9mKHBlcmZfcGF5bG9hZCkpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK2NoYXIgTElDRU5TRVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDI6MjA6MzIuNTczNTE1NjY5WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDUzMzAwNzQ5OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIEV2YWx1YXRpb246IFRoaXMgUGF0Y2ggU2VyaWVzKipcblxuT2theSwgbGV0J3Mgc2VlLiBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRvIGFzc2VzcyBpZiB0aGlzIHBhdGNoIHNlcmllcyB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLiBUaGUgZmlyc3Qgc3RlcCBpcyB0byBkaXZlIGludG8gdGhlIGRpZmYuIFRoZSBmaWxlcyB0b3VjaGVkIGFyZSBhbGwgbG9jYXRlZCBpbiBgdG9vbHMvYDogc3BlY2lmaWNhbGx5LCBgdG9vbHMvYnBmL2JwZnRvb2wvYCBhbmQgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9gLiBXZSBoYXZlOiBgRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RgLCB0aGUgYGJwZnRvb2xgIGJhc2ggY29tcGxldGlvbiBzY3JpcHQsIGBtYXBfcGVyZl9yaW5nLmNgIHdpdGhpbiBgYnBmdG9vbGAsIGFuZCBhIGZldyByZWxhdGVkIHRlc3RzIGluIHRoZSBgc2VsZnRlc3RzYCBkaXJlY3RvcnkuXG5cbk5vdywgbGV0J3MgZG91YmxlLWNoZWNrIHRoZSBmdXp6aW5nIGd1aWRlbGluZXMuIFNlY3Rpb24gMiBjbGVhcmx5IGxheXMgb3V0IHRoZSBcIm5lZ2F0aXZlIGNyaXRlcmlhXCIgLSB0aGUgY2FzZXMgd2hlcmUgd2UgKmRvbid0KiBmdXp6LiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgYWxpZ25zIHdpdGggdGhlIHJ1bGVzLiBUaGUgZ3VpZGVsaW5lcyBleHBsaWNpdGx5IHN0YXRlIHRoYXQgY2hhbmdlcyB3aXRoaW4gdXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyB0aGF0ICpkb24ndCogYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKGB2bWxpbnV4YCkgb3Iga2VybmVsIG1vZHVsZXMgYXJlIGEgbm8tZ28gZm9yIGZ1enppbmcuXG5cbkdpdmVuIHRoYXQgYWxsIHRoZSBtb2RpZmljYXRpb25zIGFyZSBzcXVhcmVseSB3aXRoaW4gdGhlIGB0b29scy9gIGRpcmVjdG9yeSwgc3BlY2lmaWNhbGx5IHdpdGhpbiBgYnBmdG9vbGAgKHdoaWNoIGlzIGEgdXNlci1zcGFjZSB0b29sKSBhbmQgdGhlIGFzc29jaWF0ZWQgQlBGIHNlbGZ0ZXN0cywgaXQgc2VlbXMgY2xlYXIgdGhpcyBmYWxscyB1bmRlciB0aGUgXCJub3Qgd29ydGggZnV6emluZ1wiIGNhdGVnb3J5LiBOb25lIG9mIHRoZXNlIGNoYW5nZXMgdG91Y2ggYW55IGtlcm5lbCBydW50aW1lIGNvZGUgKHRoZSBjcml0aWNhbCBgdm1saW51eGAgb3IgbW9kdWxlIGNvZGUpLiBJdCdzIGFsbCBzZWxmLWNvbnRhaW5lZC5cblxuVGhlcmVmb3JlLCBteSBmaW5hbCBjb25jbHVzaW9uIGlzIHRoYXQgYFdvcnRoRnV6emluZyA9IGZhbHNlYC4gQ29uc2VxdWVudGx5LCBgRm9jdXNTeW1ib2xzYCB3aWxsIGJlIGVtcHR5LCBhcyB3aWxsIGBFbmFibGVDb25maWdzYC4gVGhlIHJlYXNvbmluZyBpcyB0aGF0IHRoZSBwYXRjaCBzZXJpZXMgaXMgZW50aXJlbHkgY29uZmluZWQgdG8gdXNlci1zcGFjZSB0b29saW5nIGFuZCB0ZXN0cywgbGVhdmluZyB0aGUga2VybmVsIHJ1bnRpbWUgdW5hZmZlY3RlZC4gSSB3aWxsIG5vdyBjYWxsIGBzZXQtcmVzdWx0c2Agd2l0aCB0aGlzIGFuYWx5c2lzIGFuZCBtb3ZlIG9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTE5NCwiT3V0cHV0VG9rZW5zIjoxMDIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0OTksIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwMjoyMDozNy4xMDY1MjU2ODdaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyNDgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNlcmllcyBleGNsdXNpdmVseSBtb2RpZmllcyB1c2VyLXNwYWNlIHRvb2xpbmcgKGJwZnRvb2wpIGFuZCBzZWxmdGVzdHMgdW5kZXIgdGhlIHRvb2xzLyBkaXJlY3RvcnkgKHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYpLiBObyBrZXJuZWwgcnVudGltZSBjb2RlLCBtb2R1bGVzLCBvciB2bWxpbnV4IGltYWdlcyBhcmUgbW9kaWZpZWQsIHNvIHRoaXMgY2hhbmdlIGRvZXMgbm90IHdhcnJhbnQgc3l6a2FsbGVyIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzZXJpZXMgZXhjbHVzaXZlbHkgbW9kaWZpZXMgdXNlci1zcGFjZSB0b29saW5nIChicGZ0b29sKSBhbmQgc2VsZnRlc3RzIHVuZGVyIHRoZSB0b29scy8gZGlyZWN0b3J5ICh0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmKS4gTm8ga2VybmVsIHJ1bnRpbWUgY29kZSwgbW9kdWxlcywgb3Igdm1saW51eCBpbWFnZXMgYXJlIG1vZGlmaWVkLCBzbyB0aGlzIGNoYW5nZSBkb2VzIG5vdCB3YXJyYW50IHN5emthbGxlciBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDI6MjA6MzcuMTA2NTUyNTg3WiIsIlNlcSI6NSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI2MTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowdl8x6[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-07 01:24:10 +0000 UTC FinishedAt: 2026-09-07 02:20:37 +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+CgkJCTx0ZD4yMDI2LzA5LzA3IDAyOjIwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIGV4Y2x1c2l2ZWx5IG1vZGlmaWVzIHVzZXItc3BhY2UgdG9vbGluZyAoYnBmdG9vbCkgYW5kIHNlbGZ0ZXN0cyB1bmRlciB0aGUgdG9vbHMvIGRpcmVjdG9yeSAodG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZikuIE5vIGtlcm5lbCBydW50aW1lIGNvZGUsIG1vZHVsZXMsIG9yIHZtbGludXggaW1hZ2VzIGFyZSBtb2RpZmllZCwgc28gdGhpcyBjaGFuZ2UgZG9lcyBub3Qgd2FycmFudCBzeXprYWxsZXIgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDI6MjA8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBhMmQxYzVhNjAyODc5ZDM3OTk1ZjMwMWMwMjBkY2NlZjBiMzBkMmI4XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAwMjoyMDoyOCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdCBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5pbmRleCA1ZGFmM2RlNWM3NDQ2Li5jNDRlNmY3OTdlNTc3IDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5AQCAtMTIwLDcgJiM0MzsxMjAsOCBAQCBicGZ0b29sIG1hcCBwaW4gICAgICpNQVAqICAqRklMRSpcbiAgICAgY2hhcmFjdGVyICgmIzM5Oy4mIzM5OyksIHdoaWNoIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyBvZiAqYnBmZnMqLlxuIFxuIGJwZnRvb2wgbWFwIGV2ZW50X3BpcGUgKk1BUCogW2NwdSAqTiogaW5kZXggKk0qXVxuLSAgICBSZWFkIGV2ZW50cyBmcm9tIGEgKipCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSoqIG1hcC5cbiYjNDM7ICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogb3JcbiYjNDM7ICAgICoqQlBGX01BUF9UWVBFX1JJTkdCVUYqKiBtYXAuXG4gXG4gICAgIEluc3RhbGwgcGVyZiByaW5ncyBpbnRvIGEgcGVyZiBldmVudCBhcnJheSBtYXAgYW5kIGR1bXAgb3V0cHV0IG9mIGFueVxuICAgICAqKmJwZl9wZXJmX2V2ZW50X291dHB1dCoqXFwgKCkgY2FsbCBpbiB0aGUga2VybmVsLiBCeSBkZWZhdWx0IHJlYWQgdGhlXG5AQCAtMTM0LDYgJiM0MzsxMzUsMTggQEAgYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdXG4gICAgIGV4aXN0aW5nIHJpbmcuICBBbnkgb3RoZXIgYXBwbGljYXRpb24gd2lsbCBzdG9wIHJlY2VpdmluZyBldmVudHMgaWYgaXRcbiAgICAgaW5zdGFsbGVkIGl0cyByaW5ncyBlYXJsaWVyLlxuIFxuJiM0MzsgICAgRm9yIGEgcmluZyBidWZmZXIgbWFwLCBjb25zdW1lIHJlY29yZHMgc3VibWl0dGVkIGJ5IEJQRiBwcm9ncmFtcywgaW5jbHVkaW5nXG4mIzQzOyAgICByZWNvcmRzIGFscmVhZHkgcXVldWVkIGJlZm9yZSB0aGUgY29tbWFuZCBzdGFydHMuICoqY3B1KiogYW5kICoqaW5kZXgqKlxuJiM0MzsgICAgYXJlIG5vdCBzdXBwb3J0ZWQuIEVhY2ggcmVjb3JkIGlzIHByaW50ZWQgYXMgcmF3IGJ5dGVzLCBpbmNsdWRpbmcgZW1iZWRkZWRcbiYjNDM7ICAgIHplcm8gYnl0ZXMuIFBsYWluIG91dHB1dCByZXBvcnRzIHRoZSByZWNvcmQgc2l6ZSBmb2xsb3dlZCBieSBoZXhhZGVjaW1hbFxuJiM0MzsgICAgYnl0ZXM7IEpTT04gb3V0cHV0IGNvbnRhaW5zICoqc2l6ZSoqIGFuZCAqKmRhdGEqKiBmaWVsZHMsIHdpdGggKipkYXRhKiogYW5cbiYjNDM7ICAgIGFycmF5IG9mIGJ5dGUgdmFsdWVzLiBSaW5nIGJ1ZmZlciByZWNvcmRzIGhhdmUgbm8gaW1wbGljaXQgQ1BVIG9yIHRpbWVzdGFtcC5cbiYjNDM7XG4mIzQzOyAgICBSaW5nIGJ1ZmZlcnMgc3VwcG9ydCBhIHNpbmdsZSBjb25zdW1lci4gVGhpcyBjb21tYW5kIGFkdmFuY2VzIHRoZSBzaGFyZWRcbiYjNDM7ICAgIGNvbnN1bWVyIHBvc2l0aW9uIGFuZCBtdXN0IG5vdCBydW4gYWxvbmdzaWRlIGFub3RoZXIgY29uc3VtZXIgb2YgdGhlIHNhbWVcbiYjNDM7ICAgIG1hcDsgaXQgZG9lcyBub3QgcHJvdmlkZSBhIHBhc3NpdmUgdmlldyBvZiBldmVudHMuICoqQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRioqXG4mIzQzOyAgICBtYXBzIGFyZSBub3Qgc3VwcG9ydGVkLlxuJiM0MztcbiBicGZ0b29sIG1hcCBwZWVrICAqTUFQKlxuICAgICBQZWVrIG5leHQgdmFsdWUgaW4gdGhlIHF1ZXVlIG9yIHN0YWNrLlxuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbmluZGV4IDc1Y2JjYjUxMmViYWUuLjE3NTBiNDg4YzllM2IgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbkBAIC04NzgsMTEgJiM0Mzs4NzgsMTEgQEAgX2JwZnRvb2woKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7O1xuICAgICAgICAgICAgICAgICAgICAgICAgIGlkKVxuLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX2lkc19mb3JfdHlwZSBwZXJmX2V2ZW50X2FycmF5XG4mIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX2lkc19mb3JfdHlwZSAmIzM5O1wmIzM0O3R5cGVcJiMzNDs6IFwmIzM0O1xcKHBlcmZfZXZlbnRfYXJyYXlcXHxyaW5nYnVmXFwpXCYjMzQ7JiMzOTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOztcbiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKVxuLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX25hbWVzX2Zvcl90eXBlIHBlcmZfZXZlbnRfYXJyYXlcbiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfbmFtZXNfZm9yX3R5cGUgJiMzOTtcJiMzNDt0eXBlXCYjMzQ7OiBcJiMzNDtcXChwZXJmX2V2ZW50X2FycmF5XFx8cmluZ2J1ZlxcKVwmIzM0OyYjMzk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgY3B1KVxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xuaW5kZXggYmNiNzY3ZTJkNjczMy4uN2Q1NTUzMzFmNDQzYSAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jXG5AQCAtMjcsNyAmIzQzOzI3LDcgQEBcbiBcbiAjZGVmaW5lIE1NQVBfUEFHRV9DTlRcdDE2XG4gXG4tc3RhdGljIHZvbGF0aWxlIGJvb2wgc3RvcDtcbiYjNDM7c3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBzdG9wO1xuIFxuIHN0cnVjdCBwZXJmX2V2ZW50X3NhbXBsZSB7XG4gXHRzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgaGVhZGVyO1xuQEAgLTQ0LDcgJiM0Mzs0NCw2IEBAIHN0cnVjdCBwZXJmX2V2ZW50X2xvc3Qge1xuIFxuIHN0YXRpYyB2b2lkIGludF9leGl0KGludCBzaWdubylcbiB7XG4tXHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7U3RvcHBpbmcuLi5cXG5cJiMzNDspO1xuIFx0c3RvcCA9IHRydWU7XG4gfVxuIFxuQEAgLTEwNyw2ICYjNDM7MTA2LDI3IEBAIHByaW50X2JwZl9vdXRwdXQodm9pZCAqcHJpdmF0ZV9kYXRhLCBpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgKmV2ZW50KVxuIFx0cmV0dXJuIExJQkJQRl9QRVJGX0VWRU5UX0NPTlQ7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW50IHByaW50X3JpbmdidWZfb3V0cHV0KHZvaWQgKmN0eCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpXG4mIzQzO3tcbiYjNDM7XHRpZiAoanNvbl9vdXRwdXQpIHtcbiYjNDM7XHRcdGpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7XG4mIzQzO1x0XHRqc29ud191aW50X2ZpZWxkKGpzb25fd3RyLCBcJiMzNDtzaXplXCYjMzQ7LCBzaXplKTtcbiYjNDM7XHRcdGpzb253X25hbWUoanNvbl93dHIsIFwmIzM0O2RhdGFcJiMzNDspO1xuJiM0MztcdFx0cHJpbnRfZGF0YV9qc29uKGRhdGEsIHNpemUpO1xuJiM0MztcdFx0anNvbndfZW5kX29iamVjdChqc29uX3d0cik7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHByaW50ZihcJiMzNDs9PSBzaXplOiAlenUgPT09PT1cXG5cJiMzNDssIHNpemUpO1xuJiM0MztcdFx0ZnByaW50X2hleChzdGRvdXQsIGRhdGEsIHNpemUsIFwmIzM0OyBcJiMzNDspO1xuJiM0MztcdFx0cHJpbnRmKFwmIzM0O1xcblwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZmZsdXNoKHN0ZG91dCkpXG4mIzQzO1x0XHRyZXR1cm4gZXJybm8gPyAtZXJybm8gOiAtRUlPO1xuJiM0MztcbiYjNDM7XHQvKiBBIHByb2R1Y2VyIGNhbiBrZWVwIHBvbGwoKSBidXN5IGV2ZW4gYWZ0ZXIgYSBzaWduYWwgYXJyaXZlcy4gKi9cbiYjNDM7XHRyZXR1cm4gc3RvcCA/IC1FSU5UUiA6IDA7XG4mIzQzO31cbiYjNDM7XG4gaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIHtcbiBcdHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgcGVyZl9hdHRyID0ge1xuQEAgLTEyMywxOCAmIzQzOzE0MywyNiBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdC5jcHUgPSAtMSxcbiBcdFx0LmlkeCA9IC0xLFxuIFx0fTtcbi1cdHN0cnVjdCBwZXJmX2J1ZmZlciAqcGI7XG4mIzQzO1x0c3RydWN0IHBlcmZfYnVmZmVyICpwYiA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IHJpbmdfYnVmZmVyICpyYiA9IE5VTEw7XG4gXHRfX3UzMiBtYXBfaW5mb19sZW47XG4gXHRpbnQgZXJyLCBtYXBfZmQ7XG4gXG4mIzQzO1x0c3RvcCA9IGZhbHNlO1xuIFx0bWFwX2luZm9fbGVuID0gc2l6ZW9mKG1hcF9pbmZvKTtcbiBcdG1hcF9mZCA9IG1hcF9wYXJzZV9mZF9hbmRfaW5mbyhcdTAwMjZhcmdjLCBcdTAwMjZhcmd2LCBcdTAwMjZtYXBfaW5mbywgXHUwMDI2bWFwX2luZm9fbGVuLFxuIFx0XHRcdFx0ICAgICAgIDApO1xuIFx0aWYgKG1hcF9mZCBcdTAwM2MgMClcbiBcdFx0cmV0dXJuIC0xO1xuIFxuLVx0aWYgKG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpIHtcbi1cdFx0cF9lcnIoXCYjMzQ7bWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXlcJiMzNDspO1xuJiM0MztcdGlmIChtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9SSU5HQlVGKSB7XG4mIzQzO1x0XHRwX2VycihcJiMzNDttYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheSBvciByaW5nIGJ1ZmZlclwmIzM0Oyk7XG4mIzQzO1x0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRiBcdTAwMjZcdTAwMjYgYXJnYykge1xuJiM0MztcdFx0cF9lcnIoXCYjMzQ7cmluZyBidWZmZXIgbWFwcyBkbyBub3Qgc3VwcG9ydCBjcHUgb3IgaW5kZXggYXJndW1lbnRzXCYjMzQ7KTtcbiBcdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuIFx0fVxuIFxuQEAgLTE4NCwxNSAmIzQzOzIxMiwyNCBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdGN0eC5pZHggPSAwO1xuIFx0fVxuIFxuLVx0b3B0cy5jcHVfY250ID0gY3R4LmFsbF9jcHVzID8gMCA6IDE7XG4tXHRvcHRzLmNwdXMgPSBcdTAwMjZjdHguY3B1O1xuLVx0b3B0cy5tYXBfa2V5cyA9IFx1MDAyNmN0eC5pZHg7XG4tXHRwYiA9IHBlcmZfYnVmZmVyX19uZXdfcmF3KG1hcF9mZCwgTU1BUF9QQUdFX0NOVCwgXHUwMDI2cGVyZl9hdHRyLFxuLVx0XHRcdFx0ICBwcmludF9icGZfb3V0cHV0LCBcdTAwMjZjdHgsIFx1MDAyNm9wdHMpO1xuLVx0aWYgKCFwYikge1xuLVx0XHRwX2VycihcJiMzNDtmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpXCYjMzQ7LFxuLVx0XHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcbi1cdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuJiM0MztcdGlmIChtYXBfaW5mby50eXBlID09IEJQRl9NQVBfVFlQRV9SSU5HQlVGKSB7XG4mIzQzO1x0XHRyYiA9IHJpbmdfYnVmZmVyX19uZXcobWFwX2ZkLCBwcmludF9yaW5nYnVmX291dHB1dCwgTlVMTCwgTlVMTCk7XG4mIzQzO1x0XHRpZiAoIXJiKSB7XG4mIzQzO1x0XHRcdHBfZXJyKFwmIzM0O2ZhaWxlZCB0byBjcmVhdGUgcmluZyBidWZmZXI6ICVzICglZClcJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xuJiM0MztcdFx0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdG9wdHMuY3B1X2NudCA9IGN0eC5hbGxfY3B1cyA/IDAgOiAxO1xuJiM0MztcdFx0b3B0cy5jcHVzID0gXHUwMDI2Y3R4LmNwdTtcbiYjNDM7XHRcdG9wdHMubWFwX2tleXMgPSBcdTAwMjZjdHguaWR4O1xuJiM0MztcdFx0cGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsIFx1MDAyNnBlcmZfYXR0cixcbiYjNDM7XHRcdFx0XHRcdCAgcHJpbnRfYnBmX291dHB1dCwgXHUwMDI2Y3R4LCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRcdGlmICghcGIpIHtcbiYjNDM7XHRcdFx0cF9lcnIoXCYjMzQ7ZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGJ1ZmZlcjogJXMgKCVkKVwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XG4mIzQzO1x0XHRcdGdvdG8gZXJyX2Nsb3NlX21hcDtcbiYjNDM7XHRcdH1cbiBcdH1cbiBcbiBcdHNpZ25hbChTSUdJTlQsIGludF9leGl0KTtcbkBAIC0yMDIsMjUgJiM0MzsyMzksMzMgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0aWYgKGpzb25fb3V0cHV0KVxuIFx0XHRqc29ud19zdGFydF9hcnJheShqc29uX3d0cik7XG4gXG4mIzQzO1x0ZXJyID0gMDtcbiBcdHdoaWxlICghc3RvcCkge1xuLVx0XHRlcnIgPSBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTtcbiYjNDM7XHRcdGVyciA9IHJiID8gcmluZ19idWZmZXJfX3BvbGwocmIsIDIwMCkgOiBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTtcbiBcdFx0aWYgKGVyciBcdTAwM2MgMCBcdTAwMjZcdTAwMjYgZXJyICE9IC1FSU5UUikge1xuLVx0XHRcdHBfZXJyKFwmIzM0O3BlcmYgYnVmZmVyIHBvbGxpbmcgZmFpbGVkOiAlcyAoJWQpXCYjMzQ7LFxuLVx0XHRcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xuLVx0XHRcdGdvdG8gZXJyX2Nsb3NlX3BiO1xuJiM0MztcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7RXJyb3I6ICVzIGJ1ZmZlciBwb2xsaW5nIGZhaWxlZDogJXMgKCVkKVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRyYiA/IFwmIzM0O3JpbmdcJiMzNDsgOiBcJiMzNDtwZXJmXCYjMzQ7LCBzdHJlcnJvcigtZXJyKSwgLWVycik7XG4mIzQzO1x0XHRcdGJyZWFrO1xuIFx0XHR9XG4mIzQzO1x0XHRlcnIgPSAwO1xuIFx0fVxuIFxuJiM0MztcdGlmIChzdG9wKVxuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0O1N0b3BwaW5nLi4uXFxuXCYjMzQ7KTtcbiBcdGlmIChqc29uX291dHB1dClcbiBcdFx0anNvbndfZW5kX2FycmF5KGpzb25fd3RyKTtcbiYjNDM7XHRpZiAoZmZsdXNoKHN0ZG91dCkpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtFcnJvcjogZmFpbGVkIHRvIHdyaXRlIGV2ZW50czogJXNcXG5cJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0XHRlcnIgPSAtMTtcbiYjNDM7XHR9XG4gXG4mIzQzO1x0cmluZ19idWZmZXJfX2ZyZWUocmIpO1xuIFx0cGVyZl9idWZmZXJfX2ZyZWUocGIpO1xuJiM0MztcdC8qIEJvdGggYnVmZmVyIG1hbmFnZXJzIGJvcnJvdyBtYXBfZmQuICovXG4gXHRjbG9zZShtYXBfZmQpO1xuIFxuLVx0cmV0dXJuIDA7XG4mIzQzO1x0cmV0dXJuIGVyciBcdTAwM2MgMCA/IC0xIDogMDtcbiBcbi1lcnJfY2xvc2VfcGI6XG4tXHRwZXJmX2J1ZmZlcl9fZnJlZShwYik7XG4gZXJyX2Nsb3NlX21hcDpcbiBcdGNsb3NlKG1hcF9mZCk7XG4gXHRyZXR1cm4gLTE7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjIwOTliZjEwMjA5MzBcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jXG5AQCAtMCwwICYjNDM7MSwzODEgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7I2luY2x1ZGUgXHUwMDNjY3R5cGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3BvbGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZnRvb2xfcmluZ2J1Zi5za2VsLmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgV0FJVF9TVEVQUyA1MDBcbiYjNDM7I2RlZmluZSBXQUlUX1VTIDEwMDAwXG4mIzQzO1xuJiM0MztzdHJ1Y3QgY29uc3VtZXIge1xuJiM0MztcdHBpZF90IHBpZDtcbiYjNDM7XHRpbnQgZmQ7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqYnBmdG9vbF9wYXRoKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBjaGFyICpwYXRoID0gZ2V0ZW52KFwmIzM0O0JQRlRPT0xcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRpZiAocGF0aClcbiYjNDM7XHRcdHJldHVybiBhY2Nlc3MocGF0aCwgWF9PSykgPyBOVUxMIDogcGF0aDtcbiYjNDM7XHRpZiAoIWFjY2VzcyhcJiMzNDsuL3Rvb2xzL3NiaW4vYnBmdG9vbFwmIzM0OywgWF9PSykpXG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7Li90b29scy9zYmluL2JwZnRvb2xcJiMzNDs7XG4mIzQzO1x0aWYgKCFhY2Nlc3MoXCYjMzQ7Li4vdG9vbHMvc2Jpbi9icGZ0b29sXCYjMzQ7LCBYX09LKSlcbiYjNDM7XHRcdHJldHVybiBcJiMzNDsuLi90b29scy9zYmluL2JwZnRvb2xcJiMzNDs7XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNvbnN1bWVyX2NsZWFudXAoc3RydWN0IGNvbnN1bWVyICpjaGlsZClcbiYjNDM7e1xuJiM0MztcdGlmIChjaGlsZC1cdTAwM2VwaWQgXHUwMDNlIDApIHtcbiYjNDM7XHRcdGtpbGwoY2hpbGQtXHUwMDNlcGlkLCBTSUdLSUxMKTtcbiYjNDM7XHRcdHdoaWxlICh3YWl0cGlkKGNoaWxkLVx1MDAzZXBpZCwgTlVMTCwgMCkgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vID09IEVJTlRSKVxuJiM0MztcdFx0XHQ7XG4mIzQzO1x0XHRjaGlsZC1cdTAwM2VwaWQgPSAtMTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKGNoaWxkLVx1MDAzZWZkIFx1MDAzZT0gMCkge1xuJiM0MztcdFx0Y2xvc2UoY2hpbGQtXHUwMDNlZmQpO1xuJiM0MztcdFx0Y2hpbGQtXHUwMDNlZmQgPSAtMTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGNvbnN1bWVyX3N0YXJ0KHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBtYXBfZmQsIGJvb2wganNvbixcbiYjNDM7XHRcdFx0ICAgY29uc3QgY2hhciAqb3B0aW9uLCBib29sIHBhaXIsIGJvb2wgY2FwdHVyZV9lcnJvcnMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbiYjNDM7XHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XG4mIzQzO1x0Y29uc3QgY2hhciAqcGF0aCA9IGJwZnRvb2xfcGF0aCgpO1xuJiM0MztcdGNoYXIgKmFyZ3ZbMTJdLCBpZFsxNl07XG4mIzQzO1x0aW50IG91dFsyXSwgcmVhZHlbMl0sIG4gPSAwLCBlcnIsIGVycl9mZDtcbiYjNDM7XHRzdHJ1Y3QgcG9sbGZkIHBmZDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHBhdGgsIFwmIzM0O2JwZnRvb2wgcGF0aCAoc2V0IEJQRlRPT0wgdG8gb3ZlcnJpZGUpXCYjMzQ7KSB8fFxuJiM0MztcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQobWFwX2ZkLCBcdTAwMjZpbmZvLCBcdTAwMjZsZW4pLCBcJiMzNDttYXAgaW5mb1wmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0c25wcmludGYoaWQsIHNpemVvZihpZCksIFwmIzM0OyV1XCYjMzQ7LCBpbmZvLmlkKTtcbiYjNDM7XHRhcmd2W24mIzQzOyYjNDM7XSA9IChjaGFyICopcGF0aDtcbiYjNDM7XHRpZiAoanNvbilcbiYjNDM7XHRcdGFyZ3ZbbiYjNDM7JiM0MztdID0gXCYjMzQ7LWpcJiMzNDs7XG4mIzQzO1x0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDttYXBcJiMzNDs7XG4mIzQzO1x0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDtldmVudF9waXBlXCYjMzQ7O1xuJiM0MztcdGFyZ3ZbbiYjNDM7JiM0MztdID0gXCYjMzQ7aWRcJiMzNDs7XG4mIzQzO1x0YXJndltuJiM0MzsmIzQzO10gPSBpZDtcbiYjNDM7XHRpZiAob3B0aW9uKSB7XG4mIzQzO1x0XHRhcmd2W24mIzQzOyYjNDM7XSA9IChjaGFyICopb3B0aW9uO1xuJiM0MztcdFx0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDswXCYjMzQ7O1xuJiM0MztcdFx0aWYgKHBhaXIpIHtcbiYjNDM7XHRcdFx0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDtpbmRleFwmIzM0OztcbiYjNDM7XHRcdFx0YXJndltuJiM0MzsmIzQzO10gPSBcJiMzNDswXCYjMzQ7O1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRhcmd2W25dID0gTlVMTDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhwaXBlMihvdXQsIE9fQ0xPRVhFQyksIFwmIzM0O291dHB1dCBwaXBlXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhwaXBlMihyZWFkeSwgT19DTE9FWEVDKSwgXCYjMzQ7ZXhlYyBwaXBlXCYjMzQ7KSkge1xuJiM0MztcdFx0Y2xvc2Uob3V0WzBdKTtcbiYjNDM7XHRcdGNsb3NlKG91dFsxXSk7XG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcdGNoaWxkLVx1MDAzZXBpZCA9IGZvcmsoKTtcbiYjNDM7XHRpZiAoIWNoaWxkLVx1MDAzZXBpZCkge1xuJiM0MztcdFx0Y2xvc2Uob3V0WzBdKTtcbiYjNDM7XHRcdGNsb3NlKHJlYWR5WzBdKTtcbiYjNDM7XHRcdGVycl9mZCA9IGNhcHR1cmVfZXJyb3JzID8gb3V0WzFdIDogb3BlbihcJiMzNDsvZGV2L251bGxcJiMzNDssIE9fV1JPTkxZKTtcbiYjNDM7XHRcdGlmIChkdXAyKG91dFsxXSwgU1RET1VUX0ZJTEVOTykgXHUwMDNjIDAgfHxcbiYjNDM7XHRcdCAgICBkdXAyKGVycl9mZCwgU1RERVJSX0ZJTEVOTykgXHUwMDNjIDApXG4mIzQzO1x0XHRcdGdvdG8gZXhlY19mYWlsO1xuJiM0MztcdFx0aWYgKCFjYXB0dXJlX2Vycm9ycylcbiYjNDM7XHRcdFx0Y2xvc2UoZXJyX2ZkKTtcbiYjNDM7XHRcdGNsb3NlKG91dFsxXSk7XG4mIzQzO1x0XHRleGVjdihwYXRoLCBhcmd2KTtcbiYjNDM7ZXhlY19mYWlsOlxuJiM0MztcdFx0ZXJyID0gZXJybm87XG4mIzQzO1x0XHR3cml0ZShyZWFkeVsxXSwgXHUwMDI2ZXJyLCBzaXplb2YoZXJyKSk7XG4mIzQzO1x0XHRfZXhpdCgxMjcpO1xuJiM0MztcdH1cbiYjNDM7XHRjbG9zZShvdXRbMV0pO1xuJiM0MztcdGNsb3NlKHJlYWR5WzFdKTtcbiYjNDM7XHRjaGlsZC1cdTAwM2VmZCA9IG91dFswXTtcbiYjNDM7XHRwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSByZWFkeVswXSwgLmV2ZW50cyA9IFBPTExJTiB9O1xuJiM0MztcdC8qIEVPRiBvbiB0aGUgY2xvc2Utb24tZXhlYyBwaXBlIGRpc3Rpbmd1aXNoZXMgZXhlYyBmcm9tIGluaGVyaXRlZCBoYW5kbGVycy4gKi9cbiYjNDM7XHRlcnIgPSBjaGlsZC1cdTAwM2VwaWQgXHUwMDNlIDAgPyBwb2xsKFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSA6IC0xO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKGNoaWxkLVx1MDAzZXBpZCwgMCwgXCYjMzQ7Zm9ya1wmIzM0OykgfHxcbiYjNDM7XHQgICAgIUFTU0VSVF9HVChlcnIsIDAsIFwmIzM0O2V4ZWMgdGltZW91dFwmIzM0OykgfHxcbiYjNDM7XHQgICAgIUFTU0VSVF9FUShyZWFkKHJlYWR5WzBdLCBcdTAwMjZlcnIsIHNpemVvZihlcnIpKSwgMCwgXCYjMzQ7ZXhlY1wmIzM0OykpIHtcbiYjNDM7XHRcdGNsb3NlKHJlYWR5WzBdKTtcbiYjNDM7XHRcdGNvbnN1bWVyX2NsZWFudXAoY2hpbGQpO1xuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XHRjbG9zZShyZWFkeVswXSk7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGNvbnN1bWVyX2ZpbmlzaChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkLCBpbnQgc2lnbm8sIGJvb2wgc3VjY2VzcyxcbiYjNDM7XHRcdFx0ICAgIGNoYXIgKm91dHB1dCwgc2l6ZV90IHNpemUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgc3RhdHVzID0gMCwgaTtcbiYjNDM7XHRwaWRfdCByZXQgPSAwO1xuJiM0MztcdHNzaXplX3QgbjtcbiYjNDM7XHRzaXplX3QgdXNlZCA9IDA7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGZjbnRsKGNoaWxkLVx1MDAzZWZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKSwgXCYjMzQ7bm9uYmxvY2tpbmcgb3V0cHV0XCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRpZiAoc2lnbm8gXHUwMDI2XHUwMDI2ICFBU1NFUlRfT0soa2lsbChjaGlsZC1cdTAwM2VwaWQsIHNpZ25vKSwgXCYjMzQ7c2lnbmFsIGNvbnN1bWVyXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBXQUlUX1NURVBTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0d2hpbGUgKHVzZWQgXHUwMDNjIHNpemUgLSAxIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgICAgIChuID0gcmVhZChjaGlsZC1cdTAwM2VmZCwgb3V0cHV0ICYjNDM7IHVzZWQsIHNpemUgLSAxIC0gdXNlZCkpIFx1MDAzZSAwKVxuJiM0MztcdFx0XHR1c2VkICYjNDM7PSBuO1xuJiM0MztcdFx0cmV0ID0gd2FpdHBpZChjaGlsZC1cdTAwM2VwaWQsIFx1MDAyNnN0YXR1cywgV05PSEFORyk7XG4mIzQzO1x0XHRpZiAocmV0ID09IGNoaWxkLVx1MDAzZXBpZClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyAhPSBFSU5UUilcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR1c2xlZXAoV0FJVF9VUyk7XG4mIzQzO1x0fVxuJiM0MztcdGlmICghQVNTRVJUX0VRKHJldCwgY2hpbGQtXHUwMDNlcGlkLCBcJiMzNDtib3VuZGVkIGNvbnN1bWVyIGV4aXRcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdGNoaWxkLVx1MDAzZXBpZCA9IC0xO1xuJiM0MztcdHdoaWxlICh1c2VkIFx1MDAzYyBzaXplIC0gMSBcdTAwMjZcdTAwMjYgKG4gPSByZWFkKGNoaWxkLVx1MDAzZWZkLCBvdXRwdXQgJiM0MzsgdXNlZCwgc2l6ZSAtIDEgLSB1c2VkKSkgXHUwMDNlIDApXG4mIzQzO1x0XHR1c2VkICYjNDM7PSBuO1xuJiM0MztcdG91dHB1dFt1c2VkXSA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0cmV0dXJuIEFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcJiMzNDtub3JtYWwgZXhpdFwmIzM0OykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICAgIEFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpID09IDAsIHN1Y2Nlc3MsIFwmIzM0O2V4aXQgc3RhdHVzXCYjMzQ7KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZXJfcmVhZHkoc3RydWN0IGNvbnN1bWVyICpjaGlsZClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbG9uZyBjYXVnaHQ7XG4mIzQzO1x0Y2hhciBwYXRoWzY0XSwgbGluZVsyNTZdO1xuJiM0MztcdGludCBpO1xuJiM0MztcdEZJTEUgKmY7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXCYjMzQ7L3Byb2MvJWQvc3RhdHVzXCYjMzQ7LCBjaGlsZC1cdTAwM2VwaWQpO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFdBSVRfU1RFUFM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRmID0gZm9wZW4ocGF0aCwgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAoIWYpXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHtcbiYjNDM7XHRcdFx0aWYgKHNzY2FuZihsaW5lLCBcJiMzNDtTaWdDZ3Q6ICVsbHhcJiMzNDssIFx1MDAyNmNhdWdodCkgPT0gMSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdFx0ICAgIChjYXVnaHQgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyAoU0lHSU5UIC0gMSkpKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdFx0ICAgIChjYXVnaHQgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyAoU0lHVEVSTSAtIDEpKSkpIHtcbiYjNDM7XHRcdFx0XHRmY2xvc2UoZik7XG4mIzQzO1x0XHRcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGZjbG9zZShmKTtcbiYjNDM7XHRcdHVzbGVlcChXQUlUX1VTKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIEFTU0VSVF9UUlVFKGZhbHNlLCBcJiMzNDtjb25zdW1lciBzaWduYWwgaGFuZGxlcnMgcmVhZHlcJiMzNDspO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBlbWl0X3JlY29yZChzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsLCBpbnQgcmVjb3JkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBwYWNrZXRbNjRdID0ge307XG4mIzQzO1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBvcHRzLFxuJiM0MztcdFx0ICAgIC5kYXRhX2luID0gcGFja2V0LFxuJiM0MztcdFx0ICAgIC5kYXRhX3NpemVfaW4gPSBzaXplb2YocGFja2V0KSxcbiYjNDM7XHQpO1xuJiM0MztcbiYjNDM7XHRza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNvcmQgPSByZWNvcmQ7XG4mIzQzO1x0cmV0dXJuIEFTU0VSVF9PSyhicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLnByb2R1Y2UpLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgXHUwMDI2b3B0cyksIFwmIzM0O3Byb2R1Y2UgcmVjb3JkXCYjMzQ7KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgICAgQVNTRVJUX09LKHNrZWwtXHUwMDNlYnNzLVx1MDAzZW91dHB1dF9lcnIsIFwmIzM0O3JpbmdidWYgb3V0cHV0XCYjMzQ7KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZWQodW5zaWduZWQgbG9uZyAqcG9zaXRpb24sIHVuc2lnbmVkIGxvbmcgZXhwZWN0ZWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgV0FJVF9TVEVQUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChfX2F0b21pY19sb2FkX24ocG9zaXRpb24sIF9fQVRPTUlDX0FDUVVJUkUpID09IGV4cGVjdGVkKVxuJiM0MztcdFx0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRcdHVzbGVlcChXQUlUX1VTKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIEFTU0VSVF9FUSgqcG9zaXRpb24sIGV4cGVjdGVkLCBcJiMzNDtjb25zdW1lciBwb3NpdGlvblwmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNoZWNrX2pzb24oY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICpleHBlY3RlZClcbiYjNDM7e1xuJiM0MztcdGNoYXIgKnNyYyA9IG91dHB1dCwgKmRzdCA9IG91dHB1dDtcbiYjNDM7XHRib29sIHF1b3RlZCA9IGZhbHNlLCBlc2NhcGVkID0gZmFsc2U7XG4mIzQzO1xuJiM0MztcdC8qIElnbm9yZSBmb3JtYXR0aW5nIHdoaXRlc3BhY2Ugd2hpbGUgY2hlY2tpbmcgdGhlIGVudGlyZSBKU09OIGRvY3VtZW50LiAqL1xuJiM0MztcdHdoaWxlICgqc3JjKSB7XG4mIzQzO1x0XHRpZiAocXVvdGVkIHx8ICFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxuJiM0MztcdFx0XHQqZHN0JiM0MzsmIzQzOyA9ICpzcmM7XG4mIzQzO1x0XHRpZiAoIWVzY2FwZWQgXHUwMDI2XHUwMDI2ICpzcmMgPT0gJiMzOTtcJiMzNDsmIzM5OylcbiYjNDM7XHRcdFx0cXVvdGVkID0gIXF1b3RlZDtcbiYjNDM7XHRcdGVzY2FwZWQgPSAhZXNjYXBlZCBcdTAwMjZcdTAwMjYgcXVvdGVkIFx1MDAyNlx1MDAyNiAqc3JjID09ICYjMzk7XFxcXCYjMzk7O1xuJiM0MztcdFx0c3JjJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1x0KmRzdCA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwmIzM0O0pTT04gcmVjb3Jkc1wmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfY29uc3VtZXIoYm9vbCBqc29uLCBib29sIGlkbGUsIGludCBzaWdubylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9O1xuJiM0MztcdHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWw7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyAqcG9zaXRpb24gPSBNQVBfRkFJTEVEO1xuJiM0MztcdGludCBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpLCBmZDtcbiYjNDM7XHRjaGFyIG91dHB1dFs0MDk2XTtcbiYjNDM7XHRzdHJ1Y3QgcG9sbGZkIHBmZDtcbiYjNDM7XG4mIzQzO1x0c2tlbCA9IGJwZnRvb2xfcmluZ2J1Zl9fb3BlbigpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcJiMzNDtvcGVuXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cdTAwM2VtYXBzLnJpbmdidWYsIHBhZ2Vfc2l6ZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soYnBmdG9vbF9yaW5nYnVmX19sb2FkKHNrZWwpLCBcJiMzNDtsb2FkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZkID0gYnBmX21hcF9fZmQoc2tlbC1cdTAwM2VtYXBzLnJpbmdidWYpO1xuJiM0MztcdHBvc2l0aW9uID0gbW1hcChOVUxMLCBwYWdlX3NpemUsIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgZmQsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX05FUShwb3NpdGlvbiwgTUFQX0ZBSUxFRCwgXCYjMzQ7Y29uc3VtZXIgbW1hcFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIWlkbGUgXHUwMDI2XHUwMDI2ICghZW1pdF9yZWNvcmQoc2tlbCwgMCkgfHwgIWVtaXRfcmVjb3JkKHNrZWwsIDEpKSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghY29uc3VtZXJfc3RhcnQoXHUwMDI2Y2hpbGQsIGZkLCBqc29uLCBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8XG4mIzQzO1x0ICAgICFjb25zdW1lcl9yZWFkeShcdTAwMjZjaGlsZCkpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIWlkbGUpIHtcbiYjNDM7XHRcdC8qIEJvdGggcHJlZmlsbGVkIHJlY29yZHMgb2NjdXB5IDE2IGJ5dGVzIGluY2x1ZGluZyB0aGVpciBoZWFkZXJzLiAqL1xuJiM0MztcdFx0aWYgKCFjb25zdW1lZChwb3NpdGlvbiwgMzIpKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdHBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IGNoaWxkLmZkLCAuZXZlbnRzID0gUE9MTElOIH07XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9HVChwb2xsKFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSwgMCxcbiYjNDM7XHRcdFx0ICAgICAgIFwmIzM0O3JlY29yZHMgZmx1c2hlZCBiZWZvcmUgZXhpdFwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgXHUwMDI2IFBPTExJTiwgXCYjMzQ7cmVjb3JkIG91dHB1dCByZWFkYWJsZVwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMikgfHwgIWNvbnN1bWVkKHBvc2l0aW9uLCA2NCkpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIWNvbnN1bWVyX2ZpbmlzaChcdTAwMjZjaGlsZCwgc2lnbm8sIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWYgKGpzb24pXG4mIzQzO1x0XHRjaGVja19qc29uKG91dHB1dCwgaWRsZSA/IFwmIzM0O1tdXCYjMzQ7IDpcbiYjNDM7XHRcdFx0ICAgXCYjMzQ7W3tcXFwmIzM0O3NpemVcXFwmIzM0OzoyLFxcXCYjMzQ7ZGF0YVxcXCYjMzQ7OlswLDI1NV19LFwmIzM0O1xuJiM0MztcdFx0XHQgICBcJiMzNDt7XFxcJiMzNDtzaXplXFxcJiMzNDs6NSxcXFwmIzM0O2RhdGFcXFwmIzM0OzpbMSwyLDMsNCw1XX0sXCYjMzQ7XG4mIzQzO1x0XHRcdCAgIFwmIzM0O3tcXFwmIzM0O3NpemVcXFwmIzM0OzoxNyxcXFwmIzM0O2RhdGFcXFwmIzM0OzpbMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsXCYjMzQ7XG4mIzQzO1x0XHRcdCAgIFwmIzM0OzI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyXX1dXCYjMzQ7KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBpZGxlID8gXCYjMzQ7XCYjMzQ7IDpcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDs9PSBzaXplOiAyID09PT09XFxuMDAgZmZcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDs9PSBzaXplOiA1ID09PT09XFxuMDEgMDIgMDMgMDQgMDVcXG5cJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDs9PSBzaXplOiAxNyA9PT09PVxcbjEwIDExIDEyIDEzIDE0IDE1IDE2IDE3ICBcJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDsxOCAxOSAxYSAxYiAxYyAxZCAxZSAxZlxcbjIwXFxuXCYjMzQ7LCBcJiMzNDtwbGFpbiByZWNvcmRzXCYjMzQ7KTtcbiYjNDM7b3V0OlxuJiM0MztcdGNvbnN1bWVyX2NsZWFudXAoXHUwMDI2Y2hpbGQpO1xuJiM0MztcdGlmIChwb3NpdGlvbiAhPSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0bXVubWFwKHBvc2l0aW9uLCBwYWdlX3NpemUpO1xuJiM0MztcdGJwZnRvb2xfcmluZ2J1Zl9fZGVzdHJveShza2VsKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9wZXJmX2NvbnN1bWVyKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGxvbmcgc2Vjb25kcywgbmFub3NlY29uZHM7XG4mIzQzO1x0c3RydWN0IGJwZnRvb2xfcmluZ2J1ZiAqc2tlbDtcbiYjNDM7XHRjaGFyIG91dHB1dFsxNjM4NF0sIGV4cGVjdGVkWzE2Mzg0XTtcbiYjNDM7XHRpbnQgbnJfY3B1cywgY3B1LCBpbmRleCwgb2Zmc2V0ID0gMCwgaSwgdXNlZCA9IDAsIGZpZWxkcztcbiYjNDM7XHRzdHJ1Y3QgcG9sbGZkIHBmZDtcbiYjNDM7XG4mIzQzO1x0bnJfY3B1cyA9IGxpYmJwZl9udW1fcG9zc2libGVfY3B1cygpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKG5yX2NwdXMsIDAsIFwmIzM0O3Bvc3NpYmxlIGNwdXNcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdHNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7b3BlblwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXHUwMDNlbWFwcy5yaW5nYnVmLCBnZXRwYWdlc2l6ZSgpKTtcbiYjNDM7XHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cdTAwM2VtYXBzLnBlcmZidWYsIG5yX2NwdXMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGJwZnRvb2xfcmluZ2J1Zl9fbG9hZChza2VsKSwgXCYjMzQ7bG9hZFwmIzM0OykgfHxcbiYjNDM7XHQgICAgIWNvbnN1bWVyX3N0YXJ0KFx1MDAyNmNoaWxkLCBicGZfbWFwX19mZChza2VsLVx1MDAzZW1hcHMucGVyZmJ1ZiksIGZhbHNlLFxuJiM0MztcdFx0XHQgICAgTlVMTCwgZmFsc2UsIGZhbHNlKSB8fCAhY29uc3VtZXJfcmVhZHkoXHUwMDI2Y2hpbGQpIHx8XG4mIzQzO1x0ICAgICFlbWl0X3JlY29yZChza2VsLCAzKSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdC8qIE9uZSBsYXJnZSByZWNvcmQgZmx1c2hlcyB0aGUgZXhpc3RpbmcgYnVmZmVyZWQgcGVyZiBvdXRwdXQgY2FsbGJhY2suICovXG4mIzQzO1x0cGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gY2hpbGQuZmQsIC5ldmVudHMgPSBQT0xMSU4gfTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChwb2xsKFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSwgMCxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtwZXJmIHJlY29yZCBvdXRwdXRcJiMzNDspIHx8XG4mIzQzO1x0ICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyBcdTAwMjYgUE9MTElOLCBcJiMzNDtwZXJmIG91dHB1dCByZWFkYWJsZVwmIzM0OykgfHxcbiYjNDM7XHQgICAgIWNvbnN1bWVyX2ZpbmlzaChcdTAwMjZjaGlsZCwgU0lHSU5ULCB0cnVlLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpKSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZpZWxkcyA9IHNzY2FuZihvdXRwdXQsIFwmIzM0Oz09IEAlbGx1LiVsbHUgQ1BVOiAlZCBpbmRleDogJWQgPT09PT1cXG4lblwmIzM0OyxcbiYjNDM7XHRcdFx0XHUwMDI2c2Vjb25kcywgXHUwMDI2bmFub3NlY29uZHMsIFx1MDAyNmNwdSwgXHUwMDI2aW5kZXgsIFx1MDAyNm9mZnNldCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoZmllbGRzLCA0LCBcJiMzNDtwZXJmIGhlYWRlclwmIzM0OykgfHxcbiYjNDM7XHQgICAgIUFTU0VSVF9HVChvZmZzZXQsIDAsIFwmIzM0O3BlcmYgcGF5bG9hZCBvZmZzZXRcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0QVNTRVJUX0dUKHNlY29uZHMgKiAxMDAwMDAwMDAwVUxMICYjNDM7IG5hbm9zZWNvbmRzLCAwLCBcJiMzNDtwZXJmIHRpbWVzdGFtcFwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0xUKG5hbm9zZWNvbmRzLCAxMDAwMDAwMDAwVUxMLCBcJiMzNDtwZXJmIHRpbWVzdGFtcCBuYW5vc2Vjb25kc1wmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0dFKGNwdSwgMCwgXCYjMzQ7cGVyZiBjcHVcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9MVChjcHUsIG5yX2NwdXMsIFwmIzM0O3BlcmYgY3B1IHJhbmdlXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoaW5kZXgsIGNwdSwgXCYjMzQ7cGVyZiBpbmRleFwmIzM0Oyk7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc2l6ZW9mKHNrZWwtXHUwMDNlcm9kYXRhLVx1MDAzZXBlcmZfcGF5bG9hZCk7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRjb25zdCBjaGFyICpzZXBhcmF0b3IgPSAhaSA/IFwmIzM0O1wmIzM0OyA6ICEoaSAlIDE2KSA/IFwmIzM0O1xcblwmIzM0OyA6XG4mIzQzO1x0XHRcdFx0XHQhKGkgJSA4KSA/IFwmIzM0OyAgXCYjMzQ7IDogXCYjMzQ7IFwmIzM0OztcbiYjNDM7XG4mIzQzO1x0XHR1c2VkICYjNDM7PSBzbnByaW50ZihleHBlY3RlZCAmIzQzOyB1c2VkLCBzaXplb2YoZXhwZWN0ZWQpIC0gdXNlZCxcbiYjNDM7XHRcdFx0XHQgXCYjMzQ7JXMlMDJ4XCYjMzQ7LCBzZXBhcmF0b3IsIGkgPT0gMSA/IDB4ZmYgOiAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0c25wcmludGYoZXhwZWN0ZWQgJiM0MzsgdXNlZCwgc2l6ZW9mKGV4cGVjdGVkKSAtIHVzZWQsIFwmIzM0O1xcblwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX1NUUkVRKG91dHB1dCAmIzQzOyBvZmZzZXQsIGV4cGVjdGVkLCBcJiMzNDtwZXJmIHBheWxvYWRcJiMzNDspO1xuJiM0MztvdXQ6XG4mIzQzO1x0Y29uc3VtZXJfY2xlYW51cChcdTAwMjZjaGlsZCk7XG4mIzQzO1x0YnBmdG9vbF9yaW5nYnVmX19kZXN0cm95KHNrZWwpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3JlamVjdChlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBjb25zdCBjaGFyICpvcHRpb24sIGJvb2wgcGFpciwgYm9vbCBqc29uKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07XG4mIzQzO1x0Ym9vbCByaW5nID0gdHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRiB8fCB0eXBlID09IEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUY7XG4mIzQzO1x0Y29uc3QgY2hhciAqZXhwZWN0ZWQgPSBvcHRpb24gP1xuJiM0MztcdFx0XCYjMzQ7e1xcXCYjMzQ7ZXJyb3JcXFwmIzM0OzpcXFwmIzM0O3JpbmcgYnVmZmVyIG1hcHMgZG8gbm90IHN1cHBvcnQgY3B1IG9yIGluZGV4IGFyZ3VtZW50c1xcXCYjMzQ7fVwmIzM0OyA6XG4mIzQzO1x0XHRcJiMzNDt7XFxcJiMzNDtlcnJvclxcXCYjMzQ7OlxcXCYjMzQ7bWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcXFwmIzM0O31cJiMzNDs7XG4mIzQzO1x0Y2hhciBvdXRwdXRbNDA5Nl07XG4mIzQzO1x0aW50IGZkO1xuJiM0MztcbiYjNDM7XHRmZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsIE5VTEwsIHJpbmcgPyAwIDogNCwgcmluZyA/IDAgOiA0LFxuJiM0MztcdFx0XHQgICAgcmluZyA/IGdldHBhZ2VzaXplKCkgOiAxLCBOVUxMKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCYjMzQ7Y3JlYXRlIG1hcFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0aWYgKGNvbnN1bWVyX3N0YXJ0KFx1MDAyNmNoaWxkLCBmZCwganNvbiwgb3B0aW9uLCBwYWlyLCB0cnVlKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgY29uc3VtZXJfZmluaXNoKFx1MDAyNmNoaWxkLCAwLCBmYWxzZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpIHtcbiYjNDM7XHRcdGlmIChqc29uKVxuJiM0MztcdFx0XHRjaGVja19qc29uKG91dHB1dCwgZXhwZWN0ZWQpO1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRBU1NFUlRfR1Qoc3RybGVuKG91dHB1dCksIDAsIFwmIzM0O2Vycm9yIGRpYWdub3N0aWNcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XHRjb25zdW1lcl9jbGVhbnVwKFx1MDAyNmNoaWxkKTtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9icGZ0b29sX3JpbmdidWYodm9pZClcbiYjNDM7e1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3BlcmZfZXZlbnRfYXJyYXlcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9wZXJmX2NvbnN1bWVyKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cGxhaW5cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9jb25zdW1lcihmYWxzZSwgZmFsc2UsIFNJR0lOVCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7anNvblwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2NvbnN1bWVyKHRydWUsIGZhbHNlLCBTSUdURVJNKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtpZGxlX3NpZ2ludFwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2NvbnN1bWVyKGZhbHNlLCB0cnVlLCBTSUdJTlQpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2lkbGVfc2lndGVybV9qc29uXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfY29uc3VtZXIodHJ1ZSwgdHJ1ZSwgU0lHVEVSTSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X2FycmF5XCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9BUlJBWSwgTlVMTCwgZmFsc2UsIGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtyZWplY3RfdXNlcl9yaW5nYnVmXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X2NwdVwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCYjMzQ7Y3B1XCYjMzQ7LCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3JlamVjdF9pbmRleFwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCYjMzQ7aW5kZXhcJiMzNDssIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X2NwdV9pbmRleFwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXCYjMzQ7Y3B1XCYjMzQ7LCB0cnVlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7cmVqZWN0X3VzZXJfcmluZ2J1Zl9qc29uXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCB0cnVlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtyZWplY3RfY3B1X2luZGV4X2pzb25cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFwmIzM0O2NwdVwmIzM0OywgdHJ1ZSwgdHJ1ZSk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5iYmJjOTNjMzBhODMzXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmNcbkBAIC0wLDAgJiM0MzsxLDQ3IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4mIzQzO1xuJiM0MztzdHJ1Y3Qge1xuJiM0MztcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUklOR0JVRik7XG4mIzQzO30gcmluZ2J1ZiBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7c3RydWN0IHtcbiYjNDM7XHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpO1xuJiM0MztcdF9fdWludChrZXlfc2l6ZSwgc2l6ZW9mKF9fdTMyKSk7XG4mIzQzO1x0X191aW50KHZhbHVlX3NpemUsIHNpemVvZihfX3UzMikpO1xuJiM0MztcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4mIzQzO30gcGVyZmJ1ZiBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogSW5jbHVkZSB0aGUgdTMyIHJhdyBzaXplIGluIHBlcmYmIzM5O3MgOC1ieXRlIGFsaWdubWVudCB0byBhdm9pZCBwYWRkaW5nLlxuJiM0MzsgKiBLZWVwIHBsYWluIG91dHB1dCBsYXJnZSBlbm91Z2ggdG8gZmx1c2ggc3RkaW8gYmVmb3JlIHRoZSBjb25zdW1lciBleGl0cy5cbiYjNDM7ICovXG4mIzQzO2NvbnN0IHVuc2lnbmVkIGNoYXIgcGVyZl9wYXlsb2FkWzQwOTJdID0geyAweDAwLCAweGZmIH07XG4mIzQzO1xuJiM0MztpbnQgcmVjb3JkO1xuJiM0MztpbnQgb3V0cHV0X2VycjtcbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtzb2NrZXRcJiMzNDspXG4mIzQzO2ludCBwcm9kdWNlKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYilcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGNoYXIgZmlyc3RbXSA9IHsgMHgwMCwgMHhmZiB9O1xuJiM0MztcdHVuc2lnbmVkIGNoYXIgc2Vjb25kW10gPSB7IDEsIDIsIDMsIDQsIDUgfTtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyIHRoaXJkW10gPSB7XG4mIzQzO1x0XHQweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LFxuJiM0MztcdFx0MHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRpZiAocmVjb3JkID09IDApXG4mIzQzO1x0XHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFx1MDAyNnJpbmdidWYsIGZpcnN0LCBzaXplb2YoZmlyc3QpLCAwKTtcbiYjNDM7XHRlbHNlIGlmIChyZWNvcmQgPT0gMSlcbiYjNDM7XHRcdG91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoXHUwMDI2cmluZ2J1Ziwgc2Vjb25kLCBzaXplb2Yoc2Vjb25kKSwgMCk7XG4mIzQzO1x0ZWxzZSBpZiAocmVjb3JkID09IDIpXG4mIzQzO1x0XHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFx1MDAyNnJpbmdidWYsIHRoaXJkLCBzaXplb2YodGhpcmQpLCAwKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRvdXRwdXRfZXJyID0gYnBmX3BlcmZfZXZlbnRfb3V0cHV0KHNrYiwgXHUwMDI2cGVyZmJ1ZiwgQlBGX0ZfQ1VSUkVOVF9DUFUsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICh2b2lkICopcGVyZl9wYXlsb2FkLCBzaXplb2YocGVyZl9wYXlsb2FkKSk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2NoYXIgTElDRU5TRVtdIFNFQyhcJiMzNDtsaWNlbnNlXCYjMzQ7KSA9IFwmIzM0O0dQTFwmIzM0OztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMjoyMDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBzZXJpZXMgZXhjbHVzaXZlbHkgbW9kaWZpZXMgdXNlci1zcGFjZSB0b29saW5nIChicGZ0b29sKSBhbmQgc2VsZnRlc3RzIHVuZGVyIHRoZSB0b29scy8gZGlyZWN0b3J5ICh0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmKS4gTm8ga2VybmVsIHJ1bnRpbWUgY29kZSwgbW9kdWxlcywgb3Igdm1saW51eCBpbWFnZXMgYXJlIG1vZGlmaWVkLCBzbyB0aGlzIGNoYW5nZSBkb2VzIG5vdCB3YXJyYW50IHN5emthbGxlciBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzCnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsCmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuCgotIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOgogIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQKICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLgogIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCwKICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuCgotIERPIE5PVCBCTElORExZIFRSVVNUICYjMzQ7Tk8gRlVOQ1RJT05BTCBDSEFOR0UmIzM0OyAoTkZDSSkgT1IgJiMzNDtSRUZBQ1RPUklORyYjMzQ7IENMQUlNUzoKICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzICYjMzQ7Y2xlYW51cHMmIzM0OywgJiMzNDtyZWZhY3RvcmluZ3MmIzM0Oywgb3Igc3RhdGUKICAmIzM0O05vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkJiMzNDsuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLgogIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudAogIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLgogIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuCgotIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOgogIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKiwKICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy4KICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyCiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczoKCi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczoKICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy4KICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKQogICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLgogICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHMKICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuCiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuCi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOgogICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6CiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmcKICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLgogICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOgotIENvcmUgU3Vic3lzdGVtczoKICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSwKICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy4KLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6CiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuCi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOgogICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLgotIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6CiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo0LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6CgotIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzoKICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1cwogIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0CiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuCiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzICYjMzQ7Zm9jdXNlZCYjMzQ7LAogIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy4KCi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOgogIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50cwogIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LgoKLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6CiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFjawogIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLgogIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlcgogIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZToKLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgotIENoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuCi0gU3RyaXAgYW55ICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGEyZDFjNWE2MDI4NzlkMzc5OTVmMzAxYzAyMGRjY2VmMGIzMGQyYjgKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIFNlcCA3IDAyOjIwOjI4IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdAppbmRleCA1ZGFmM2RlNWM3NDQ2Li5jNDRlNmY3OTdlNTc3IDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdApAQCAtMTIwLDcgJiM0MzsxMjAsOCBAQCBicGZ0b29sIG1hcCBwaW4gICAgICpNQVAqICAqRklMRSoKICAgICBjaGFyYWN0ZXIgKCYjMzk7LiYjMzk7KSwgd2hpY2ggaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHRlbnNpb25zIG9mICpicGZmcyouCiAKIGJwZnRvb2wgbWFwIGV2ZW50X3BpcGUgKk1BUCogW2NwdSAqTiogaW5kZXggKk0qXQotICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogbWFwLgomIzQzOyAgICBSZWFkIGV2ZW50cyBmcm9tIGEgKipCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSoqIG9yCiYjNDM7ICAgICoqQlBGX01BUF9UWVBFX1JJTkdCVUYqKiBtYXAuCiAKICAgICBJbnN0YWxsIHBlcmYgcmluZ3MgaW50byBhIHBlcmYgZXZlbnQgYXJyYXkgbWFwIGFuZCBkdW1wIG91dHB1dCBvZiBhbnkKICAgICAqKmJwZl9wZXJmX2V2ZW50X291dHB1dCoqXCAoKSBjYWxsIGluIHRoZSBrZXJuZWwuIEJ5IGRlZmF1bHQgcmVhZCB0aGUKQEAgLTEzNCw2ICYjNDM7MTM1LDE4IEBAIGJwZnRvb2wgbWFwIGV2ZW50X3BpcGUgKk1BUCogW2NwdSAqTiogaW5kZXggKk0qXQogICAgIGV4aXN0aW5nIHJpbmcuICBBbnkgb3RoZXIgYXBwbGljYXRpb24gd2lsbCBzdG9wIHJlY2VpdmluZyBldmVudHMgaWYgaXQKICAgICBpbnN0YWxsZWQgaXRzIHJpbmdzIGVhcmxpZXIuCiAKJiM0MzsgICAgRm9yIGEgcmluZyBidWZmZXIgbWFwLCBjb25zdW1lIHJlY29yZHMgc3VibWl0dGVkIGJ5IEJQRiBwcm9ncmFtcywgaW5jbHVkaW5nCiYjNDM7ICAgIHJlY29yZHMgYWxyZWFkeSBxdWV1ZWQgYmVmb3JlIHRoZSBjb21tYW5kIHN0YXJ0cy4gKipjcHUqKiBhbmQgKippbmRleCoqCiYjNDM7ICAgIGFyZSBub3Qgc3VwcG9ydGVkLiBFYWNoIHJlY29yZCBpcyBwcmludGVkIGFzIHJhdyBieXRlcywgaW5jbHVkaW5nIGVtYmVkZGVkCiYjNDM7ICAgIHplcm8gYnl0ZXMuIFBsYWluIG91dHB1dCByZXBvcnRzIHRoZSByZWNvcmQgc2l6ZSBmb2xsb3dlZCBieSBoZXhhZGVjaW1hbAomIzQzOyAgICBieXRlczsgSlNPTiBvdXRwdXQgY29udGFpbnMgKipzaXplKiogYW5kICoqZGF0YSoqIGZpZWxkcywgd2l0aCAqKmRhdGEqKiBhbgomIzQzOyAgICBhcnJheSBvZiBieXRlIHZhbHVlcy4gUmluZyBidWZmZXIgcmVjb3JkcyBoYXZlIG5vIGltcGxpY2l0IENQVSBvciB0aW1lc3RhbXAuCiYjNDM7CiYjNDM7ICAgIFJpbmcgYnVmZmVycyBzdXBwb3J0IGEgc2luZ2xlIGNvbnN1bWVyLiBUaGlzIGNvbW1hbmQgYWR2YW5jZXMgdGhlIHNoYXJlZAomIzQzOyAgICBjb25zdW1lciBwb3NpdGlvbiBhbmQgbXVzdCBub3QgcnVuIGFsb25nc2lkZSBhbm90aGVyIGNvbnN1bWVyIG9mIHRoZSBzYW1lCiYjNDM7ICAgIG1hcDsgaXQgZG9lcyBub3QgcHJvdmlkZSBhIHBhc3NpdmUgdmlldyBvZiBldmVudHMuICoqQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRioqCiYjNDM7ICAgIG1hcHMgYXJlIG5vdCBzdXBwb3J0ZWQuCiYjNDM7CiBicGZ0b29sIG1hcCBwZWVrICAqTUFQKgogICAgIFBlZWsgbmV4dCB2YWx1ZSBpbiB0aGUgcXVldWUgb3Igc3RhY2suCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wKaW5kZXggNzVjYmNiNTEyZWJhZS4uMTc1MGI0ODhjOWUzYiAxMDA2NDQKLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wKQEAgLTg3OCwxMSAmIzQzOzg3OCwxMSBAQCBfYnBmdG9vbCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgICAgICAgICAgICAgaWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgcGVyZl9ldmVudF9hcnJheQomIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX2lkc19mb3JfdHlwZSAmIzM5OyYjMzQ7dHlwZSYjMzQ7OiAmIzM0O1wocGVyZl9ldmVudF9hcnJheVx8cmluZ2J1ZlwpJiMzNDsmIzM5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9uYW1lc19mb3JfdHlwZSBwZXJmX2V2ZW50X2FycmF5CiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9icGZ0b29sX2dldF9tYXBfbmFtZXNfZm9yX3R5cGUgJiMzOTsmIzM0O3R5cGUmIzM0OzogJiMzNDtcKHBlcmZfZXZlbnRfYXJyYXlcfHJpbmdidWZcKSYjMzQ7JiMzOTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgICAgICAgICAgICAgICBjcHUpCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMKaW5kZXggYmNiNzY3ZTJkNjczMy4uN2Q1NTUzMzFmNDQzYSAxMDA2NDQKLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuYwpAQCAtMjcsNyAmIzQzOzI3LDcgQEAKIAogI2RlZmluZSBNTUFQX1BBR0VfQ05UCTE2CiAKLXN0YXRpYyB2b2xhdGlsZSBib29sIHN0b3A7CiYjNDM7c3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBzdG9wOwogCiBzdHJ1Y3QgcGVyZl9ldmVudF9zYW1wbGUgewogCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciBoZWFkZXI7CkBAIC00NCw3ICYjNDM7NDQsNiBAQCBzdHJ1Y3QgcGVyZl9ldmVudF9sb3N0IHsKIAogc3RhdGljIHZvaWQgaW50X2V4aXQoaW50IHNpZ25vKQogewotCWZwcmludGYoc3RkZXJyLCAmIzM0O1N0b3BwaW5nLi4uXG4mIzM0Oyk7CiAJc3RvcCA9IHRydWU7CiB9CiAKQEAgLTEwNyw2ICYjNDM7MTA2LDI3IEBAIHByaW50X2JwZl9vdXRwdXQodm9pZCAqcHJpdmF0ZV9kYXRhLCBpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgKmV2ZW50KQogCXJldHVybiBMSUJCUEZfUEVSRl9FVkVOVF9DT05UOwogfQogCiYjNDM7c3RhdGljIGludCBwcmludF9yaW5nYnVmX291dHB1dCh2b2lkICpjdHgsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQomIzQzO3sKJiM0MzsJaWYgKGpzb25fb3V0cHV0KSB7CiYjNDM7CQlqc29ud19zdGFydF9vYmplY3QoanNvbl93dHIpOwomIzQzOwkJanNvbndfdWludF9maWVsZChqc29uX3d0ciwgJiMzNDtzaXplJiMzNDssIHNpemUpOwomIzQzOwkJanNvbndfbmFtZShqc29uX3d0ciwgJiMzNDtkYXRhJiMzNDspOwomIzQzOwkJcHJpbnRfZGF0YV9qc29uKGRhdGEsIHNpemUpOwomIzQzOwkJanNvbndfZW5kX29iamVjdChqc29uX3d0cik7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlwcmludGYoJiMzNDs9PSBzaXplOiAlenUgPT09PT1cbiYjMzQ7LCBzaXplKTsKJiM0MzsJCWZwcmludF9oZXgoc3Rkb3V0LCBkYXRhLCBzaXplLCAmIzM0OyAmIzM0Oyk7CiYjNDM7CQlwcmludGYoJiMzNDtcbiYjMzQ7KTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZmZsdXNoKHN0ZG91dCkpCiYjNDM7CQlyZXR1cm4gZXJybm8gPyAtZXJybm8gOiAtRUlPOwomIzQzOwomIzQzOwkvKiBBIHByb2R1Y2VyIGNhbiBrZWVwIHBvbGwoKSBidXN5IGV2ZW4gYWZ0ZXIgYSBzaWduYWwgYXJyaXZlcy4gKi8KJiM0MzsJcmV0dXJuIHN0b3AgPyAtRUlOVFIgOiAwOwomIzQzO30KJiM0MzsKIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIHBlcmZfYXR0ciA9IHsKQEAgLTEyMywxOCAmIzQzOzE0MywyNiBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCS5jcHUgPSAtMSwKIAkJLmlkeCA9IC0xLAogCX07Ci0Jc3RydWN0IHBlcmZfYnVmZmVyICpwYjsKJiM0MzsJc3RydWN0IHBlcmZfYnVmZmVyICpwYiA9IE5VTEw7CiYjNDM7CXN0cnVjdCByaW5nX2J1ZmZlciAqcmIgPSBOVUxMOwogCV9fdTMyIG1hcF9pbmZvX2xlbjsKIAlpbnQgZXJyLCBtYXBfZmQ7CiAKJiM0MzsJc3RvcCA9IGZhbHNlOwogCW1hcF9pbmZvX2xlbiA9IHNpemVvZihtYXBfaW5mbyk7CiAJbWFwX2ZkID0gbWFwX3BhcnNlX2ZkX2FuZF9pbmZvKCZhbXA7YXJnYywgJmFtcDthcmd2LCAmYW1wO21hcF9pbmZvLCAmYW1wO21hcF9pbmZvX2xlbiwKIAkJCQkgICAgICAgMCk7CiAJaWYgKG1hcF9mZCAmbHQ7IDApCiAJCXJldHVybiAtMTsKIAotCWlmIChtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKSB7Ci0JCXBfZXJyKCYjMzQ7bWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkmIzM0Oyk7CiYjNDM7CWlmIChtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZICZhbXA7JmFtcDsKJiM0MzsJICAgIG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1JJTkdCVUYpIHsKJiM0MzsJCXBfZXJyKCYjMzQ7bWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXImIzM0Oyk7CiYjNDM7CQlnb3RvIGVycl9jbG9zZV9tYXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG1hcF9pbmZvLnR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgJmFtcDsmYW1wOyBhcmdjKSB7CiYjNDM7CQlwX2VycigmIzM0O3JpbmcgYnVmZmVyIG1hcHMgZG8gbm90IHN1cHBvcnQgY3B1IG9yIGluZGV4IGFyZ3VtZW50cyYjMzQ7KTsKIAkJZ290byBlcnJfY2xvc2VfbWFwOwogCX0KIApAQCAtMTg0LDE1ICYjNDM7MjEyLDI0IEBAIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJY3R4LmlkeCA9IDA7CiAJfQogCi0Jb3B0cy5jcHVfY250ID0gY3R4LmFsbF9jcHVzID8gMCA6IDE7Ci0Jb3B0cy5jcHVzID0gJmFtcDtjdHguY3B1OwotCW9wdHMubWFwX2tleXMgPSAmYW1wO2N0eC5pZHg7Ci0JcGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsICZhbXA7cGVyZl9hdHRyLAotCQkJCSAgcHJpbnRfYnBmX291dHB1dCwgJmFtcDtjdHgsICZhbXA7b3B0cyk7Ci0JaWYgKCFwYikgewotCQlwX2VycigmIzM0O2ZhaWxlZCB0byBjcmVhdGUgcGVyZiBidWZmZXI6ICVzICglZCkmIzM0OywKLQkJICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7Ci0JCWdvdG8gZXJyX2Nsb3NlX21hcDsKJiM0MzsJaWYgKG1hcF9pbmZvLnR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYpIHsKJiM0MzsJCXJiID0gcmluZ19idWZmZXJfX25ldyhtYXBfZmQsIHByaW50X3JpbmdidWZfb3V0cHV0LCBOVUxMLCBOVUxMKTsKJiM0MzsJCWlmICghcmIpIHsKJiM0MzsJCQlwX2VycigmIzM0O2ZhaWxlZCB0byBjcmVhdGUgcmluZyBidWZmZXI6ICVzICglZCkmIzM0OywKJiM0MzsJCQkgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTsKJiM0MzsJCQlnb3RvIGVycl9jbG9zZV9tYXA7CiYjNDM7CQl9CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlvcHRzLmNwdV9jbnQgPSBjdHguYWxsX2NwdXMgPyAwIDogMTsKJiM0MzsJCW9wdHMuY3B1cyA9ICZhbXA7Y3R4LmNwdTsKJiM0MzsJCW9wdHMubWFwX2tleXMgPSAmYW1wO2N0eC5pZHg7CiYjNDM7CQlwYiA9IHBlcmZfYnVmZmVyX19uZXdfcmF3KG1hcF9mZCwgTU1BUF9QQUdFX0NOVCwgJmFtcDtwZXJmX2F0dHIsCiYjNDM7CQkJCQkgIHByaW50X2JwZl9vdXRwdXQsICZhbXA7Y3R4LCAmYW1wO29wdHMpOwomIzQzOwkJaWYgKCFwYikgewomIzQzOwkJCXBfZXJyKCYjMzQ7ZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGJ1ZmZlcjogJXMgKCVkKSYjMzQ7LAomIzQzOwkJCSAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pOwomIzQzOwkJCWdvdG8gZXJyX2Nsb3NlX21hcDsKJiM0MzsJCX0KIAl9CiAKIAlzaWduYWwoU0lHSU5ULCBpbnRfZXhpdCk7CkBAIC0yMDIsMjUgJiM0MzsyMzksMzMgQEAgaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCWlmIChqc29uX291dHB1dCkKIAkJanNvbndfc3RhcnRfYXJyYXkoanNvbl93dHIpOwogCiYjNDM7CWVyciA9IDA7CiAJd2hpbGUgKCFzdG9wKSB7Ci0JCWVyciA9IHBlcmZfYnVmZmVyX19wb2xsKHBiLCAyMDApOwomIzQzOwkJZXJyID0gcmIgPyByaW5nX2J1ZmZlcl9fcG9sbChyYiwgMjAwKSA6IHBlcmZfYnVmZmVyX19wb2xsKHBiLCAyMDApOwogCQlpZiAoZXJyICZsdDsgMCAmYW1wOyZhbXA7IGVyciAhPSAtRUlOVFIpIHsKLQkJCXBfZXJyKCYjMzQ7cGVyZiBidWZmZXIgcG9sbGluZyBmYWlsZWQ6ICVzICglZCkmIzM0OywKLQkJCSAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pOwotCQkJZ290byBlcnJfY2xvc2VfcGI7CiYjNDM7CQkJZnByaW50ZihzdGRlcnIsICYjMzQ7RXJyb3I6ICVzIGJ1ZmZlciBwb2xsaW5nIGZhaWxlZDogJXMgKCVkKVxuJiMzNDssCiYjNDM7CQkJCXJiID8gJiMzNDtyaW5nJiMzNDsgOiAmIzM0O3BlcmYmIzM0Oywgc3RyZXJyb3IoLWVyciksIC1lcnIpOwomIzQzOwkJCWJyZWFrOwogCQl9CiYjNDM7CQllcnIgPSAwOwogCX0KIAomIzQzOwlpZiAoc3RvcCkKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0O1N0b3BwaW5nLi4uXG4mIzM0Oyk7CiAJaWYgKGpzb25fb3V0cHV0KQogCQlqc29ud19lbmRfYXJyYXkoanNvbl93dHIpOwomIzQzOwlpZiAoZmZsdXNoKHN0ZG91dCkpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0O0Vycm9yOiBmYWlsZWQgdG8gd3JpdGUgZXZlbnRzOiAlc1xuJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CQllcnIgPSAtMTsKJiM0MzsJfQogCiYjNDM7CXJpbmdfYnVmZmVyX19mcmVlKHJiKTsKIAlwZXJmX2J1ZmZlcl9fZnJlZShwYik7CiYjNDM7CS8qIEJvdGggYnVmZmVyIG1hbmFnZXJzIGJvcnJvdyBtYXBfZmQuICovCiAJY2xvc2UobWFwX2ZkKTsKIAotCXJldHVybiAwOwomIzQzOwlyZXR1cm4gZXJyICZsdDsgMCA/IC0xIDogMDsKIAotZXJyX2Nsb3NlX3BiOgotCXBlcmZfYnVmZmVyX19mcmVlKHBiKTsKIGVycl9jbG9zZV9tYXA6CiAJY2xvc2UobWFwX2ZkKTsKIAlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjIwOTliZjEwMjA5MzAKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuYwpAQCAtMCwwICYjNDM7MSwzODEgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOyNpbmNsdWRlICZsdDtjdHlwZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtwb2xsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3NpZ25hbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvbW1hbi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvd2FpdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZ0b29sX3JpbmdidWYuc2tlbC5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIFdBSVRfU1RFUFMgNTAwCiYjNDM7I2RlZmluZSBXQUlUX1VTIDEwMDAwCiYjNDM7CiYjNDM7c3RydWN0IGNvbnN1bWVyIHsKJiM0MzsJcGlkX3QgcGlkOwomIzQzOwlpbnQgZmQ7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgY29uc3QgY2hhciAqYnBmdG9vbF9wYXRoKHZvaWQpCiYjNDM7ewomIzQzOwljb25zdCBjaGFyICpwYXRoID0gZ2V0ZW52KCYjMzQ7QlBGVE9PTCYjMzQ7KTsKJiM0MzsKJiM0MzsJaWYgKHBhdGgpCiYjNDM7CQlyZXR1cm4gYWNjZXNzKHBhdGgsIFhfT0spID8gTlVMTCA6IHBhdGg7CiYjNDM7CWlmICghYWNjZXNzKCYjMzQ7Li90b29scy9zYmluL2JwZnRvb2wmIzM0OywgWF9PSykpCiYjNDM7CQlyZXR1cm4gJiMzNDsuL3Rvb2xzL3NiaW4vYnBmdG9vbCYjMzQ7OwomIzQzOwlpZiAoIWFjY2VzcygmIzM0Oy4uL3Rvb2xzL3NiaW4vYnBmdG9vbCYjMzQ7LCBYX09LKSkKJiM0MzsJCXJldHVybiAmIzM0Oy4uL3Rvb2xzL3NiaW4vYnBmdG9vbCYjMzQ7OwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY29uc3VtZXJfY2xlYW51cChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkKQomIzQzO3sKJiM0MzsJaWYgKGNoaWxkLSZndDtwaWQgJmd0OyAwKSB7CiYjNDM7CQlraWxsKGNoaWxkLSZndDtwaWQsIFNJR0tJTEwpOwomIzQzOwkJd2hpbGUgKHdhaXRwaWQoY2hpbGQtJmd0O3BpZCwgTlVMTCwgMCkgJmx0OyAwICZhbXA7JmFtcDsgZXJybm8gPT0gRUlOVFIpCiYjNDM7CQkJOwomIzQzOwkJY2hpbGQtJmd0O3BpZCA9IC0xOwomIzQzOwl9CiYjNDM7CWlmIChjaGlsZC0mZ3Q7ZmQgJmd0Oz0gMCkgewomIzQzOwkJY2xvc2UoY2hpbGQtJmd0O2ZkKTsKJiM0MzsJCWNoaWxkLSZndDtmZCA9IC0xOwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIGNvbnN1bWVyX3N0YXJ0KHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBtYXBfZmQsIGJvb2wganNvbiwKJiM0MzsJCQkgICBjb25zdCBjaGFyICpvcHRpb24sIGJvb2wgcGFpciwgYm9vbCBjYXB0dXJlX2Vycm9ycykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9OwomIzQzOwlfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7CiYjNDM7CWNvbnN0IGNoYXIgKnBhdGggPSBicGZ0b29sX3BhdGgoKTsKJiM0MzsJY2hhciAqYXJndlsxMl0sIGlkWzE2XTsKJiM0MzsJaW50IG91dFsyXSwgcmVhZHlbMl0sIG4gPSAwLCBlcnIsIGVycl9mZDsKJiM0MzsJc3RydWN0IHBvbGxmZCBwZmQ7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihwYXRoLCAmIzM0O2JwZnRvb2wgcGF0aCAoc2V0IEJQRlRPT0wgdG8gb3ZlcnJpZGUpJiMzNDspIHx8CiYjNDM7CSAgICAhQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQobWFwX2ZkLCAmYW1wO2luZm8sICZhbXA7bGVuKSwgJiMzNDttYXAgaW5mbyYjMzQ7KSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJc25wcmludGYoaWQsIHNpemVvZihpZCksICYjMzQ7JXUmIzM0OywgaW5mby5pZCk7CiYjNDM7CWFyZ3ZbbiYjNDM7JiM0MztdID0gKGNoYXIgKilwYXRoOwomIzQzOwlpZiAoanNvbikKJiM0MzsJCWFyZ3ZbbiYjNDM7JiM0MztdID0gJiMzNDstaiYjMzQ7OwomIzQzOwlhcmd2W24mIzQzOyYjNDM7XSA9ICYjMzQ7bWFwJiMzNDs7CiYjNDM7CWFyZ3ZbbiYjNDM7JiM0MztdID0gJiMzNDtldmVudF9waXBlJiMzNDs7CiYjNDM7CWFyZ3ZbbiYjNDM7JiM0MztdID0gJiMzNDtpZCYjMzQ7OwomIzQzOwlhcmd2W24mIzQzOyYjNDM7XSA9IGlkOwomIzQzOwlpZiAob3B0aW9uKSB7CiYjNDM7CQlhcmd2W24mIzQzOyYjNDM7XSA9IChjaGFyICopb3B0aW9uOwomIzQzOwkJYXJndltuJiM0MzsmIzQzO10gPSAmIzM0OzAmIzM0OzsKJiM0MzsJCWlmIChwYWlyKSB7CiYjNDM7CQkJYXJndltuJiM0MzsmIzQzO10gPSAmIzM0O2luZGV4JiMzNDs7CiYjNDM7CQkJYXJndltuJiM0MzsmIzQzO10gPSAmIzM0OzAmIzM0OzsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlhcmd2W25dID0gTlVMTDsKJiM0MzsJaWYgKCFBU1NFUlRfT0socGlwZTIob3V0LCBPX0NMT0VYRUMpLCAmIzM0O291dHB1dCBwaXBlJiMzNDspKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhwaXBlMihyZWFkeSwgT19DTE9FWEVDKSwgJiMzNDtleGVjIHBpcGUmIzM0OykpIHsKJiM0MzsJCWNsb3NlKG91dFswXSk7CiYjNDM7CQljbG9zZShvdXRbMV0pOwomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CWNoaWxkLSZndDtwaWQgPSBmb3JrKCk7CiYjNDM7CWlmICghY2hpbGQtJmd0O3BpZCkgewomIzQzOwkJY2xvc2Uob3V0WzBdKTsKJiM0MzsJCWNsb3NlKHJlYWR5WzBdKTsKJiM0MzsJCWVycl9mZCA9IGNhcHR1cmVfZXJyb3JzID8gb3V0WzFdIDogb3BlbigmIzM0Oy9kZXYvbnVsbCYjMzQ7LCBPX1dST05MWSk7CiYjNDM7CQlpZiAoZHVwMihvdXRbMV0sIFNURE9VVF9GSUxFTk8pICZsdDsgMCB8fAomIzQzOwkJICAgIGR1cDIoZXJyX2ZkLCBTVERFUlJfRklMRU5PKSAmbHQ7IDApCiYjNDM7CQkJZ290byBleGVjX2ZhaWw7CiYjNDM7CQlpZiAoIWNhcHR1cmVfZXJyb3JzKQomIzQzOwkJCWNsb3NlKGVycl9mZCk7CiYjNDM7CQljbG9zZShvdXRbMV0pOwomIzQzOwkJZXhlY3YocGF0aCwgYXJndik7CiYjNDM7ZXhlY19mYWlsOgomIzQzOwkJZXJyID0gZXJybm87CiYjNDM7CQl3cml0ZShyZWFkeVsxXSwgJmFtcDtlcnIsIHNpemVvZihlcnIpKTsKJiM0MzsJCV9leGl0KDEyNyk7CiYjNDM7CX0KJiM0MzsJY2xvc2Uob3V0WzFdKTsKJiM0MzsJY2xvc2UocmVhZHlbMV0pOwomIzQzOwljaGlsZC0mZ3Q7ZmQgPSBvdXRbMF07CiYjNDM7CXBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IHJlYWR5WzBdLCAuZXZlbnRzID0gUE9MTElOIH07CiYjNDM7CS8qIEVPRiBvbiB0aGUgY2xvc2Utb24tZXhlYyBwaXBlIGRpc3Rpbmd1aXNoZXMgZXhlYyBmcm9tIGluaGVyaXRlZCBoYW5kbGVycy4gKi8KJiM0MzsJZXJyID0gY2hpbGQtJmd0O3BpZCAmZ3Q7IDAgPyBwb2xsKCZhbXA7cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApIDogLTE7CiYjNDM7CWlmICghQVNTRVJUX0dUKGNoaWxkLSZndDtwaWQsIDAsICYjMzQ7Zm9yayYjMzQ7KSB8fAomIzQzOwkgICAgIUFTU0VSVF9HVChlcnIsIDAsICYjMzQ7ZXhlYyB0aW1lb3V0JiMzNDspIHx8CiYjNDM7CSAgICAhQVNTRVJUX0VRKHJlYWQocmVhZHlbMF0sICZhbXA7ZXJyLCBzaXplb2YoZXJyKSksIDAsICYjMzQ7ZXhlYyYjMzQ7KSkgewomIzQzOwkJY2xvc2UocmVhZHlbMF0pOwomIzQzOwkJY29uc3VtZXJfY2xlYW51cChjaGlsZCk7CiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsJY2xvc2UocmVhZHlbMF0pOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZXJfZmluaXNoKHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBzaWdubywgYm9vbCBzdWNjZXNzLAomIzQzOwkJCSAgICBjaGFyICpvdXRwdXQsIHNpemVfdCBzaXplKQomIzQzO3sKJiM0MzsJaW50IHN0YXR1cyA9IDAsIGk7CiYjNDM7CXBpZF90IHJldCA9IDA7CiYjNDM7CXNzaXplX3QgbjsKJiM0MzsJc2l6ZV90IHVzZWQgPSAwOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhmY250bChjaGlsZC0mZ3Q7ZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spLCAmIzM0O25vbmJsb2NraW5nIG91dHB1dCYjMzQ7KSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJaWYgKHNpZ25vICZhbXA7JmFtcDsgIUFTU0VSVF9PSyhraWxsKGNoaWxkLSZndDtwaWQsIHNpZ25vKSwgJiMzNDtzaWduYWwgY29uc3VtZXImIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBXQUlUX1NURVBTOyBpJiM0MzsmIzQzOykgewomIzQzOwkJd2hpbGUgKHVzZWQgJmx0OyBzaXplIC0gMSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgICAgKG4gPSByZWFkKGNoaWxkLSZndDtmZCwgb3V0cHV0ICYjNDM7IHVzZWQsIHNpemUgLSAxIC0gdXNlZCkpICZndDsgMCkKJiM0MzsJCQl1c2VkICYjNDM7PSBuOwomIzQzOwkJcmV0ID0gd2FpdHBpZChjaGlsZC0mZ3Q7cGlkLCAmYW1wO3N0YXR1cywgV05PSEFORyk7CiYjNDM7CQlpZiAocmV0ID09IGNoaWxkLSZndDtwaWQpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlpZiAocmV0ICZsdDsgMCAmYW1wOyZhbXA7IGVycm5vICE9IEVJTlRSKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJdXNsZWVwKFdBSVRfVVMpOwomIzQzOwl9CiYjNDM7CWlmICghQVNTRVJUX0VRKHJldCwgY2hpbGQtJmd0O3BpZCwgJiMzNDtib3VuZGVkIGNvbnN1bWVyIGV4aXQmIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CWNoaWxkLSZndDtwaWQgPSAtMTsKJiM0MzsJd2hpbGUgKHVzZWQgJmx0OyBzaXplIC0gMSAmYW1wOyZhbXA7IChuID0gcmVhZChjaGlsZC0mZ3Q7ZmQsIG91dHB1dCAmIzQzOyB1c2VkLCBzaXplIC0gMSAtIHVzZWQpKSAmZ3Q7IDApCiYjNDM7CQl1c2VkICYjNDM7PSBuOwomIzQzOwlvdXRwdXRbdXNlZF0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CXJldHVybiBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtub3JtYWwgZXhpdCYjMzQ7KSAmYW1wOyZhbXA7CiYjNDM7CSAgICAgICBBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSA9PSAwLCBzdWNjZXNzLCAmIzM0O2V4aXQgc3RhdHVzJiMzNDspOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBjb25zdW1lcl9yZWFkeShzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBsb25nIGNhdWdodDsKJiM0MzsJY2hhciBwYXRoWzY0XSwgbGluZVsyNTZdOwomIzQzOwlpbnQgaTsKJiM0MzsJRklMRSAqZjsKJiM0MzsKJiM0MzsJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAmIzM0Oy9wcm9jLyVkL3N0YXR1cyYjMzQ7LCBjaGlsZC0mZ3Q7cGlkKTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFdBSVRfU1RFUFM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlmID0gZm9wZW4ocGF0aCwgJiMzNDtyJiMzNDspOwomIzQzOwkJaWYgKCFmKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHsKJiM0MzsJCQlpZiAoc3NjYW5mKGxpbmUsICYjMzQ7U2lnQ2d0OiAlbGx4JiMzNDssICZhbXA7Y2F1Z2h0KSA9PSAxICZhbXA7JmFtcDsKJiM0MzsJCQkgICAgKGNhdWdodCAmYW1wOyAoMVVMTCAmbHQ7Jmx0OyAoU0lHSU5UIC0gMSkpKSAmYW1wOyZhbXA7CiYjNDM7CQkJICAgIChjYXVnaHQgJmFtcDsgKDFVTEwgJmx0OyZsdDsgKFNJR1RFUk0gLSAxKSkpKSB7CiYjNDM7CQkJCWZjbG9zZShmKTsKJiM0MzsJCQkJcmV0dXJuIHRydWU7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwkJZmNsb3NlKGYpOwomIzQzOwkJdXNsZWVwKFdBSVRfVVMpOwomIzQzOwl9CiYjNDM7CXJldHVybiBBU1NFUlRfVFJVRShmYWxzZSwgJiMzNDtjb25zdW1lciBzaWduYWwgaGFuZGxlcnMgcmVhZHkmIzM0Oyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIGVtaXRfcmVjb3JkKHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWwsIGludCByZWNvcmQpCiYjNDM7ewomIzQzOwljaGFyIHBhY2tldFs2NF0gPSB7fTsKJiM0MzsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMsCiYjNDM7CQkgICAgLmRhdGFfaW4gPSBwYWNrZXQsCiYjNDM7CQkgICAgLmRhdGFfc2l6ZV9pbiA9IHNpemVvZihwYWNrZXQpLAomIzQzOwkpOwomIzQzOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3JlY29yZCA9IHJlY29yZDsKJiM0MzsJcmV0dXJuIEFTU0VSVF9PSyhicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy5wcm9kdWNlKSwKJiM0MzsJCQkJCSAgICAgICZhbXA7b3B0cyksICYjMzQ7cHJvZHVjZSByZWNvcmQmIzM0OykgJmFtcDsmYW1wOwomIzQzOwkgICAgICAgQVNTRVJUX09LKHNrZWwtJmd0O2Jzcy0mZ3Q7b3V0cHV0X2VyciwgJiMzNDtyaW5nYnVmIG91dHB1dCYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgY29uc3VtZWQodW5zaWduZWQgbG9uZyAqcG9zaXRpb24sIHVuc2lnbmVkIGxvbmcgZXhwZWN0ZWQpCiYjNDM7ewomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFdBSVRfU1RFUFM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoX19hdG9taWNfbG9hZF9uKHBvc2l0aW9uLCBfX0FUT01JQ19BQ1FVSVJFKSA9PSBleHBlY3RlZCkKJiM0MzsJCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJCXVzbGVlcChXQUlUX1VTKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gQVNTRVJUX0VRKCpwb3NpdGlvbiwgZXhwZWN0ZWQsICYjMzQ7Y29uc3VtZXIgcG9zaXRpb24mIzM0Oyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNoZWNrX2pzb24oY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICpleHBlY3RlZCkKJiM0Mzt7CiYjNDM7CWNoYXIgKnNyYyA9IG91dHB1dCwgKmRzdCA9IG91dHB1dDsKJiM0MzsJYm9vbCBxdW90ZWQgPSBmYWxzZSwgZXNjYXBlZCA9IGZhbHNlOwomIzQzOwomIzQzOwkvKiBJZ25vcmUgZm9ybWF0dGluZyB3aGl0ZXNwYWNlIHdoaWxlIGNoZWNraW5nIHRoZSBlbnRpcmUgSlNPTiBkb2N1bWVudC4gKi8KJiM0MzsJd2hpbGUgKCpzcmMpIHsKJiM0MzsJCWlmIChxdW90ZWQgfHwgIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnNyYykpCiYjNDM7CQkJKmRzdCYjNDM7JiM0MzsgPSAqc3JjOwomIzQzOwkJaWYgKCFlc2NhcGVkICZhbXA7JmFtcDsgKnNyYyA9PSAmIzM5OyYjMzQ7JiMzOTspCiYjNDM7CQkJcXVvdGVkID0gIXF1b3RlZDsKJiM0MzsJCWVzY2FwZWQgPSAhZXNjYXBlZCAmYW1wOyZhbXA7IHF1b3RlZCAmYW1wOyZhbXA7ICpzcmMgPT0gJiMzOTtcXCYjMzk7OwomIzQzOwkJc3JjJiM0MzsmIzQzOzsKJiM0MzsJfQomIzQzOwkqZHN0ID0gJiMzOTtcMCYjMzk7OwomIzQzOwlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtKU09OIHJlY29yZHMmIzM0Oyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfY29uc3VtZXIoYm9vbCBqc29uLCBib29sIGlkbGUsIGludCBzaWdubykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9OwomIzQzOwlzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsOwomIzQzOwl1bnNpZ25lZCBsb25nICpwb3NpdGlvbiA9IE1BUF9GQUlMRUQ7CiYjNDM7CWludCBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpLCBmZDsKJiM0MzsJY2hhciBvdXRwdXRbNDA5Nl07CiYjNDM7CXN0cnVjdCBwb2xsZmQgcGZkOwomIzQzOwomIzQzOwlza2VsID0gYnBmdG9vbF9yaW5nYnVmX19vcGVuKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O29wZW4mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLSZndDttYXBzLnJpbmdidWYsIHBhZ2Vfc2l6ZSk7CiYjNDM7CWlmICghQVNTRVJUX09LKGJwZnRvb2xfcmluZ2J1Zl9fbG9hZChza2VsKSwgJiMzNDtsb2FkJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWZkID0gYnBmX21hcF9fZmQoc2tlbC0mZ3Q7bWFwcy5yaW5nYnVmKTsKJiM0MzsJcG9zaXRpb24gPSBtbWFwKE5VTEwsIHBhZ2Vfc2l6ZSwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBmZCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX05FUShwb3NpdGlvbiwgTUFQX0ZBSUxFRCwgJiMzNDtjb25zdW1lciBtbWFwJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghaWRsZSAmYW1wOyZhbXA7ICghZW1pdF9yZWNvcmQoc2tlbCwgMCkgfHwgIWVtaXRfcmVjb3JkKHNrZWwsIDEpKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZiAoIWNvbnN1bWVyX3N0YXJ0KCZhbXA7Y2hpbGQsIGZkLCBqc29uLCBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8CiYjNDM7CSAgICAhY29uc3VtZXJfcmVhZHkoJmFtcDtjaGlsZCkpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFpZGxlKSB7CiYjNDM7CQkvKiBCb3RoIHByZWZpbGxlZCByZWNvcmRzIG9jY3VweSAxNiBieXRlcyBpbmNsdWRpbmcgdGhlaXIgaGVhZGVycy4gKi8KJiM0MzsJCWlmICghY29uc3VtZWQocG9zaXRpb24sIDMyKSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCXBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IGNoaWxkLmZkLCAuZXZlbnRzID0gUE9MTElOIH07CiYjNDM7CQlpZiAoIUFTU0VSVF9HVChwb2xsKCZhbXA7cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApLCAwLAomIzQzOwkJCSAgICAgICAmIzM0O3JlY29yZHMgZmx1c2hlZCBiZWZvcmUgZXhpdCYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyAmYW1wOyBQT0xMSU4sICYjMzQ7cmVjb3JkIG91dHB1dCByZWFkYWJsZSYjMzQ7KSB8fAomIzQzOwkJICAgICFlbWl0X3JlY29yZChza2VsLCAyKSB8fCAhY29uc3VtZWQocG9zaXRpb24sIDY0KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlpZiAoIWNvbnN1bWVyX2ZpbmlzaCgmYW1wO2NoaWxkLCBzaWdubywgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKGpzb24pCiYjNDM7CQljaGVja19qc29uKG91dHB1dCwgaWRsZSA/ICYjMzQ7W10mIzM0OyA6CiYjNDM7CQkJICAgJiMzNDtbe1wmIzM0O3NpemVcJiMzNDs6MixcJiMzNDtkYXRhXCYjMzQ7OlswLDI1NV19LCYjMzQ7CiYjNDM7CQkJICAgJiMzNDt7XCYjMzQ7c2l6ZVwmIzM0Ozo1LFwmIzM0O2RhdGFcJiMzNDs6WzEsMiwzLDQsNV19LCYjMzQ7CiYjNDM7CQkJICAgJiMzNDt7XCYjMzQ7c2l6ZVwmIzM0OzoxNyxcJiMzNDtkYXRhXCYjMzQ7OlsxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywmIzM0OwomIzQzOwkJCSAgICYjMzQ7MjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzJdfV0mIzM0Oyk7CiYjNDM7CWVsc2UKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyAmIzM0OyYjMzQ7IDoKJiM0MzsJCQkgICAgICYjMzQ7PT0gc2l6ZTogMiA9PT09PVxuMDAgZmZcbiYjMzQ7CiYjNDM7CQkJICAgICAmIzM0Oz09IHNpemU6IDUgPT09PT1cbjAxIDAyIDAzIDA0IDA1XG4mIzM0OwomIzQzOwkJCSAgICAgJiMzNDs9PSBzaXplOiAxNyA9PT09PVxuMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgICYjMzQ7CiYjNDM7CQkJICAgICAmIzM0OzE4IDE5IDFhIDFiIDFjIDFkIDFlIDFmXG4yMFxuJiMzNDssICYjMzQ7cGxhaW4gcmVjb3JkcyYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWNvbnN1bWVyX2NsZWFudXAoJmFtcDtjaGlsZCk7CiYjNDM7CWlmIChwb3NpdGlvbiAhPSBNQVBfRkFJTEVEKQomIzQzOwkJbXVubWFwKHBvc2l0aW9uLCBwYWdlX3NpemUpOwomIzQzOwlicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfcGVyZl9jb25zdW1lcih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07CiYjNDM7CXVuc2lnbmVkIGxvbmcgbG9uZyBzZWNvbmRzLCBuYW5vc2Vjb25kczsKJiM0MzsJc3RydWN0IGJwZnRvb2xfcmluZ2J1ZiAqc2tlbDsKJiM0MzsJY2hhciBvdXRwdXRbMTYzODRdLCBleHBlY3RlZFsxNjM4NF07CiYjNDM7CWludCBucl9jcHVzLCBjcHUsIGluZGV4LCBvZmZzZXQgPSAwLCBpLCB1c2VkID0gMCwgZmllbGRzOwomIzQzOwlzdHJ1Y3QgcG9sbGZkIHBmZDsKJiM0MzsKJiM0MzsJbnJfY3B1cyA9IGxpYmJwZl9udW1fcG9zc2libGVfY3B1cygpOwomIzQzOwlpZiAoIUFTU0VSVF9HVChucl9jcHVzLCAwLCAmIzM0O3Bvc3NpYmxlIGNwdXMmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CXNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsICYjMzQ7b3BlbiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJYnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtJmd0O21hcHMucmluZ2J1ZiwgZ2V0cGFnZXNpemUoKSk7CiYjNDM7CWJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLSZndDttYXBzLnBlcmZidWYsIG5yX2NwdXMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhicGZ0b29sX3JpbmdidWZfX2xvYWQoc2tlbCksICYjMzQ7bG9hZCYjMzQ7KSB8fAomIzQzOwkgICAgIWNvbnN1bWVyX3N0YXJ0KCZhbXA7Y2hpbGQsIGJwZl9tYXBfX2ZkKHNrZWwtJmd0O21hcHMucGVyZmJ1ZiksIGZhbHNlLAomIzQzOwkJCSAgICBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8ICFjb25zdW1lcl9yZWFkeSgmYW1wO2NoaWxkKSB8fAomIzQzOwkgICAgIWVtaXRfcmVjb3JkKHNrZWwsIDMpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CS8qIE9uZSBsYXJnZSByZWNvcmQgZmx1c2hlcyB0aGUgZXhpc3RpbmcgYnVmZmVyZWQgcGVyZiBvdXRwdXQgY2FsbGJhY2suICovCiYjNDM7CXBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IGNoaWxkLmZkLCAuZXZlbnRzID0gUE9MTElOIH07CiYjNDM7CWlmICghQVNTRVJUX0dUKHBvbGwoJmFtcDtwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCksIDAsCiYjNDM7CQkgICAgICAgJiMzNDtwZXJmIHJlY29yZCBvdXRwdXQmIzM0OykgfHwKJiM0MzsJICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyAmYW1wOyBQT0xMSU4sICYjMzQ7cGVyZiBvdXRwdXQgcmVhZGFibGUmIzM0OykgfHwKJiM0MzsJICAgICFjb25zdW1lcl9maW5pc2goJmFtcDtjaGlsZCwgU0lHSU5ULCB0cnVlLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmaWVsZHMgPSBzc2NhbmYob3V0cHV0LCAmIzM0Oz09IEAlbGx1LiVsbHUgQ1BVOiAlZCBpbmRleDogJWQgPT09PT1cbiVuJiMzNDssCiYjNDM7CQkJJmFtcDtzZWNvbmRzLCAmYW1wO25hbm9zZWNvbmRzLCAmYW1wO2NwdSwgJmFtcDtpbmRleCwgJmFtcDtvZmZzZXQpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShmaWVsZHMsIDQsICYjMzQ7cGVyZiBoZWFkZXImIzM0OykgfHwKJiM0MzsJICAgICFBU1NFUlRfR1Qob2Zmc2V0LCAwLCAmIzM0O3BlcmYgcGF5bG9hZCBvZmZzZXQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJQVNTRVJUX0dUKHNlY29uZHMgKiAxMDAwMDAwMDAwVUxMICYjNDM7IG5hbm9zZWNvbmRzLCAwLCAmIzM0O3BlcmYgdGltZXN0YW1wJiMzNDspOwomIzQzOwlBU1NFUlRfTFQobmFub3NlY29uZHMsIDEwMDAwMDAwMDBVTEwsICYjMzQ7cGVyZiB0aW1lc3RhbXAgbmFub3NlY29uZHMmIzM0Oyk7CiYjNDM7CUFTU0VSVF9HRShjcHUsIDAsICYjMzQ7cGVyZiBjcHUmIzM0Oyk7CiYjNDM7CUFTU0VSVF9MVChjcHUsIG5yX2NwdXMsICYjMzQ7cGVyZiBjcHUgcmFuZ2UmIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShpbmRleCwgY3B1LCAmIzM0O3BlcmYgaW5kZXgmIzM0Oyk7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBzaXplb2Yoc2tlbC0mZ3Q7cm9kYXRhLSZndDtwZXJmX3BheWxvYWQpOyBpJiM0MzsmIzQzOykgewomIzQzOwkJY29uc3QgY2hhciAqc2VwYXJhdG9yID0gIWkgPyAmIzM0OyYjMzQ7IDogIShpICUgMTYpID8gJiMzNDtcbiYjMzQ7IDoKJiM0MzsJCQkJCSEoaSAlIDgpID8gJiMzNDsgICYjMzQ7IDogJiMzNDsgJiMzNDs7CiYjNDM7CiYjNDM7CQl1c2VkICYjNDM7PSBzbnByaW50ZihleHBlY3RlZCAmIzQzOyB1c2VkLCBzaXplb2YoZXhwZWN0ZWQpIC0gdXNlZCwKJiM0MzsJCQkJICYjMzQ7JXMlMDJ4JiMzNDssIHNlcGFyYXRvciwgaSA9PSAxID8gMHhmZiA6IDApOwomIzQzOwl9CiYjNDM7CXNucHJpbnRmKGV4cGVjdGVkICYjNDM7IHVzZWQsIHNpemVvZihleHBlY3RlZCkgLSB1c2VkLCAmIzM0O1xuJiMzNDspOwomIzQzOwlBU1NFUlRfU1RSRVEob3V0cHV0ICYjNDM7IG9mZnNldCwgZXhwZWN0ZWQsICYjMzQ7cGVyZiBwYXlsb2FkJiMzNDspOwomIzQzO291dDoKJiM0MzsJY29uc3VtZXJfY2xlYW51cCgmYW1wO2NoaWxkKTsKJiM0MzsJYnBmdG9vbF9yaW5nYnVmX19kZXN0cm95KHNrZWwpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3JlamVjdChlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBjb25zdCBjaGFyICpvcHRpb24sIGJvb2wgcGFpciwgYm9vbCBqc29uKQomIzQzO3sKJiM0MzsJc3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07CiYjNDM7CWJvb2wgcmluZyA9IHR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgfHwgdHlwZSA9PSBCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGOwomIzQzOwljb25zdCBjaGFyICpleHBlY3RlZCA9IG9wdGlvbiA/CiYjNDM7CQkmIzM0O3tcJiMzNDtlcnJvclwmIzM0OzpcJiMzNDtyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHNcJiMzNDt9JiMzNDsgOgomIzQzOwkJJiMzNDt7XCYjMzQ7ZXJyb3JcJiMzNDs6XCYjMzQ7bWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcJiMzNDt9JiMzNDs7CiYjNDM7CWNoYXIgb3V0cHV0WzQwOTZdOwomIzQzOwlpbnQgZmQ7CiYjNDM7CiYjNDM7CWZkID0gYnBmX21hcF9jcmVhdGUodHlwZSwgTlVMTCwgcmluZyA/IDAgOiA0LCByaW5nID8gMCA6IDQsCiYjNDM7CQkJICAgIHJpbmcgPyBnZXRwYWdlc2l6ZSgpIDogMSwgTlVMTCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O2NyZWF0ZSBtYXAmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlmIChjb25zdW1lcl9zdGFydCgmYW1wO2NoaWxkLCBmZCwganNvbiwgb3B0aW9uLCBwYWlyLCB0cnVlKSAmYW1wOyZhbXA7CiYjNDM7CSAgICBjb25zdW1lcl9maW5pc2goJmFtcDtjaGlsZCwgMCwgZmFsc2UsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKSB7CiYjNDM7CQlpZiAoanNvbikKJiM0MzsJCQljaGVja19qc29uKG91dHB1dCwgZXhwZWN0ZWQpOwomIzQzOwkJZWxzZQomIzQzOwkJCUFTU0VSVF9HVChzdHJsZW4ob3V0cHV0KSwgMCwgJiMzNDtlcnJvciBkaWFnbm9zdGljJiMzNDspOwomIzQzOwl9CiYjNDM7CWNvbnN1bWVyX2NsZWFudXAoJmFtcDtjaGlsZCk7CiYjNDM7CWNsb3NlKGZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X2JwZnRvb2xfcmluZ2J1Zih2b2lkKQomIzQzO3sKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtwZXJmX2V2ZW50X2FycmF5JiMzNDspKQomIzQzOwkJdGVzdF9wZXJmX2NvbnN1bWVyKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cGxhaW4mIzM0OykpCiYjNDM7CQl0ZXN0X2NvbnN1bWVyKGZhbHNlLCBmYWxzZSwgU0lHSU5UKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtqc29uJiMzNDspKQomIzQzOwkJdGVzdF9jb25zdW1lcih0cnVlLCBmYWxzZSwgU0lHVEVSTSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7aWRsZV9zaWdpbnQmIzM0OykpCiYjNDM7CQl0ZXN0X2NvbnN1bWVyKGZhbHNlLCB0cnVlLCBTSUdJTlQpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2lkbGVfc2lndGVybV9qc29uJiMzNDspKQomIzQzOwkJdGVzdF9jb25zdW1lcih0cnVlLCB0cnVlLCBTSUdURVJNKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtyZWplY3RfYXJyYXkmIzM0OykpCiYjNDM7CQl0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfQVJSQVksIE5VTEwsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmVqZWN0X3VzZXJfcmluZ2J1ZiYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmVqZWN0X2NwdSYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCAmIzM0O2NwdSYjMzQ7LCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JlamVjdF9pbmRleCYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCAmIzM0O2luZGV4JiMzNDssIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmVqZWN0X2NwdV9pbmRleCYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCAmIzM0O2NwdSYjMzQ7LCB0cnVlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cmVqZWN0X3VzZXJfcmluZ2J1Zl9qc29uJiMzNDspKQomIzQzOwkJdGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRiwgTlVMTCwgZmFsc2UsIHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3JlamVjdF9jcHVfaW5kZXhfanNvbiYjMzQ7KSkKJiM0MzsJCXRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCAmIzM0O2NwdSYjMzQ7LCB0cnVlLCB0cnVlKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvYnBmdG9vbF9yaW5nYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uYmJiYzkzYzMwYTgzMwotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9icGZ0b29sX3JpbmdidWYuYwpAQCAtMCwwICYjNDM7MSw0NyBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2JwZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1JJTkdCVUYpOwomIzQzO30gcmluZ2J1ZiBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpOwomIzQzOwlfX3VpbnQoa2V5X3NpemUsIHNpemVvZihfX3UzMikpOwomIzQzOwlfX3VpbnQodmFsdWVfc2l6ZSwgc2l6ZW9mKF9fdTMyKSk7CiYjNDM7CV9fdWludChtYXhfZW50cmllcywgMSk7CiYjNDM7fSBwZXJmYnVmIFNFQygmIzM0Oy5tYXBzJiMzNDspOwomIzQzOwomIzQzOy8qCiYjNDM7ICogSW5jbHVkZSB0aGUgdTMyIHJhdyBzaXplIGluIHBlcmYmIzM5O3MgOC1ieXRlIGFsaWdubWVudCB0byBhdm9pZCBwYWRkaW5nLgomIzQzOyAqIEtlZXAgcGxhaW4gb3V0cHV0IGxhcmdlIGVub3VnaCB0byBmbHVzaCBzdGRpbyBiZWZvcmUgdGhlIGNvbnN1bWVyIGV4aXRzLgomIzQzOyAqLwomIzQzO2NvbnN0IHVuc2lnbmVkIGNoYXIgcGVyZl9wYXlsb2FkWzQwOTJdID0geyAweDAwLCAweGZmIH07CiYjNDM7CiYjNDM7aW50IHJlY29yZDsKJiM0MztpbnQgb3V0cHV0X2VycjsKJiM0MzsKJiM0MztTRUMoJiMzNDtzb2NrZXQmIzM0OykKJiM0MztpbnQgcHJvZHVjZShzdHJ1Y3QgX19za19idWZmICpza2IpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBjaGFyIGZpcnN0W10gPSB7IDB4MDAsIDB4ZmYgfTsKJiM0MzsJdW5zaWduZWQgY2hhciBzZWNvbmRbXSA9IHsgMSwgMiwgMywgNCwgNSB9OwomIzQzOwl1bnNpZ25lZCBjaGFyIHRoaXJkW10gPSB7CiYjNDM7CQkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAomIzQzOwkJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJaWYgKHJlY29yZCA9PSAwKQomIzQzOwkJb3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dCgmYW1wO3JpbmdidWYsIGZpcnN0LCBzaXplb2YoZmlyc3QpLCAwKTsKJiM0MzsJZWxzZSBpZiAocmVjb3JkID09IDEpCiYjNDM7CQlvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KCZhbXA7cmluZ2J1Ziwgc2Vjb25kLCBzaXplb2Yoc2Vjb25kKSwgMCk7CiYjNDM7CWVsc2UgaWYgKHJlY29yZCA9PSAyKQomIzQzOwkJb3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dCgmYW1wO3JpbmdidWYsIHRoaXJkLCBzaXplb2YodGhpcmQpLCAwKTsKJiM0MzsJZWxzZQomIzQzOwkJb3V0cHV0X2VyciA9IGJwZl9wZXJmX2V2ZW50X291dHB1dChza2IsICZhbXA7cGVyZmJ1ZiwgQlBGX0ZfQ1VSUkVOVF9DUFUsCiYjNDM7CQkJCQkJICAgKHZvaWQgKilwZXJmX3BheWxvYWQsIHNpemVvZihwZXJmX3BheWxvYWQpKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgTElDRU5TRVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMjoyMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTE5NAoJCQkJCQkJb3V0cHV0OiAxMDIKCQkJCQkJCXRob3VnaHRzOiA0OTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyBFdmFsdWF0aW9uOiBUaGlzIFBhdGNoIFNlcmllcyoqCgpPa2F5LCBsZXQmIzM5O3Mgc2VlLiBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRvIGFzc2VzcyBpZiB0aGlzIHBhdGNoIHNlcmllcyB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLiBUaGUgZmlyc3Qgc3RlcCBpcyB0byBkaXZlIGludG8gdGhlIGRpZmYuIFRoZSBmaWxlcyB0b3VjaGVkIGFyZSBhbGwgbG9jYXRlZCBpbiBgdG9vbHMvYDogc3BlY2lmaWNhbGx5LCBgdG9vbHMvYnBmL2JwZnRvb2wvYCBhbmQgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9gLiBXZSBoYXZlOiBgRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RgLCB0aGUgYGJwZnRvb2xgIGJhc2ggY29tcGxldGlvbiBzY3JpcHQsIGBtYXBfcGVyZl9yaW5nLmNgIHdpdGhpbiBgYnBmdG9vbGAsIGFuZCBhIGZldyByZWxhdGVkIHRlc3RzIGluIHRoZSBgc2VsZnRlc3RzYCBkaXJlY3RvcnkuCgpOb3csIGxldCYjMzk7cyBkb3VibGUtY2hlY2sgdGhlIGZ1enppbmcgZ3VpZGVsaW5lcy4gU2VjdGlvbiAyIGNsZWFybHkgbGF5cyBvdXQgdGhlICYjMzQ7bmVnYXRpdmUgY3JpdGVyaWEmIzM0OyAtIHRoZSBjYXNlcyB3aGVyZSB3ZSAqZG9uJiMzOTt0KiBmdXp6LiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgYWxpZ25zIHdpdGggdGhlIHJ1bGVzLiBUaGUgZ3VpZGVsaW5lcyBleHBsaWNpdGx5IHN0YXRlIHRoYXQgY2hhbmdlcyB3aXRoaW4gdXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyB0aGF0ICpkb24mIzM5O3QqIGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlIChgdm1saW51eGApIG9yIGtlcm5lbCBtb2R1bGVzIGFyZSBhIG5vLWdvIGZvciBmdXp6aW5nLgoKR2l2ZW4gdGhhdCBhbGwgdGhlIG1vZGlmaWNhdGlvbnMgYXJlIHNxdWFyZWx5IHdpdGhpbiB0aGUgYHRvb2xzL2AgZGlyZWN0b3J5LCBzcGVjaWZpY2FsbHkgd2l0aGluIGBicGZ0b29sYCAod2hpY2ggaXMgYSB1c2VyLXNwYWNlIHRvb2wpIGFuZCB0aGUgYXNzb2NpYXRlZCBCUEYgc2VsZnRlc3RzLCBpdCBzZWVtcyBjbGVhciB0aGlzIGZhbGxzIHVuZGVyIHRoZSAmIzM0O25vdCB3b3J0aCBmdXp6aW5nJiMzNDsgY2F0ZWdvcnkuIE5vbmUgb2YgdGhlc2UgY2hhbmdlcyB0b3VjaCBhbnkga2VybmVsIHJ1bnRpbWUgY29kZSAodGhlIGNyaXRpY2FsIGB2bWxpbnV4YCBvciBtb2R1bGUgY29kZSkuIEl0JiMzOTtzIGFsbCBzZWxmLWNvbnRhaW5lZC4KClRoZXJlZm9yZSwgbXkgZmluYWwgY29uY2x1c2lvbiBpcyB0aGF0IGBXb3J0aEZ1enppbmcgPSBmYWxzZWAuIENvbnNlcXVlbnRseSwgYEZvY3VzU3ltYm9sc2Agd2lsbCBiZSBlbXB0eSwgYXMgd2lsbCBgRW5hYmxlQ29uZmlnc2AuIFRoZSByZWFzb25pbmcgaXMgdGhhdCB0aGUgcGF0Y2ggc2VyaWVzIGlzIGVudGlyZWx5IGNvbmZpbmVkIHRvIHVzZXItc3BhY2UgdG9vbGluZyBhbmQgdGVzdHMsIGxlYXZpbmcgdGhlIGtlcm5lbCBydW50aW1lIHVuYWZmZWN0ZWQuIEkgd2lsbCBub3cgY2FsbCBgc2V0LXJlc3VsdHNgIHdpdGggdGhpcyBhbmFseXNpcyBhbmQgbW92ZSBvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMjoyMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFtdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHNlcmllcyBleGNsdXNpdmVseSBtb2RpZmllcyB1c2VyLXNwYWNlIHRvb2xpbmcgKGJwZnRvb2wpIGFuZCBzZWxmdGVzdHMgdW5kZXIgdGhlIHRvb2xzLyBkaXJlY3RvcnkgKHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYpLiBObyBrZXJuZWwgcnVudGltZSBjb2RlLCBtb2R1bGVzLCBvciB2bWxpbnV4IGltYWdlcyBhcmUgbW9kaWZpZWQsIHNvIHRoaXMgY2hhbmdlIGRvZXMgbm90IHdhcnJhbnQgc3l6a2FsbGVyIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBzZXJpZXMgZXhjbHVzaXZlbHkgbW9kaWZpZXMgdXNlci1zcGFjZSB0b29saW5nIChicGZ0b29sKSBhbmQgc2VsZnRlc3RzIHVuZGVyIHRoZSB0b29scy8gZGlyZWN0b3J5ICh0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmKS4gTm8ga2VybmVsIHJ1bnRpbWUgY29kZSwgbW9kdWxlcywgb3Igdm1saW51eCBpbWFnZXMgYXJlIG1vZGlmaWVkLCBzbyB0aGlzIGNoYW5nZSBkb2VzIG5vdCB3YXJyYW50IHN5emthbGxlciBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwMjoyMDwvdGQ+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+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDdUMDI6MjA6MzAuODg0Mzc2ODIxWiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjIyMjE4NzMzNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNlcmllcyBleGNsdXNpdmVseSBtb2RpZmllcyB1c2VyLXNwYWNlIHRvb2xpbmcgKGJwZnRvb2wpIGFuZCBzZWxmdGVzdHMgdW5kZXIgdGhlIHRvb2xzLyBkaXJlY3RvcnkgKHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYpLiBObyBrZXJuZWwgcnVudGltZSBjb2RlLCBtb2R1bGVzLCBvciB2bWxpbnV4IGltYWdlcyBhcmUgbW9kaWZpZWQsIHNvIHRoaXMgY2hhbmdlIGRvZXMgbm90IHdhcnJhbnQgc3l6a2FsbGVyIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwMjoyMDozMC44ODQzODI2MDFaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2ODgwOTQzMDgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBhMmQxYzVhNjAyODc5ZDM3OTk1ZjMwMWMwMjBkY2NlZjBiMzBkMmI4XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gU2VwIDcgMDI6MjA6MjggMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLmM0NGU2Zjc5N2U1NzcgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbkBAIC0xMjAsNyArMTIwLDggQEAgYnBmdG9vbCBtYXAgcGluICAgICAqTUFQKiAgKkZJTEUqXFxuICAgICBjaGFyYWN0ZXIgKCcuJyksIHdoaWNoIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyBvZiAqYnBmZnMqLlxcbiBcXG4gYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdXFxuLSAgICBSZWFkIGV2ZW50cyBmcm9tIGEgKipCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSoqIG1hcC5cXG4rICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogb3JcXG4rICAgICoqQlBGX01BUF9UWVBFX1JJTkdCVUYqKiBtYXAuXFxuIFxcbiAgICAgSW5zdGFsbCBwZXJmIHJpbmdzIGludG8gYSBwZXJmIGV2ZW50IGFycmF5IG1hcCBhbmQgZHVtcCBvdXRwdXQgb2YgYW55XFxuICAgICAqKmJwZl9wZXJmX2V2ZW50X291dHB1dCoqXFxcXCAoKSBjYWxsIGluIHRoZSBrZXJuZWwuIEJ5IGRlZmF1bHQgcmVhZCB0aGVcXG5AQCAtMTM0LDYgKzEzNSwxOCBAQCBicGZ0b29sIG1hcCBldmVudF9waXBlICpNQVAqIFtjcHUgKk4qIGluZGV4ICpNKl1cXG4gICAgIGV4aXN0aW5nIHJpbmcuICBBbnkgb3RoZXIgYXBwbGljYXRpb24gd2lsbCBzdG9wIHJlY2VpdmluZyBldmVudHMgaWYgaXRcXG4gICAgIGluc3RhbGxlZCBpdHMgcmluZ3MgZWFybGllci5cXG4gXFxuKyAgICBGb3IgYSByaW5nIGJ1ZmZlciBtYXAsIGNvbnN1bWUgcmVjb3JkcyBzdWJtaXR0ZWQgYnkgQlBGIHByb2dyYW1zLCBpbmNsdWRpbmdcXG4rICAgIHJlY29yZHMgYWxyZWFkeSBxdWV1ZWQgYmVmb3JlIHRoZSBjb21tYW5kIHN0YXJ0cy4gKipjcHUqKiBhbmQgKippbmRleCoqXFxuKyAgICBhcmUgbm90IHN1cHBvcnRlZC4gRWFjaCByZWNvcmQgaXMgcHJpbnRlZCBhcyByYXcgYnl0ZXMsIGluY2x1ZGluZyBlbWJlZGRlZFxcbisgICAgemVybyBieXRlcy4gUGxhaW4gb3V0cHV0IHJlcG9ydHMgdGhlIHJlY29yZCBzaXplIGZvbGxvd2VkIGJ5IGhleGFkZWNpbWFsXFxuKyAgICBieXRlczsgSlNPTiBvdXRwdXQgY29udGFpbnMgKipzaXplKiogYW5kICoqZGF0YSoqIGZpZWxkcywgd2l0aCAqKmRhdGEqKiBhblxcbisgICAgYXJyYXkgb2YgYnl0ZSB2YWx1ZXMuIFJpbmcgYnVmZmVyIHJlY29yZHMgaGF2ZSBubyBpbXBsaWNpdCBDUFUgb3IgdGltZXN0YW1wLlxcbitcXG4rICAgIFJpbmcgYnVmZmVycyBzdXBwb3J0IGEgc2luZ2xlIGNvbnN1bWVyLiBUaGlzIGNvbW1hbmQgYWR2YW5jZXMgdGhlIHNoYXJlZFxcbisgICAgY29uc3VtZXIgcG9zaXRpb24gYW5kIG11c3Qgbm90IHJ1biBhbG9uZ3NpZGUgYW5vdGhlciBjb25zdW1lciBvZiB0aGUgc2FtZVxcbisgICAgbWFwOyBpdCBkb2VzIG5vdCBwcm92aWRlIGEgcGFzc2l2ZSB2aWV3IG9mIGV2ZW50cy4gKipCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGKipcXG4rICAgIG1hcHMgYXJlIG5vdCBzdXBwb3J0ZWQuXFxuK1xcbiBicGZ0b29sIG1hcCBwZWVrICAqTUFQKlxcbiAgICAgUGVlayBuZXh0IHZhbHVlIGluIHRoZSBxdWV1ZSBvciBzdGFjay5cXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcXG5pbmRleCA3NWNiY2I1MTJlYmFlLi4xNzUwYjQ4OGM5ZTNiIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcXG5AQCAtODc4LDExICs4NzgsMTEgQEAgX2JwZnRvb2woKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7XFxuICAgICAgICAgICAgICAgICAgICAgICAgIGlkKVxcbi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgcGVyZl9ldmVudF9hcnJheVxcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgJ1xcXCJ0eXBlXFxcIjogXFxcIlxcXFwocGVyZl9ldmVudF9hcnJheVxcXFx8cmluZ2J1ZlxcXFwpXFxcIidcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKVxcbi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9uYW1lc19mb3JfdHlwZSBwZXJmX2V2ZW50X2FycmF5XFxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX25hbWVzX2Zvcl90eXBlICdcXFwidHlwZVxcXCI6IFxcXCJcXFxcKHBlcmZfZXZlbnRfYXJyYXlcXFxcfHJpbmdidWZcXFxcKVxcXCInXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgY3B1KVxcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmNcXG5pbmRleCBiY2I3NjdlMmQ2NzMzLi43ZDU1NTMzMWY0NDNhIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcF9wZXJmX3JpbmcuY1xcbkBAIC0yNyw3ICsyNyw3IEBAXFxuIFxcbiAjZGVmaW5lIE1NQVBfUEFHRV9DTlRcXHQxNlxcbiBcXG4tc3RhdGljIHZvbGF0aWxlIGJvb2wgc3RvcDtcXG4rc3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBzdG9wO1xcbiBcXG4gc3RydWN0IHBlcmZfZXZlbnRfc2FtcGxlIHtcXG4gXFx0c3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyIGhlYWRlcjtcXG5AQCAtNDQsNyArNDQsNiBAQCBzdHJ1Y3QgcGVyZl9ldmVudF9sb3N0IHtcXG4gXFxuIHN0YXRpYyB2b2lkIGludF9leGl0KGludCBzaWdubylcXG4ge1xcbi1cXHRmcHJpbnRmKHN0ZGVyciwgXFxcIlN0b3BwaW5nLi4uXFxcXG5cXFwiKTtcXG4gXFx0c3RvcCA9IHRydWU7XFxuIH1cXG4gXFxuQEAgLTEwNyw2ICsxMDYsMjcgQEAgcHJpbnRfYnBmX291dHB1dCh2b2lkICpwcml2YXRlX2RhdGEsIGludCBjcHUsIHN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciAqZXZlbnQpXFxuIFxcdHJldHVybiBMSUJCUEZfUEVSRl9FVkVOVF9DT05UO1xcbiB9XFxuIFxcbitzdGF0aWMgaW50IHByaW50X3JpbmdidWZfb3V0cHV0KHZvaWQgKmN0eCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpXFxuK3tcXG4rXFx0aWYgKGpzb25fb3V0cHV0KSB7XFxuK1xcdFxcdGpzb253X3N0YXJ0X29iamVjdChqc29uX3d0cik7XFxuK1xcdFxcdGpzb253X3VpbnRfZmllbGQoanNvbl93dHIsIFxcXCJzaXplXFxcIiwgc2l6ZSk7XFxuK1xcdFxcdGpzb253X25hbWUoanNvbl93dHIsIFxcXCJkYXRhXFxcIik7XFxuK1xcdFxcdHByaW50X2RhdGFfanNvbihkYXRhLCBzaXplKTtcXG4rXFx0XFx0anNvbndfZW5kX29iamVjdChqc29uX3d0cik7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHByaW50ZihcXFwiPT0gc2l6ZTogJXp1ID09PT09XFxcXG5cXFwiLCBzaXplKTtcXG4rXFx0XFx0ZnByaW50X2hleChzdGRvdXQsIGRhdGEsIHNpemUsIFxcXCIgXFxcIik7XFxuK1xcdFxcdHByaW50ZihcXFwiXFxcXG5cXFwiKTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGZmbHVzaChzdGRvdXQpKVxcbitcXHRcXHRyZXR1cm4gZXJybm8gPyAtZXJybm8gOiAtRUlPO1xcbitcXG4rXFx0LyogQSBwcm9kdWNlciBjYW4ga2VlcCBwb2xsKCkgYnVzeSBldmVuIGFmdGVyIGEgc2lnbmFsIGFycml2ZXMuICovXFxuK1xcdHJldHVybiBzdG9wID8gLUVJTlRSIDogMDtcXG4rfVxcbitcXG4gaW50IGRvX2V2ZW50X3BpcGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiB7XFxuIFxcdHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgcGVyZl9hdHRyID0ge1xcbkBAIC0xMjMsMTggKzE0MywyNiBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdC5jcHUgPSAtMSxcXG4gXFx0XFx0LmlkeCA9IC0xLFxcbiBcXHR9O1xcbi1cXHRzdHJ1Y3QgcGVyZl9idWZmZXIgKnBiO1xcbitcXHRzdHJ1Y3QgcGVyZl9idWZmZXIgKnBiID0gTlVMTDtcXG4rXFx0c3RydWN0IHJpbmdfYnVmZmVyICpyYiA9IE5VTEw7XFxuIFxcdF9fdTMyIG1hcF9pbmZvX2xlbjtcXG4gXFx0aW50IGVyciwgbWFwX2ZkO1xcbiBcXG4rXFx0c3RvcCA9IGZhbHNlO1xcbiBcXHRtYXBfaW5mb19sZW4gPSBzaXplb2YobWFwX2luZm8pO1xcbiBcXHRtYXBfZmQgPSBtYXBfcGFyc2VfZmRfYW5kX2luZm8oXFx1MDAyNmFyZ2MsIFxcdTAwMjZhcmd2LCBcXHUwMDI2bWFwX2luZm8sIFxcdTAwMjZtYXBfaW5mb19sZW4sXFxuIFxcdFxcdFxcdFxcdCAgICAgICAwKTtcXG4gXFx0aWYgKG1hcF9mZCBcXHUwMDNjIDApXFxuIFxcdFxcdHJldHVybiAtMTtcXG4gXFxuLVxcdGlmIChtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKSB7XFxuLVxcdFxcdHBfZXJyKFxcXCJtYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheVxcXCIpO1xcbitcXHRpZiAobWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgbWFwX2luZm8udHlwZSAhPSBCUEZfTUFQX1RZUEVfUklOR0JVRikge1xcbitcXHRcXHRwX2VycihcXFwibWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcXFwiKTtcXG4rXFx0XFx0Z290byBlcnJfY2xvc2VfbWFwO1xcbitcXHR9XFxuK1xcbitcXHRpZiAobWFwX2luZm8udHlwZSA9PSBCUEZfTUFQX1RZUEVfUklOR0JVRiBcXHUwMDI2XFx1MDAyNiBhcmdjKSB7XFxuK1xcdFxcdHBfZXJyKFxcXCJyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHNcXFwiKTtcXG4gXFx0XFx0Z290byBlcnJfY2xvc2VfbWFwO1xcbiBcXHR9XFxuIFxcbkBAIC0xODQsMTUgKzIxMiwyNCBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdGN0eC5pZHggPSAwO1xcbiBcXHR9XFxuIFxcbi1cXHRvcHRzLmNwdV9jbnQgPSBjdHguYWxsX2NwdXMgPyAwIDogMTtcXG4tXFx0b3B0cy5jcHVzID0gXFx1MDAyNmN0eC5jcHU7XFxuLVxcdG9wdHMubWFwX2tleXMgPSBcXHUwMDI2Y3R4LmlkeDtcXG4tXFx0cGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsIFxcdTAwMjZwZXJmX2F0dHIsXFxuLVxcdFxcdFxcdFxcdCAgcHJpbnRfYnBmX291dHB1dCwgXFx1MDAyNmN0eCwgXFx1MDAyNm9wdHMpO1xcbi1cXHRpZiAoIXBiKSB7XFxuLVxcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpXFxcIixcXG4tXFx0XFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XFxuLVxcdFxcdGdvdG8gZXJyX2Nsb3NlX21hcDtcXG4rXFx0aWYgKG1hcF9pbmZvLnR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYpIHtcXG4rXFx0XFx0cmIgPSByaW5nX2J1ZmZlcl9fbmV3KG1hcF9mZCwgcHJpbnRfcmluZ2J1Zl9vdXRwdXQsIE5VTEwsIE5VTEwpO1xcbitcXHRcXHRpZiAoIXJiKSB7XFxuK1xcdFxcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gY3JlYXRlIHJpbmcgYnVmZmVyOiAlcyAoJWQpXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XFxuK1xcdFxcdFxcdGdvdG8gZXJyX2Nsb3NlX21hcDtcXG4rXFx0XFx0fVxcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRvcHRzLmNwdV9jbnQgPSBjdHguYWxsX2NwdXMgPyAwIDogMTtcXG4rXFx0XFx0b3B0cy5jcHVzID0gXFx1MDAyNmN0eC5jcHU7XFxuK1xcdFxcdG9wdHMubWFwX2tleXMgPSBcXHUwMDI2Y3R4LmlkeDtcXG4rXFx0XFx0cGIgPSBwZXJmX2J1ZmZlcl9fbmV3X3JhdyhtYXBfZmQsIE1NQVBfUEFHRV9DTlQsIFxcdTAwMjZwZXJmX2F0dHIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgcHJpbnRfYnBmX291dHB1dCwgXFx1MDAyNmN0eCwgXFx1MDAyNm9wdHMpO1xcbitcXHRcXHRpZiAoIXBiKSB7XFxuK1xcdFxcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gY3JlYXRlIHBlcmYgYnVmZmVyOiAlcyAoJWQpXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XFxuK1xcdFxcdFxcdGdvdG8gZXJyX2Nsb3NlX21hcDtcXG4rXFx0XFx0fVxcbiBcXHR9XFxuIFxcbiBcXHRzaWduYWwoU0lHSU5ULCBpbnRfZXhpdCk7XFxuQEAgLTIwMiwyNSArMjM5LDMzIEBAIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0aWYgKGpzb25fb3V0cHV0KVxcbiBcXHRcXHRqc29ud19zdGFydF9hcnJheShqc29uX3d0cik7XFxuIFxcbitcXHRlcnIgPSAwO1xcbiBcXHR3aGlsZSAoIXN0b3ApIHtcXG4tXFx0XFx0ZXJyID0gcGVyZl9idWZmZXJfX3BvbGwocGIsIDIwMCk7XFxuK1xcdFxcdGVyciA9IHJiID8gcmluZ19idWZmZXJfX3BvbGwocmIsIDIwMCkgOiBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTtcXG4gXFx0XFx0aWYgKGVyciBcXHUwMDNjIDAgXFx1MDAyNlxcdTAwMjYgZXJyICE9IC1FSU5UUikge1xcbi1cXHRcXHRcXHRwX2VycihcXFwicGVyZiBidWZmZXIgcG9sbGluZyBmYWlsZWQ6ICVzICglZClcXFwiLFxcbi1cXHRcXHRcXHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcXG4tXFx0XFx0XFx0Z290byBlcnJfY2xvc2VfcGI7XFxuK1xcdFxcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiRXJyb3I6ICVzIGJ1ZmZlciBwb2xsaW5nIGZhaWxlZDogJXMgKCVkKVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0cmIgPyBcXFwicmluZ1xcXCIgOiBcXFwicGVyZlxcXCIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdH1cXG4rXFx0XFx0ZXJyID0gMDtcXG4gXFx0fVxcbiBcXG4rXFx0aWYgKHN0b3ApXFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiU3RvcHBpbmcuLi5cXFxcblxcXCIpO1xcbiBcXHRpZiAoanNvbl9vdXRwdXQpXFxuIFxcdFxcdGpzb253X2VuZF9hcnJheShqc29uX3d0cik7XFxuK1xcdGlmIChmZmx1c2goc3Rkb3V0KSkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIkVycm9yOiBmYWlsZWQgdG8gd3JpdGUgZXZlbnRzOiAlc1xcXFxuXFxcIiwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0XFx0ZXJyID0gLTE7XFxuK1xcdH1cXG4gXFxuK1xcdHJpbmdfYnVmZmVyX19mcmVlKHJiKTtcXG4gXFx0cGVyZl9idWZmZXJfX2ZyZWUocGIpO1xcbitcXHQvKiBCb3RoIGJ1ZmZlciBtYW5hZ2VycyBib3Jyb3cgbWFwX2ZkLiAqL1xcbiBcXHRjbG9zZShtYXBfZmQpO1xcbiBcXG4tXFx0cmV0dXJuIDA7XFxuK1xcdHJldHVybiBlcnIgXFx1MDAzYyAwID8gLTEgOiAwO1xcbiBcXG4tZXJyX2Nsb3NlX3BiOlxcbi1cXHRwZXJmX2J1ZmZlcl9fZnJlZShwYik7XFxuIGVycl9jbG9zZV9tYXA6XFxuIFxcdGNsb3NlKG1hcF9mZCk7XFxuIFxcdHJldHVybiAtMTtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMjA5OWJmMTAyMDkzMFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuY1xcbkBAIC0wLDAgKzEsMzgxIEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKyNpbmNsdWRlIFxcdTAwM2NjdHlwZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3BvbGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3NpZ25hbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy93YWl0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJicGZ0b29sX3JpbmdidWYuc2tlbC5oXFxcIlxcbitcXG4rI2RlZmluZSBXQUlUX1NURVBTIDUwMFxcbisjZGVmaW5lIFdBSVRfVVMgMTAwMDBcXG4rXFxuK3N0cnVjdCBjb25zdW1lciB7XFxuK1xcdHBpZF90IHBpZDtcXG4rXFx0aW50IGZkO1xcbit9O1xcbitcXG4rc3RhdGljIGNvbnN0IGNoYXIgKmJwZnRvb2xfcGF0aCh2b2lkKVxcbit7XFxuK1xcdGNvbnN0IGNoYXIgKnBhdGggPSBnZXRlbnYoXFxcIkJQRlRPT0xcXFwiKTtcXG4rXFxuK1xcdGlmIChwYXRoKVxcbitcXHRcXHRyZXR1cm4gYWNjZXNzKHBhdGgsIFhfT0spID8gTlVMTCA6IHBhdGg7XFxuK1xcdGlmICghYWNjZXNzKFxcXCIuL3Rvb2xzL3NiaW4vYnBmdG9vbFxcXCIsIFhfT0spKVxcbitcXHRcXHRyZXR1cm4gXFxcIi4vdG9vbHMvc2Jpbi9icGZ0b29sXFxcIjtcXG4rXFx0aWYgKCFhY2Nlc3MoXFxcIi4uL3Rvb2xzL3NiaW4vYnBmdG9vbFxcXCIsIFhfT0spKVxcbitcXHRcXHRyZXR1cm4gXFxcIi4uL3Rvb2xzL3NiaW4vYnBmdG9vbFxcXCI7XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBjb25zdW1lcl9jbGVhbnVwKHN0cnVjdCBjb25zdW1lciAqY2hpbGQpXFxuK3tcXG4rXFx0aWYgKGNoaWxkLVxcdTAwM2VwaWQgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdGtpbGwoY2hpbGQtXFx1MDAzZXBpZCwgU0lHS0lMTCk7XFxuK1xcdFxcdHdoaWxlICh3YWl0cGlkKGNoaWxkLVxcdTAwM2VwaWQsIE5VTEwsIDApIFxcdTAwM2MgMCBcXHUwMDI2XFx1MDAyNiBlcnJubyA9PSBFSU5UUilcXG4rXFx0XFx0XFx0O1xcbitcXHRcXHRjaGlsZC1cXHUwMDNlcGlkID0gLTE7XFxuK1xcdH1cXG4rXFx0aWYgKGNoaWxkLVxcdTAwM2VmZCBcXHUwMDNlPSAwKSB7XFxuK1xcdFxcdGNsb3NlKGNoaWxkLVxcdTAwM2VmZCk7XFxuK1xcdFxcdGNoaWxkLVxcdTAwM2VmZCA9IC0xO1xcbitcXHR9XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGNvbnN1bWVyX3N0YXJ0KHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBtYXBfZmQsIGJvb2wganNvbixcXG4rXFx0XFx0XFx0ICAgY29uc3QgY2hhciAqb3B0aW9uLCBib29sIHBhaXIsIGJvb2wgY2FwdHVyZV9lcnJvcnMpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307XFxuK1xcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcXG4rXFx0Y29uc3QgY2hhciAqcGF0aCA9IGJwZnRvb2xfcGF0aCgpO1xcbitcXHRjaGFyICphcmd2WzEyXSwgaWRbMTZdO1xcbitcXHRpbnQgb3V0WzJdLCByZWFkeVsyXSwgbiA9IDAsIGVyciwgZXJyX2ZkO1xcbitcXHRzdHJ1Y3QgcG9sbGZkIHBmZDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihwYXRoLCBcXFwiYnBmdG9vbCBwYXRoIChzZXQgQlBGVE9PTCB0byBvdmVycmlkZSlcXFwiKSB8fFxcbitcXHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKG1hcF9mZCwgXFx1MDAyNmluZm8sIFxcdTAwMjZsZW4pLCBcXFwibWFwIGluZm9cXFwiKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRzbnByaW50ZihpZCwgc2l6ZW9mKGlkKSwgXFxcIiV1XFxcIiwgaW5mby5pZCk7XFxuK1xcdGFyZ3ZbbisrXSA9IChjaGFyICopcGF0aDtcXG4rXFx0aWYgKGpzb24pXFxuK1xcdFxcdGFyZ3ZbbisrXSA9IFxcXCItalxcXCI7XFxuK1xcdGFyZ3ZbbisrXSA9IFxcXCJtYXBcXFwiO1xcbitcXHRhcmd2W24rK10gPSBcXFwiZXZlbnRfcGlwZVxcXCI7XFxuK1xcdGFyZ3ZbbisrXSA9IFxcXCJpZFxcXCI7XFxuK1xcdGFyZ3ZbbisrXSA9IGlkO1xcbitcXHRpZiAob3B0aW9uKSB7XFxuK1xcdFxcdGFyZ3ZbbisrXSA9IChjaGFyICopb3B0aW9uO1xcbitcXHRcXHRhcmd2W24rK10gPSBcXFwiMFxcXCI7XFxuK1xcdFxcdGlmIChwYWlyKSB7XFxuK1xcdFxcdFxcdGFyZ3ZbbisrXSA9IFxcXCJpbmRleFxcXCI7XFxuK1xcdFxcdFxcdGFyZ3ZbbisrXSA9IFxcXCIwXFxcIjtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdGFyZ3Zbbl0gPSBOVUxMO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhwaXBlMihvdXQsIE9fQ0xPRVhFQyksIFxcXCJvdXRwdXQgcGlwZVxcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdGlmICghQVNTRVJUX09LKHBpcGUyKHJlYWR5LCBPX0NMT0VYRUMpLCBcXFwiZXhlYyBwaXBlXFxcIikpIHtcXG4rXFx0XFx0Y2xvc2Uob3V0WzBdKTtcXG4rXFx0XFx0Y2xvc2Uob3V0WzFdKTtcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcdGNoaWxkLVxcdTAwM2VwaWQgPSBmb3JrKCk7XFxuK1xcdGlmICghY2hpbGQtXFx1MDAzZXBpZCkge1xcbitcXHRcXHRjbG9zZShvdXRbMF0pO1xcbitcXHRcXHRjbG9zZShyZWFkeVswXSk7XFxuK1xcdFxcdGVycl9mZCA9IGNhcHR1cmVfZXJyb3JzID8gb3V0WzFdIDogb3BlbihcXFwiL2Rldi9udWxsXFxcIiwgT19XUk9OTFkpO1xcbitcXHRcXHRpZiAoZHVwMihvdXRbMV0sIFNURE9VVF9GSUxFTk8pIFxcdTAwM2MgMCB8fFxcbitcXHRcXHQgICAgZHVwMihlcnJfZmQsIFNUREVSUl9GSUxFTk8pIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0Z290byBleGVjX2ZhaWw7XFxuK1xcdFxcdGlmICghY2FwdHVyZV9lcnJvcnMpXFxuK1xcdFxcdFxcdGNsb3NlKGVycl9mZCk7XFxuK1xcdFxcdGNsb3NlKG91dFsxXSk7XFxuK1xcdFxcdGV4ZWN2KHBhdGgsIGFyZ3YpO1xcbitleGVjX2ZhaWw6XFxuK1xcdFxcdGVyciA9IGVycm5vO1xcbitcXHRcXHR3cml0ZShyZWFkeVsxXSwgXFx1MDAyNmVyciwgc2l6ZW9mKGVycikpO1xcbitcXHRcXHRfZXhpdCgxMjcpO1xcbitcXHR9XFxuK1xcdGNsb3NlKG91dFsxXSk7XFxuK1xcdGNsb3NlKHJlYWR5WzFdKTtcXG4rXFx0Y2hpbGQtXFx1MDAzZWZkID0gb3V0WzBdO1xcbitcXHRwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSByZWFkeVswXSwgLmV2ZW50cyA9IFBPTExJTiB9O1xcbitcXHQvKiBFT0Ygb24gdGhlIGNsb3NlLW9uLWV4ZWMgcGlwZSBkaXN0aW5ndWlzaGVzIGV4ZWMgZnJvbSBpbmhlcml0ZWQgaGFuZGxlcnMuICovXFxuK1xcdGVyciA9IGNoaWxkLVxcdTAwM2VwaWQgXFx1MDAzZSAwID8gcG9sbChcXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApIDogLTE7XFxuK1xcdGlmICghQVNTRVJUX0dUKGNoaWxkLVxcdTAwM2VwaWQsIDAsIFxcXCJmb3JrXFxcIikgfHxcXG4rXFx0ICAgICFBU1NFUlRfR1QoZXJyLCAwLCBcXFwiZXhlYyB0aW1lb3V0XFxcIikgfHxcXG4rXFx0ICAgICFBU1NFUlRfRVEocmVhZChyZWFkeVswXSwgXFx1MDAyNmVyciwgc2l6ZW9mKGVycikpLCAwLCBcXFwiZXhlY1xcXCIpKSB7XFxuK1xcdFxcdGNsb3NlKHJlYWR5WzBdKTtcXG4rXFx0XFx0Y29uc3VtZXJfY2xlYW51cChjaGlsZCk7XFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXHRjbG9zZShyZWFkeVswXSk7XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBjb25zdW1lcl9maW5pc2goc3RydWN0IGNvbnN1bWVyICpjaGlsZCwgaW50IHNpZ25vLCBib29sIHN1Y2Nlc3MsXFxuK1xcdFxcdFxcdCAgICBjaGFyICpvdXRwdXQsIHNpemVfdCBzaXplKVxcbit7XFxuK1xcdGludCBzdGF0dXMgPSAwLCBpO1xcbitcXHRwaWRfdCByZXQgPSAwO1xcbitcXHRzc2l6ZV90IG47XFxuK1xcdHNpemVfdCB1c2VkID0gMDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX09LKGZjbnRsKGNoaWxkLVxcdTAwM2VmZCwgRl9TRVRGTCwgT19OT05CTE9DSyksIFxcXCJub25ibG9ja2luZyBvdXRwdXRcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRpZiAoc2lnbm8gXFx1MDAyNlxcdTAwMjYgIUFTU0VSVF9PSyhraWxsKGNoaWxkLVxcdTAwM2VwaWQsIHNpZ25vKSwgXFxcInNpZ25hbCBjb25zdW1lclxcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBXQUlUX1NURVBTOyBpKyspIHtcXG4rXFx0XFx0d2hpbGUgKHVzZWQgXFx1MDAzYyBzaXplIC0gMSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgICAgKG4gPSByZWFkKGNoaWxkLVxcdTAwM2VmZCwgb3V0cHV0ICsgdXNlZCwgc2l6ZSAtIDEgLSB1c2VkKSkgXFx1MDAzZSAwKVxcbitcXHRcXHRcXHR1c2VkICs9IG47XFxuK1xcdFxcdHJldCA9IHdhaXRwaWQoY2hpbGQtXFx1MDAzZXBpZCwgXFx1MDAyNnN0YXR1cywgV05PSEFORyk7XFxuK1xcdFxcdGlmIChyZXQgPT0gY2hpbGQtXFx1MDAzZXBpZClcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzYyAwIFxcdTAwMjZcXHUwMDI2IGVycm5vICE9IEVJTlRSKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0dXNsZWVwKFdBSVRfVVMpO1xcbitcXHR9XFxuK1xcdGlmICghQVNTRVJUX0VRKHJldCwgY2hpbGQtXFx1MDAzZXBpZCwgXFxcImJvdW5kZWQgY29uc3VtZXIgZXhpdFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdGNoaWxkLVxcdTAwM2VwaWQgPSAtMTtcXG4rXFx0d2hpbGUgKHVzZWQgXFx1MDAzYyBzaXplIC0gMSBcXHUwMDI2XFx1MDAyNiAobiA9IHJlYWQoY2hpbGQtXFx1MDAzZWZkLCBvdXRwdXQgKyB1c2VkLCBzaXplIC0gMSAtIHVzZWQpKSBcXHUwMDNlIDApXFxuK1xcdFxcdHVzZWQgKz0gbjtcXG4rXFx0b3V0cHV0W3VzZWRdID0gJ1xcXFwwJztcXG4rXFx0cmV0dXJuIEFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcXFwibm9ybWFsIGV4aXRcXFwiKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgICAgQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cykgPT0gMCwgc3VjY2VzcywgXFxcImV4aXQgc3RhdHVzXFxcIik7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGNvbnN1bWVyX3JlYWR5KHN0cnVjdCBjb25zdW1lciAqY2hpbGQpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBsb25nIGNhdWdodDtcXG4rXFx0Y2hhciBwYXRoWzY0XSwgbGluZVsyNTZdO1xcbitcXHRpbnQgaTtcXG4rXFx0RklMRSAqZjtcXG4rXFxuK1xcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXFxcIi9wcm9jLyVkL3N0YXR1c1xcXCIsIGNoaWxkLVxcdTAwM2VwaWQpO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgV0FJVF9TVEVQUzsgaSsrKSB7XFxuK1xcdFxcdGYgPSBmb3BlbihwYXRoLCBcXFwiclxcXCIpO1xcbitcXHRcXHRpZiAoIWYpXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmKSkge1xcbitcXHRcXHRcXHRpZiAoc3NjYW5mKGxpbmUsIFxcXCJTaWdDZ3Q6ICVsbHhcXFwiLCBcXHUwMDI2Y2F1Z2h0KSA9PSAxIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdFxcdCAgICAoY2F1Z2h0IFxcdTAwMjYgKDFVTEwgXFx1MDAzY1xcdTAwM2MgKFNJR0lOVCAtIDEpKSkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0XFx0ICAgIChjYXVnaHQgXFx1MDAyNiAoMVVMTCBcXHUwMDNjXFx1MDAzYyAoU0lHVEVSTSAtIDEpKSkpIHtcXG4rXFx0XFx0XFx0XFx0ZmNsb3NlKGYpO1xcbitcXHRcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcdFxcdGZjbG9zZShmKTtcXG4rXFx0XFx0dXNsZWVwKFdBSVRfVVMpO1xcbitcXHR9XFxuK1xcdHJldHVybiBBU1NFUlRfVFJVRShmYWxzZSwgXFxcImNvbnN1bWVyIHNpZ25hbCBoYW5kbGVycyByZWFkeVxcXCIpO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBlbWl0X3JlY29yZChzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsLCBpbnQgcmVjb3JkKVxcbit7XFxuK1xcdGNoYXIgcGFja2V0WzY0XSA9IHt9O1xcbitcXG4rXFx0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMsXFxuK1xcdFxcdCAgICAuZGF0YV9pbiA9IHBhY2tldCxcXG4rXFx0XFx0ICAgIC5kYXRhX3NpemVfaW4gPSBzaXplb2YocGFja2V0KSxcXG4rXFx0KTtcXG4rXFxuK1xcdHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjb3JkID0gcmVjb3JkO1xcbitcXHRyZXR1cm4gQVNTRVJUX09LKGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXFx1MDAzZXByb2dzLnByb2R1Y2UpLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBcXHUwMDI2b3B0cyksIFxcXCJwcm9kdWNlIHJlY29yZFxcXCIpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAgICBBU1NFUlRfT0soc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VvdXRwdXRfZXJyLCBcXFwicmluZ2J1ZiBvdXRwdXRcXFwiKTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgY29uc3VtZWQodW5zaWduZWQgbG9uZyAqcG9zaXRpb24sIHVuc2lnbmVkIGxvbmcgZXhwZWN0ZWQpXFxuK3tcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgV0FJVF9TVEVQUzsgaSsrKSB7XFxuK1xcdFxcdGlmIChfX2F0b21pY19sb2FkX24ocG9zaXRpb24sIF9fQVRPTUlDX0FDUVVJUkUpID09IGV4cGVjdGVkKVxcbitcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0XFx0dXNsZWVwKFdBSVRfVVMpO1xcbitcXHR9XFxuK1xcdHJldHVybiBBU1NFUlRfRVEoKnBvc2l0aW9uLCBleHBlY3RlZCwgXFxcImNvbnN1bWVyIHBvc2l0aW9uXFxcIik7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNoZWNrX2pzb24oY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICpleHBlY3RlZClcXG4re1xcbitcXHRjaGFyICpzcmMgPSBvdXRwdXQsICpkc3QgPSBvdXRwdXQ7XFxuK1xcdGJvb2wgcXVvdGVkID0gZmFsc2UsIGVzY2FwZWQgPSBmYWxzZTtcXG4rXFxuK1xcdC8qIElnbm9yZSBmb3JtYXR0aW5nIHdoaXRlc3BhY2Ugd2hpbGUgY2hlY2tpbmcgdGhlIGVudGlyZSBKU09OIGRvY3VtZW50LiAqL1xcbitcXHR3aGlsZSAoKnNyYykge1xcbitcXHRcXHRpZiAocXVvdGVkIHx8ICFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxcbitcXHRcXHRcXHQqZHN0KysgPSAqc3JjO1xcbitcXHRcXHRpZiAoIWVzY2FwZWQgXFx1MDAyNlxcdTAwMjYgKnNyYyA9PSAnXFxcIicpXFxuK1xcdFxcdFxcdHF1b3RlZCA9ICFxdW90ZWQ7XFxuK1xcdFxcdGVzY2FwZWQgPSAhZXNjYXBlZCBcXHUwMDI2XFx1MDAyNiBxdW90ZWQgXFx1MDAyNlxcdTAwMjYgKnNyYyA9PSAnXFxcXFxcXFwnO1xcbitcXHRcXHRzcmMrKztcXG4rXFx0fVxcbitcXHQqZHN0ID0gJ1xcXFwwJztcXG4rXFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFxcXCJKU09OIHJlY29yZHNcXFwiKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9jb25zdW1lcihib29sIGpzb24sIGJvb2wgaWRsZSwgaW50IHNpZ25vKVxcbit7XFxuK1xcdHN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9O1xcbitcXHRzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsO1xcbitcXHR1bnNpZ25lZCBsb25nICpwb3NpdGlvbiA9IE1BUF9GQUlMRUQ7XFxuK1xcdGludCBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpLCBmZDtcXG4rXFx0Y2hhciBvdXRwdXRbNDA5Nl07XFxuK1xcdHN0cnVjdCBwb2xsZmQgcGZkO1xcbitcXG4rXFx0c2tlbCA9IGJwZnRvb2xfcmluZ2J1Zl9fb3BlbigpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcIm9wZW5cXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cXHUwMDNlbWFwcy5yaW5nYnVmLCBwYWdlX3NpemUpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhicGZ0b29sX3JpbmdidWZfX2xvYWQoc2tlbCksIFxcXCJsb2FkXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmZCA9IGJwZl9tYXBfX2ZkKHNrZWwtXFx1MDAzZW1hcHMucmluZ2J1Zik7XFxuK1xcdHBvc2l0aW9uID0gbW1hcChOVUxMLCBwYWdlX3NpemUsIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgZmQsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9ORVEocG9zaXRpb24sIE1BUF9GQUlMRUQsIFxcXCJjb25zdW1lciBtbWFwXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAoIWlkbGUgXFx1MDAyNlxcdTAwMjYgKCFlbWl0X3JlY29yZChza2VsLCAwKSB8fCAhZW1pdF9yZWNvcmQoc2tlbCwgMSkpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFjb25zdW1lcl9zdGFydChcXHUwMDI2Y2hpbGQsIGZkLCBqc29uLCBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8XFxuK1xcdCAgICAhY29uc3VtZXJfcmVhZHkoXFx1MDAyNmNoaWxkKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghaWRsZSkge1xcbitcXHRcXHQvKiBCb3RoIHByZWZpbGxlZCByZWNvcmRzIG9jY3VweSAxNiBieXRlcyBpbmNsdWRpbmcgdGhlaXIgaGVhZGVycy4gKi9cXG4rXFx0XFx0aWYgKCFjb25zdW1lZChwb3NpdGlvbiwgMzIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0cGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gY2hpbGQuZmQsIC5ldmVudHMgPSBQT0xMSU4gfTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfR1QocG9sbChcXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApLCAwLFxcbitcXHRcXHRcXHQgICAgICAgXFxcInJlY29yZHMgZmx1c2hlZCBiZWZvcmUgZXhpdFxcXCIpIHx8XFxuK1xcdFxcdCAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgXFx1MDAyNiBQT0xMSU4sIFxcXCJyZWNvcmQgb3V0cHV0IHJlYWRhYmxlXFxcIikgfHxcXG4rXFx0XFx0ICAgICFlbWl0X3JlY29yZChza2VsLCAyKSB8fCAhY29uc3VtZWQocG9zaXRpb24sIDY0KSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFx0aWYgKCFjb25zdW1lcl9maW5pc2goXFx1MDAyNmNoaWxkLCBzaWdubywgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAoanNvbilcXG4rXFx0XFx0Y2hlY2tfanNvbihvdXRwdXQsIGlkbGUgPyBcXFwiW11cXFwiIDpcXG4rXFx0XFx0XFx0ICAgXFxcIlt7XFxcXFxcXCJzaXplXFxcXFxcXCI6MixcXFxcXFxcImRhdGFcXFxcXFxcIjpbMCwyNTVdfSxcXFwiXFxuK1xcdFxcdFxcdCAgIFxcXCJ7XFxcXFxcXCJzaXplXFxcXFxcXCI6NSxcXFxcXFxcImRhdGFcXFxcXFxcIjpbMSwyLDMsNCw1XX0sXFxcIlxcbitcXHRcXHRcXHQgICBcXFwie1xcXFxcXFwic2l6ZVxcXFxcXFwiOjE3LFxcXFxcXFwiZGF0YVxcXFxcXFwiOlsxNiwxNywxOCwxOSwyMCwyMSwyMiwyMyxcXFwiXFxuK1xcdFxcdFxcdCAgIFxcXCIyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMl19XVxcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyBcXFwiXFxcIiA6XFxuK1xcdFxcdFxcdCAgICAgXFxcIj09IHNpemU6IDIgPT09PT1cXFxcbjAwIGZmXFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIj09IHNpemU6IDUgPT09PT1cXFxcbjAxIDAyIDAzIDA0IDA1XFxcXG5cXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcIj09IHNpemU6IDE3ID09PT09XFxcXG4xMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAgXFxcIlxcbitcXHRcXHRcXHQgICAgIFxcXCIxOCAxOSAxYSAxYiAxYyAxZCAxZSAxZlxcXFxuMjBcXFxcblxcXCIsIFxcXCJwbGFpbiByZWNvcmRzXFxcIik7XFxuK291dDpcXG4rXFx0Y29uc3VtZXJfY2xlYW51cChcXHUwMDI2Y2hpbGQpO1xcbitcXHRpZiAocG9zaXRpb24gIT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0bXVubWFwKHBvc2l0aW9uLCBwYWdlX3NpemUpO1xcbitcXHRicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfcGVyZl9jb25zdW1lcih2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBjb25zdW1lciBjaGlsZCA9IHsgLnBpZCA9IC0xLCAuZmQgPSAtMSB9O1xcbitcXHR1bnNpZ25lZCBsb25nIGxvbmcgc2Vjb25kcywgbmFub3NlY29uZHM7XFxuK1xcdHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWw7XFxuK1xcdGNoYXIgb3V0cHV0WzE2Mzg0XSwgZXhwZWN0ZWRbMTYzODRdO1xcbitcXHRpbnQgbnJfY3B1cywgY3B1LCBpbmRleCwgb2Zmc2V0ID0gMCwgaSwgdXNlZCA9IDAsIGZpZWxkcztcXG4rXFx0c3RydWN0IHBvbGxmZCBwZmQ7XFxuK1xcbitcXHRucl9jcHVzID0gbGliYnBmX251bV9wb3NzaWJsZV9jcHVzKCk7XFxuK1xcdGlmICghQVNTRVJUX0dUKG5yX2NwdXMsIDAsIFxcXCJwb3NzaWJsZSBjcHVzXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0c2tlbCA9IGJwZnRvb2xfcmluZ2J1Zl9fb3BlbigpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcIm9wZW5cXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cXHUwMDNlbWFwcy5yaW5nYnVmLCBnZXRwYWdlc2l6ZSgpKTtcXG4rXFx0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXFx1MDAzZW1hcHMucGVyZmJ1ZiwgbnJfY3B1cyk7XFxuK1xcdGlmICghQVNTRVJUX09LKGJwZnRvb2xfcmluZ2J1Zl9fbG9hZChza2VsKSwgXFxcImxvYWRcXFwiKSB8fFxcbitcXHQgICAgIWNvbnN1bWVyX3N0YXJ0KFxcdTAwMjZjaGlsZCwgYnBmX21hcF9fZmQoc2tlbC1cXHUwMDNlbWFwcy5wZXJmYnVmKSwgZmFsc2UsXFxuK1xcdFxcdFxcdCAgICBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8ICFjb25zdW1lcl9yZWFkeShcXHUwMDI2Y2hpbGQpIHx8XFxuK1xcdCAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMykpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHQvKiBPbmUgbGFyZ2UgcmVjb3JkIGZsdXNoZXMgdGhlIGV4aXN0aW5nIGJ1ZmZlcmVkIHBlcmYgb3V0cHV0IGNhbGxiYWNrLiAqL1xcbitcXHRwZmQgPSAoc3RydWN0IHBvbGxmZCkgeyAuZmQgPSBjaGlsZC5mZCwgLmV2ZW50cyA9IFBPTExJTiB9O1xcbitcXHRpZiAoIUFTU0VSVF9HVChwb2xsKFxcdTAwMjZwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCksIDAsXFxuK1xcdFxcdCAgICAgICBcXFwicGVyZiByZWNvcmQgb3V0cHV0XFxcIikgfHxcXG4rXFx0ICAgICFBU1NFUlRfVFJVRShwZmQucmV2ZW50cyBcXHUwMDI2IFBPTExJTiwgXFxcInBlcmYgb3V0cHV0IHJlYWRhYmxlXFxcIikgfHxcXG4rXFx0ICAgICFjb25zdW1lcl9maW5pc2goXFx1MDAyNmNoaWxkLCBTSUdJTlQsIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZmllbGRzID0gc3NjYW5mKG91dHB1dCwgXFxcIj09IEAlbGx1LiVsbHUgQ1BVOiAlZCBpbmRleDogJWQgPT09PT1cXFxcbiVuXFxcIixcXG4rXFx0XFx0XFx0XFx1MDAyNnNlY29uZHMsIFxcdTAwMjZuYW5vc2Vjb25kcywgXFx1MDAyNmNwdSwgXFx1MDAyNmluZGV4LCBcXHUwMDI2b2Zmc2V0KTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoZmllbGRzLCA0LCBcXFwicGVyZiBoZWFkZXJcXFwiKSB8fFxcbitcXHQgICAgIUFTU0VSVF9HVChvZmZzZXQsIDAsIFxcXCJwZXJmIHBheWxvYWQgb2Zmc2V0XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRBU1NFUlRfR1Qoc2Vjb25kcyAqIDEwMDAwMDAwMDBVTEwgKyBuYW5vc2Vjb25kcywgMCwgXFxcInBlcmYgdGltZXN0YW1wXFxcIik7XFxuK1xcdEFTU0VSVF9MVChuYW5vc2Vjb25kcywgMTAwMDAwMDAwMFVMTCwgXFxcInBlcmYgdGltZXN0YW1wIG5hbm9zZWNvbmRzXFxcIik7XFxuK1xcdEFTU0VSVF9HRShjcHUsIDAsIFxcXCJwZXJmIGNwdVxcXCIpO1xcbitcXHRBU1NFUlRfTFQoY3B1LCBucl9jcHVzLCBcXFwicGVyZiBjcHUgcmFuZ2VcXFwiKTtcXG4rXFx0QVNTRVJUX0VRKGluZGV4LCBjcHUsIFxcXCJwZXJmIGluZGV4XFxcIik7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBzaXplb2Yoc2tlbC1cXHUwMDNlcm9kYXRhLVxcdTAwM2VwZXJmX3BheWxvYWQpOyBpKyspIHtcXG4rXFx0XFx0Y29uc3QgY2hhciAqc2VwYXJhdG9yID0gIWkgPyBcXFwiXFxcIiA6ICEoaSAlIDE2KSA/IFxcXCJcXFxcblxcXCIgOlxcbitcXHRcXHRcXHRcXHRcXHQhKGkgJSA4KSA/IFxcXCIgIFxcXCIgOiBcXFwiIFxcXCI7XFxuK1xcbitcXHRcXHR1c2VkICs9IHNucHJpbnRmKGV4cGVjdGVkICsgdXNlZCwgc2l6ZW9mKGV4cGVjdGVkKSAtIHVzZWQsXFxuK1xcdFxcdFxcdFxcdCBcXFwiJXMlMDJ4XFxcIiwgc2VwYXJhdG9yLCBpID09IDEgPyAweGZmIDogMCk7XFxuK1xcdH1cXG4rXFx0c25wcmludGYoZXhwZWN0ZWQgKyB1c2VkLCBzaXplb2YoZXhwZWN0ZWQpIC0gdXNlZCwgXFxcIlxcXFxuXFxcIik7XFxuK1xcdEFTU0VSVF9TVFJFUShvdXRwdXQgKyBvZmZzZXQsIGV4cGVjdGVkLCBcXFwicGVyZiBwYXlsb2FkXFxcIik7XFxuK291dDpcXG4rXFx0Y29uc3VtZXJfY2xlYW51cChcXHUwMDI2Y2hpbGQpO1xcbitcXHRicGZ0b29sX3JpbmdidWZfX2Rlc3Ryb3koc2tlbCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfcmVqZWN0KGVudW0gYnBmX21hcF90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbiwgYm9vbCBwYWlyLCBib29sIGpzb24pXFxuK3tcXG4rXFx0c3RydWN0IGNvbnN1bWVyIGNoaWxkID0geyAucGlkID0gLTEsIC5mZCA9IC0xIH07XFxuK1xcdGJvb2wgcmluZyA9IHR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgfHwgdHlwZSA9PSBCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGO1xcbitcXHRjb25zdCBjaGFyICpleHBlY3RlZCA9IG9wdGlvbiA/XFxuK1xcdFxcdFxcXCJ7XFxcXFxcXCJlcnJvclxcXFxcXFwiOlxcXFxcXFwicmluZyBidWZmZXIgbWFwcyBkbyBub3Qgc3VwcG9ydCBjcHUgb3IgaW5kZXggYXJndW1lbnRzXFxcXFxcXCJ9XFxcIiA6XFxuK1xcdFxcdFxcXCJ7XFxcXFxcXCJlcnJvclxcXFxcXFwiOlxcXFxcXFwibWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcXFxcXFxcIn1cXFwiO1xcbitcXHRjaGFyIG91dHB1dFs0MDk2XTtcXG4rXFx0aW50IGZkO1xcbitcXG4rXFx0ZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBOVUxMLCByaW5nID8gMCA6IDQsIHJpbmcgPyAwIDogNCxcXG4rXFx0XFx0XFx0ICAgIHJpbmcgPyBnZXRwYWdlc2l6ZSgpIDogMSwgTlVMTCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwiY3JlYXRlIG1hcFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlmIChjb25zdW1lcl9zdGFydChcXHUwMDI2Y2hpbGQsIGZkLCBqc29uLCBvcHRpb24sIHBhaXIsIHRydWUpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBjb25zdW1lcl9maW5pc2goXFx1MDAyNmNoaWxkLCAwLCBmYWxzZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpIHtcXG4rXFx0XFx0aWYgKGpzb24pXFxuK1xcdFxcdFxcdGNoZWNrX2pzb24ob3V0cHV0LCBleHBlY3RlZCk7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0QVNTRVJUX0dUKHN0cmxlbihvdXRwdXQpLCAwLCBcXFwiZXJyb3IgZGlhZ25vc3RpY1xcXCIpO1xcbitcXHR9XFxuK1xcdGNvbnN1bWVyX2NsZWFudXAoXFx1MDAyNmNoaWxkKTtcXG4rXFx0Y2xvc2UoZmQpO1xcbit9XFxuK1xcbit2b2lkIHRlc3RfYnBmdG9vbF9yaW5nYnVmKHZvaWQpXFxuK3tcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInBlcmZfZXZlbnRfYXJyYXlcXFwiKSlcXG4rXFx0XFx0dGVzdF9wZXJmX2NvbnN1bWVyKCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJwbGFpblxcXCIpKVxcbitcXHRcXHR0ZXN0X2NvbnN1bWVyKGZhbHNlLCBmYWxzZSwgU0lHSU5UKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImpzb25cXFwiKSlcXG4rXFx0XFx0dGVzdF9jb25zdW1lcih0cnVlLCBmYWxzZSwgU0lHVEVSTSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJpZGxlX3NpZ2ludFxcXCIpKVxcbitcXHRcXHR0ZXN0X2NvbnN1bWVyKGZhbHNlLCB0cnVlLCBTSUdJTlQpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiaWRsZV9zaWd0ZXJtX2pzb25cXFwiKSlcXG4rXFx0XFx0dGVzdF9jb25zdW1lcih0cnVlLCB0cnVlLCBTSUdURVJNKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInJlamVjdF9hcnJheVxcXCIpKVxcbitcXHRcXHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfQVJSQVksIE5VTEwsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyZWplY3RfdXNlcl9yaW5nYnVmXFxcIikpXFxuK1xcdFxcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyZWplY3RfY3B1XFxcIikpXFxuK1xcdFxcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCBcXFwiY3B1XFxcIiwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInJlamVjdF9pbmRleFxcXCIpKVxcbitcXHRcXHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfUklOR0JVRiwgXFxcImluZGV4XFxcIiwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInJlamVjdF9jcHVfaW5kZXhcXFwiKSlcXG4rXFx0XFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1JJTkdCVUYsIFxcXCJjcHVcXFwiLCB0cnVlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJyZWplY3RfdXNlcl9yaW5nYnVmX2pzb25cXFwiKSlcXG4rXFx0XFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRiwgTlVMTCwgZmFsc2UsIHRydWUpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwicmVqZWN0X2NwdV9pbmRleF9qc29uXFxcIikpXFxuK1xcdFxcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCBcXFwiY3B1XFxcIiwgdHJ1ZSwgdHJ1ZSk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi5iYmJjOTNjMzBhODMzXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9icGZ0b29sX3JpbmdidWYuY1xcbkBAIC0wLDAgKzEsNDcgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JwZi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcXHUwMDNlXFxuK1xcbitzdHJ1Y3Qge1xcbitcXHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1JJTkdCVUYpO1xcbit9IHJpbmdidWYgU0VDKFxcXCIubWFwc1xcXCIpO1xcbitcXG4rc3RydWN0IHtcXG4rXFx0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKTtcXG4rXFx0X191aW50KGtleV9zaXplLCBzaXplb2YoX191MzIpKTtcXG4rXFx0X191aW50KHZhbHVlX3NpemUsIHNpemVvZihfX3UzMikpO1xcbitcXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xcbit9IHBlcmZidWYgU0VDKFxcXCIubWFwc1xcXCIpO1xcbitcXG4rLypcXG4rICogSW5jbHVkZSB0aGUgdTMyIHJhdyBzaXplIGluIHBlcmYncyA4LWJ5dGUgYWxpZ25tZW50IHRvIGF2b2lkIHBhZGRpbmcuXFxuKyAqIEtlZXAgcGxhaW4gb3V0cHV0IGxhcmdlIGVub3VnaCB0byBmbHVzaCBzdGRpbyBiZWZvcmUgdGhlIGNvbnN1bWVyIGV4aXRzLlxcbisgKi9cXG4rY29uc3QgdW5zaWduZWQgY2hhciBwZXJmX3BheWxvYWRbNDA5Ml0gPSB7IDB4MDAsIDB4ZmYgfTtcXG4rXFxuK2ludCByZWNvcmQ7XFxuK2ludCBvdXRwdXRfZXJyO1xcbitcXG4rU0VDKFxcXCJzb2NrZXRcXFwiKVxcbitpbnQgcHJvZHVjZShzdHJ1Y3QgX19za19idWZmICpza2IpXFxuK3tcXG4rXFx0dW5zaWduZWQgY2hhciBmaXJzdFtdID0geyAweDAwLCAweGZmIH07XFxuK1xcdHVuc2lnbmVkIGNoYXIgc2Vjb25kW10gPSB7IDEsIDIsIDMsIDQsIDUgfTtcXG4rXFx0dW5zaWduZWQgY2hhciB0aGlyZFtdID0ge1xcbitcXHRcXHQweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LFxcbitcXHRcXHQweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAweDIwLFxcbitcXHR9O1xcbitcXG4rXFx0aWYgKHJlY29yZCA9PSAwKVxcbitcXHRcXHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFxcdTAwMjZyaW5nYnVmLCBmaXJzdCwgc2l6ZW9mKGZpcnN0KSwgMCk7XFxuK1xcdGVsc2UgaWYgKHJlY29yZCA9PSAxKVxcbitcXHRcXHRvdXRwdXRfZXJyID0gYnBmX3JpbmdidWZfb3V0cHV0KFxcdTAwMjZyaW5nYnVmLCBzZWNvbmQsIHNpemVvZihzZWNvbmQpLCAwKTtcXG4rXFx0ZWxzZSBpZiAocmVjb3JkID09IDIpXFxuK1xcdFxcdG91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoXFx1MDAyNnJpbmdidWYsIHRoaXJkLCBzaXplb2YodGhpcmQpLCAwKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRvdXRwdXRfZXJyID0gYnBmX3BlcmZfZXZlbnRfb3V0cHV0KHNrYiwgXFx1MDAyNnBlcmZidWYsIEJQRl9GX0NVUlJFTlRfQ1BVLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAodm9pZCAqKXBlcmZfcGF5bG9hZCwgc2l6ZW9mKHBlcmZfcGF5bG9hZCkpO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rY2hhciBMSUNFTlNFW10gU0VDKFxcXCJsaWNlbnNlXFxcIikgPSBcXFwiR1BMXFxcIjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDI6MjA6MzIuNTczNTEzMjE4WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo0NTMzMDM3Mjg4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzZXJpZXMgZXhjbHVzaXZlbHkgbW9kaWZpZXMgdXNlci1zcGFjZSB0b29saW5nIChicGZ0b29sKSBhbmQgc2VsZnRlc3RzIHVuZGVyIHRoZSB0b29scy8gZGlyZWN0b3J5ICh0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmKS4gTm8ga2VybmVsIHJ1bnRpbWUgY29kZSwgbW9kdWxlcywgb3Igdm1saW51eCBpbWFnZXMgYXJlIG1vZGlmaWVkLCBzbyB0aGlzIGNoYW5nZSBkb2VzIG5vdCB3YXJyYW50IHN5emthbGxlciBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBhMmQxYzVhNjAyODc5ZDM3OTk1ZjMwMWMwMjBkY2NlZjBiMzBkMmI4XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAwMjoyMDoyOCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLmM0NGU2Zjc5N2U1NzcgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbkBAIC0xMjAsNyArMTIwLDggQEAgYnBmdG9vbCBtYXAgcGluICAgICAqTUFQKiAgKkZJTEUqXG4gICAgIGNoYXJhY3RlciAoJy4nKSwgd2hpY2ggaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHRlbnNpb25zIG9mICpicGZmcyouXG4gXG4gYnBmdG9vbCBtYXAgZXZlbnRfcGlwZSAqTUFQKiBbY3B1ICpOKiBpbmRleCAqTSpdXG4tICAgIFJlYWQgZXZlbnRzIGZyb20gYSAqKkJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZKiogbWFwLlxuKyAgICBSZWFkIGV2ZW50cyBmcm9tIGEgKipCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSoqIG9yXG4rICAgICoqQlBGX01BUF9UWVBFX1JJTkdCVUYqKiBtYXAuXG4gXG4gICAgIEluc3RhbGwgcGVyZiByaW5ncyBpbnRvIGEgcGVyZiBldmVudCBhcnJheSBtYXAgYW5kIGR1bXAgb3V0cHV0IG9mIGFueVxuICAgICAqKmJwZl9wZXJmX2V2ZW50X291dHB1dCoqXFwgKCkgY2FsbCBpbiB0aGUga2VybmVsLiBCeSBkZWZhdWx0IHJlYWQgdGhlXG5AQCAtMTM0LDYgKzEzNSwxOCBAQCBicGZ0b29sIG1hcCBldmVudF9waXBlICpNQVAqIFtjcHUgKk4qIGluZGV4ICpNKl1cbiAgICAgZXhpc3RpbmcgcmluZy4gIEFueSBvdGhlciBhcHBsaWNhdGlvbiB3aWxsIHN0b3AgcmVjZWl2aW5nIGV2ZW50cyBpZiBpdFxuICAgICBpbnN0YWxsZWQgaXRzIHJpbmdzIGVhcmxpZXIuXG4gXG4rICAgIEZvciBhIHJpbmcgYnVmZmVyIG1hcCwgY29uc3VtZSByZWNvcmRzIHN1Ym1pdHRlZCBieSBCUEYgcHJvZ3JhbXMsIGluY2x1ZGluZ1xuKyAgICByZWNvcmRzIGFscmVhZHkgcXVldWVkIGJlZm9yZSB0aGUgY29tbWFuZCBzdGFydHMuICoqY3B1KiogYW5kICoqaW5kZXgqKlxuKyAgICBhcmUgbm90IHN1cHBvcnRlZC4gRWFjaCByZWNvcmQgaXMgcHJpbnRlZCBhcyByYXcgYnl0ZXMsIGluY2x1ZGluZyBlbWJlZGRlZFxuKyAgICB6ZXJvIGJ5dGVzLiBQbGFpbiBvdXRwdXQgcmVwb3J0cyB0aGUgcmVjb3JkIHNpemUgZm9sbG93ZWQgYnkgaGV4YWRlY2ltYWxcbisgICAgYnl0ZXM7IEpTT04gb3V0cHV0IGNvbnRhaW5zICoqc2l6ZSoqIGFuZCAqKmRhdGEqKiBmaWVsZHMsIHdpdGggKipkYXRhKiogYW5cbisgICAgYXJyYXkgb2YgYnl0ZSB2YWx1ZXMuIFJpbmcgYnVmZmVyIHJlY29yZHMgaGF2ZSBubyBpbXBsaWNpdCBDUFUgb3IgdGltZXN0YW1wLlxuK1xuKyAgICBSaW5nIGJ1ZmZlcnMgc3VwcG9ydCBhIHNpbmdsZSBjb25zdW1lci4gVGhpcyBjb21tYW5kIGFkdmFuY2VzIHRoZSBzaGFyZWRcbisgICAgY29uc3VtZXIgcG9zaXRpb24gYW5kIG11c3Qgbm90IHJ1biBhbG9uZ3NpZGUgYW5vdGhlciBjb25zdW1lciBvZiB0aGUgc2FtZVxuKyAgICBtYXA7IGl0IGRvZXMgbm90IHByb3ZpZGUgYSBwYXNzaXZlIHZpZXcgb2YgZXZlbnRzLiAqKkJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYqKlxuKyAgICBtYXBzIGFyZSBub3Qgc3VwcG9ydGVkLlxuK1xuIGJwZnRvb2wgbWFwIHBlZWsgICpNQVAqXG4gICAgIFBlZWsgbmV4dCB2YWx1ZSBpbiB0aGUgcXVldWUgb3Igc3RhY2suXG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxuaW5kZXggNzVjYmNiNTEyZWJhZS4uMTc1MGI0ODhjOWUzYiAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxuQEAgLTg3OCwxMSArODc4LDExIEBAIF9icGZ0b29sKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOztcbiAgICAgICAgICAgICAgICAgICAgICAgICBpZClcbi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9pZHNfZm9yX3R5cGUgcGVyZl9ldmVudF9hcnJheVxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX2lkc19mb3JfdHlwZSAnXCJ0eXBlXCI6IFwiXFwocGVyZl9ldmVudF9hcnJheVxcfHJpbmdidWZcXClcIidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOztcbiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKVxuLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnBmdG9vbF9nZXRfbWFwX25hbWVzX2Zvcl90eXBlIHBlcmZfZXZlbnRfYXJyYXlcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JwZnRvb2xfZ2V0X21hcF9uYW1lc19mb3JfdHlwZSAnXCJ0eXBlXCI6IFwiXFwocGVyZl9ldmVudF9hcnJheVxcfHJpbmdidWZcXClcIidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOztcbiAgICAgICAgICAgICAgICAgICAgICAgICBjcHUpXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jXG5pbmRleCBiY2I3NjdlMmQ2NzMzLi43ZDU1NTMzMWY0NDNhIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwX3BlcmZfcmluZy5jXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYXBfcGVyZl9yaW5nLmNcbkBAIC0yNyw3ICsyNyw3IEBAXG4gXG4gI2RlZmluZSBNTUFQX1BBR0VfQ05UXHQxNlxuIFxuLXN0YXRpYyB2b2xhdGlsZSBib29sIHN0b3A7XG4rc3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBzdG9wO1xuIFxuIHN0cnVjdCBwZXJmX2V2ZW50X3NhbXBsZSB7XG4gXHRzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgaGVhZGVyO1xuQEAgLTQ0LDcgKzQ0LDYgQEAgc3RydWN0IHBlcmZfZXZlbnRfbG9zdCB7XG4gXG4gc3RhdGljIHZvaWQgaW50X2V4aXQoaW50IHNpZ25vKVxuIHtcbi1cdGZwcmludGYoc3RkZXJyLCBcIlN0b3BwaW5nLi4uXFxuXCIpO1xuIFx0c3RvcCA9IHRydWU7XG4gfVxuIFxuQEAgLTEwNyw2ICsxMDYsMjcgQEAgcHJpbnRfYnBmX291dHB1dCh2b2lkICpwcml2YXRlX2RhdGEsIGludCBjcHUsIHN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciAqZXZlbnQpXG4gXHRyZXR1cm4gTElCQlBGX1BFUkZfRVZFTlRfQ09OVDtcbiB9XG4gXG4rc3RhdGljIGludCBwcmludF9yaW5nYnVmX291dHB1dCh2b2lkICpjdHgsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKVxuK3tcbitcdGlmIChqc29uX291dHB1dCkge1xuK1x0XHRqc29ud19zdGFydF9vYmplY3QoanNvbl93dHIpO1xuK1x0XHRqc29ud191aW50X2ZpZWxkKGpzb25fd3RyLCBcInNpemVcIiwgc2l6ZSk7XG4rXHRcdGpzb253X25hbWUoanNvbl93dHIsIFwiZGF0YVwiKTtcbitcdFx0cHJpbnRfZGF0YV9qc29uKGRhdGEsIHNpemUpO1xuK1x0XHRqc29ud19lbmRfb2JqZWN0KGpzb25fd3RyKTtcbitcdH0gZWxzZSB7XG4rXHRcdHByaW50ZihcIj09IHNpemU6ICV6dSA9PT09PVxcblwiLCBzaXplKTtcbitcdFx0ZnByaW50X2hleChzdGRvdXQsIGRhdGEsIHNpemUsIFwiIFwiKTtcbitcdFx0cHJpbnRmKFwiXFxuXCIpO1xuK1x0fVxuK1xuK1x0aWYgKGZmbHVzaChzdGRvdXQpKVxuK1x0XHRyZXR1cm4gZXJybm8gPyAtZXJybm8gOiAtRUlPO1xuK1xuK1x0LyogQSBwcm9kdWNlciBjYW4ga2VlcCBwb2xsKCkgYnVzeSBldmVuIGFmdGVyIGEgc2lnbmFsIGFycml2ZXMuICovXG4rXHRyZXR1cm4gc3RvcCA/IC1FSU5UUiA6IDA7XG4rfVxuK1xuIGludCBkb19ldmVudF9waXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiB7XG4gXHRzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIHBlcmZfYXR0ciA9IHtcbkBAIC0xMjMsMTggKzE0MywyNiBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdC5jcHUgPSAtMSxcbiBcdFx0LmlkeCA9IC0xLFxuIFx0fTtcbi1cdHN0cnVjdCBwZXJmX2J1ZmZlciAqcGI7XG4rXHRzdHJ1Y3QgcGVyZl9idWZmZXIgKnBiID0gTlVMTDtcbitcdHN0cnVjdCByaW5nX2J1ZmZlciAqcmIgPSBOVUxMO1xuIFx0X191MzIgbWFwX2luZm9fbGVuO1xuIFx0aW50IGVyciwgbWFwX2ZkO1xuIFxuK1x0c3RvcCA9IGZhbHNlO1xuIFx0bWFwX2luZm9fbGVuID0gc2l6ZW9mKG1hcF9pbmZvKTtcbiBcdG1hcF9mZCA9IG1hcF9wYXJzZV9mZF9hbmRfaW5mbyhcdTAwMjZhcmdjLCBcdTAwMjZhcmd2LCBcdTAwMjZtYXBfaW5mbywgXHUwMDI2bWFwX2luZm9fbGVuLFxuIFx0XHRcdFx0ICAgICAgIDApO1xuIFx0aWYgKG1hcF9mZCBcdTAwM2MgMClcbiBcdFx0cmV0dXJuIC0xO1xuIFxuLVx0aWYgKG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpIHtcbi1cdFx0cF9lcnIoXCJtYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheVwiKTtcbitcdGlmIChtYXBfaW5mby50eXBlICE9IEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZIFx1MDAyNlx1MDAyNlxuK1x0ICAgIG1hcF9pbmZvLnR5cGUgIT0gQlBGX01BUF9UWVBFX1JJTkdCVUYpIHtcbitcdFx0cF9lcnIoXCJtYXAgaXMgbm90IGEgcGVyZiBldmVudCBhcnJheSBvciByaW5nIGJ1ZmZlclwiKTtcbitcdFx0Z290byBlcnJfY2xvc2VfbWFwO1xuK1x0fVxuK1xuK1x0aWYgKG1hcF9pbmZvLnR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgXHUwMDI2XHUwMDI2IGFyZ2MpIHtcbitcdFx0cF9lcnIoXCJyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHNcIik7XG4gXHRcdGdvdG8gZXJyX2Nsb3NlX21hcDtcbiBcdH1cbiBcbkBAIC0xODQsMTUgKzIxMiwyNCBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdGN0eC5pZHggPSAwO1xuIFx0fVxuIFxuLVx0b3B0cy5jcHVfY250ID0gY3R4LmFsbF9jcHVzID8gMCA6IDE7XG4tXHRvcHRzLmNwdXMgPSBcdTAwMjZjdHguY3B1O1xuLVx0b3B0cy5tYXBfa2V5cyA9IFx1MDAyNmN0eC5pZHg7XG4tXHRwYiA9IHBlcmZfYnVmZmVyX19uZXdfcmF3KG1hcF9mZCwgTU1BUF9QQUdFX0NOVCwgXHUwMDI2cGVyZl9hdHRyLFxuLVx0XHRcdFx0ICBwcmludF9icGZfb3V0cHV0LCBcdTAwMjZjdHgsIFx1MDAyNm9wdHMpO1xuLVx0aWYgKCFwYikge1xuLVx0XHRwX2VycihcImZhaWxlZCB0byBjcmVhdGUgcGVyZiBidWZmZXI6ICVzICglZClcIixcbi1cdFx0ICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7XG4tXHRcdGdvdG8gZXJyX2Nsb3NlX21hcDtcbitcdGlmIChtYXBfaW5mby50eXBlID09IEJQRl9NQVBfVFlQRV9SSU5HQlVGKSB7XG4rXHRcdHJiID0gcmluZ19idWZmZXJfX25ldyhtYXBfZmQsIHByaW50X3JpbmdidWZfb3V0cHV0LCBOVUxMLCBOVUxMKTtcbitcdFx0aWYgKCFyYikge1xuK1x0XHRcdHBfZXJyKFwiZmFpbGVkIHRvIGNyZWF0ZSByaW5nIGJ1ZmZlcjogJXMgKCVkKVwiLFxuK1x0XHRcdCAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pO1xuK1x0XHRcdGdvdG8gZXJyX2Nsb3NlX21hcDtcbitcdFx0fVxuK1x0fSBlbHNlIHtcbitcdFx0b3B0cy5jcHVfY250ID0gY3R4LmFsbF9jcHVzID8gMCA6IDE7XG4rXHRcdG9wdHMuY3B1cyA9IFx1MDAyNmN0eC5jcHU7XG4rXHRcdG9wdHMubWFwX2tleXMgPSBcdTAwMjZjdHguaWR4O1xuK1x0XHRwYiA9IHBlcmZfYnVmZmVyX19uZXdfcmF3KG1hcF9mZCwgTU1BUF9QQUdFX0NOVCwgXHUwMDI2cGVyZl9hdHRyLFxuK1x0XHRcdFx0XHQgIHByaW50X2JwZl9vdXRwdXQsIFx1MDAyNmN0eCwgXHUwMDI2b3B0cyk7XG4rXHRcdGlmICghcGIpIHtcbitcdFx0XHRwX2VycihcImZhaWxlZCB0byBjcmVhdGUgcGVyZiBidWZmZXI6ICVzICglZClcIixcbitcdFx0XHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcbitcdFx0XHRnb3RvIGVycl9jbG9zZV9tYXA7XG4rXHRcdH1cbiBcdH1cbiBcbiBcdHNpZ25hbChTSUdJTlQsIGludF9leGl0KTtcbkBAIC0yMDIsMjUgKzIzOSwzMyBAQCBpbnQgZG9fZXZlbnRfcGlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRpZiAoanNvbl9vdXRwdXQpXG4gXHRcdGpzb253X3N0YXJ0X2FycmF5KGpzb25fd3RyKTtcbiBcbitcdGVyciA9IDA7XG4gXHR3aGlsZSAoIXN0b3ApIHtcbi1cdFx0ZXJyID0gcGVyZl9idWZmZXJfX3BvbGwocGIsIDIwMCk7XG4rXHRcdGVyciA9IHJiID8gcmluZ19idWZmZXJfX3BvbGwocmIsIDIwMCkgOiBwZXJmX2J1ZmZlcl9fcG9sbChwYiwgMjAwKTtcbiBcdFx0aWYgKGVyciBcdTAwM2MgMCBcdTAwMjZcdTAwMjYgZXJyICE9IC1FSU5UUikge1xuLVx0XHRcdHBfZXJyKFwicGVyZiBidWZmZXIgcG9sbGluZyBmYWlsZWQ6ICVzICglZClcIixcbi1cdFx0XHQgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTtcbi1cdFx0XHRnb3RvIGVycl9jbG9zZV9wYjtcbitcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCJFcnJvcjogJXMgYnVmZmVyIHBvbGxpbmcgZmFpbGVkOiAlcyAoJWQpXFxuXCIsXG4rXHRcdFx0XHRyYiA/IFwicmluZ1wiIDogXCJwZXJmXCIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTtcbitcdFx0XHRicmVhaztcbiBcdFx0fVxuK1x0XHRlcnIgPSAwO1xuIFx0fVxuIFxuK1x0aWYgKHN0b3ApXG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIlN0b3BwaW5nLi4uXFxuXCIpO1xuIFx0aWYgKGpzb25fb3V0cHV0KVxuIFx0XHRqc29ud19lbmRfYXJyYXkoanNvbl93dHIpO1xuK1x0aWYgKGZmbHVzaChzdGRvdXQpKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIkVycm9yOiBmYWlsZWQgdG8gd3JpdGUgZXZlbnRzOiAlc1xcblwiLCBzdHJlcnJvcihlcnJubykpO1xuK1x0XHRlcnIgPSAtMTtcbitcdH1cbiBcbitcdHJpbmdfYnVmZmVyX19mcmVlKHJiKTtcbiBcdHBlcmZfYnVmZmVyX19mcmVlKHBiKTtcbitcdC8qIEJvdGggYnVmZmVyIG1hbmFnZXJzIGJvcnJvdyBtYXBfZmQuICovXG4gXHRjbG9zZShtYXBfZmQpO1xuIFxuLVx0cmV0dXJuIDA7XG4rXHRyZXR1cm4gZXJyIFx1MDAzYyAwID8gLTEgOiAwO1xuIFxuLWVycl9jbG9zZV9wYjpcbi1cdHBlcmZfYnVmZmVyX19mcmVlKHBiKTtcbiBlcnJfY2xvc2VfbWFwOlxuIFx0Y2xvc2UobWFwX2ZkKTtcbiBcdHJldHVybiAtMTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX3JpbmdidWYuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfcmluZ2J1Zi5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMjA5OWJmMTAyMDkzMFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9yaW5nYnVmLmNcbkBAIC0wLDAgKzEsMzgxIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisjaW5jbHVkZSBcdTAwM2NjdHlwZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3BvbGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3NpZ25hbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbisjaW5jbHVkZSBcImJwZnRvb2xfcmluZ2J1Zi5za2VsLmhcIlxuK1xuKyNkZWZpbmUgV0FJVF9TVEVQUyA1MDBcbisjZGVmaW5lIFdBSVRfVVMgMTAwMDBcbitcbitzdHJ1Y3QgY29uc3VtZXIge1xuK1x0cGlkX3QgcGlkO1xuK1x0aW50IGZkO1xuK307XG4rXG4rc3RhdGljIGNvbnN0IGNoYXIgKmJwZnRvb2xfcGF0aCh2b2lkKVxuK3tcbitcdGNvbnN0IGNoYXIgKnBhdGggPSBnZXRlbnYoXCJCUEZUT09MXCIpO1xuK1xuK1x0aWYgKHBhdGgpXG4rXHRcdHJldHVybiBhY2Nlc3MocGF0aCwgWF9PSykgPyBOVUxMIDogcGF0aDtcbitcdGlmICghYWNjZXNzKFwiLi90b29scy9zYmluL2JwZnRvb2xcIiwgWF9PSykpXG4rXHRcdHJldHVybiBcIi4vdG9vbHMvc2Jpbi9icGZ0b29sXCI7XG4rXHRpZiAoIWFjY2VzcyhcIi4uL3Rvb2xzL3NiaW4vYnBmdG9vbFwiLCBYX09LKSlcbitcdFx0cmV0dXJuIFwiLi4vdG9vbHMvc2Jpbi9icGZ0b29sXCI7XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIHZvaWQgY29uc3VtZXJfY2xlYW51cChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkKVxuK3tcbitcdGlmIChjaGlsZC1cdTAwM2VwaWQgXHUwMDNlIDApIHtcbitcdFx0a2lsbChjaGlsZC1cdTAwM2VwaWQsIFNJR0tJTEwpO1xuK1x0XHR3aGlsZSAod2FpdHBpZChjaGlsZC1cdTAwM2VwaWQsIE5VTEwsIDApIFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyA9PSBFSU5UUilcbitcdFx0XHQ7XG4rXHRcdGNoaWxkLVx1MDAzZXBpZCA9IC0xO1xuK1x0fVxuK1x0aWYgKGNoaWxkLVx1MDAzZWZkIFx1MDAzZT0gMCkge1xuK1x0XHRjbG9zZShjaGlsZC1cdTAwM2VmZCk7XG4rXHRcdGNoaWxkLVx1MDAzZWZkID0gLTE7XG4rXHR9XG4rfVxuK1xuK3N0YXRpYyBib29sIGNvbnN1bWVyX3N0YXJ0KHN0cnVjdCBjb25zdW1lciAqY2hpbGQsIGludCBtYXBfZmQsIGJvb2wganNvbixcbitcdFx0XHQgICBjb25zdCBjaGFyICpvcHRpb24sIGJvb2wgcGFpciwgYm9vbCBjYXB0dXJlX2Vycm9ycylcbit7XG4rXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbitcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbitcdGNvbnN0IGNoYXIgKnBhdGggPSBicGZ0b29sX3BhdGgoKTtcbitcdGNoYXIgKmFyZ3ZbMTJdLCBpZFsxNl07XG4rXHRpbnQgb3V0WzJdLCByZWFkeVsyXSwgbiA9IDAsIGVyciwgZXJyX2ZkO1xuK1x0c3RydWN0IHBvbGxmZCBwZmQ7XG4rXG4rXHRpZiAoIUFTU0VSVF9PS19QVFIocGF0aCwgXCJicGZ0b29sIHBhdGggKHNldCBCUEZUT09MIHRvIG92ZXJyaWRlKVwiKSB8fFxuK1x0ICAgICFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChtYXBfZmQsIFx1MDAyNmluZm8sIFx1MDAyNmxlbiksIFwibWFwIGluZm9cIikpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdHNucHJpbnRmKGlkLCBzaXplb2YoaWQpLCBcIiV1XCIsIGluZm8uaWQpO1xuK1x0YXJndltuKytdID0gKGNoYXIgKilwYXRoO1xuK1x0aWYgKGpzb24pXG4rXHRcdGFyZ3ZbbisrXSA9IFwiLWpcIjtcbitcdGFyZ3ZbbisrXSA9IFwibWFwXCI7XG4rXHRhcmd2W24rK10gPSBcImV2ZW50X3BpcGVcIjtcbitcdGFyZ3ZbbisrXSA9IFwiaWRcIjtcbitcdGFyZ3ZbbisrXSA9IGlkO1xuK1x0aWYgKG9wdGlvbikge1xuK1x0XHRhcmd2W24rK10gPSAoY2hhciAqKW9wdGlvbjtcbitcdFx0YXJndltuKytdID0gXCIwXCI7XG4rXHRcdGlmIChwYWlyKSB7XG4rXHRcdFx0YXJndltuKytdID0gXCJpbmRleFwiO1xuK1x0XHRcdGFyZ3ZbbisrXSA9IFwiMFwiO1xuK1x0XHR9XG4rXHR9XG4rXHRhcmd2W25dID0gTlVMTDtcbitcdGlmICghQVNTRVJUX09LKHBpcGUyKG91dCwgT19DTE9FWEVDKSwgXCJvdXRwdXQgcGlwZVwiKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0aWYgKCFBU1NFUlRfT0socGlwZTIocmVhZHksIE9fQ0xPRVhFQyksIFwiZXhlYyBwaXBlXCIpKSB7XG4rXHRcdGNsb3NlKG91dFswXSk7XG4rXHRcdGNsb3NlKG91dFsxXSk7XG4rXHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcdGNoaWxkLVx1MDAzZXBpZCA9IGZvcmsoKTtcbitcdGlmICghY2hpbGQtXHUwMDNlcGlkKSB7XG4rXHRcdGNsb3NlKG91dFswXSk7XG4rXHRcdGNsb3NlKHJlYWR5WzBdKTtcbitcdFx0ZXJyX2ZkID0gY2FwdHVyZV9lcnJvcnMgPyBvdXRbMV0gOiBvcGVuKFwiL2Rldi9udWxsXCIsIE9fV1JPTkxZKTtcbitcdFx0aWYgKGR1cDIob3V0WzFdLCBTVERPVVRfRklMRU5PKSBcdTAwM2MgMCB8fFxuK1x0XHQgICAgZHVwMihlcnJfZmQsIFNUREVSUl9GSUxFTk8pIFx1MDAzYyAwKVxuK1x0XHRcdGdvdG8gZXhlY19mYWlsO1xuK1x0XHRpZiAoIWNhcHR1cmVfZXJyb3JzKVxuK1x0XHRcdGNsb3NlKGVycl9mZCk7XG4rXHRcdGNsb3NlKG91dFsxXSk7XG4rXHRcdGV4ZWN2KHBhdGgsIGFyZ3YpO1xuK2V4ZWNfZmFpbDpcbitcdFx0ZXJyID0gZXJybm87XG4rXHRcdHdyaXRlKHJlYWR5WzFdLCBcdTAwMjZlcnIsIHNpemVvZihlcnIpKTtcbitcdFx0X2V4aXQoMTI3KTtcbitcdH1cbitcdGNsb3NlKG91dFsxXSk7XG4rXHRjbG9zZShyZWFkeVsxXSk7XG4rXHRjaGlsZC1cdTAwM2VmZCA9IG91dFswXTtcbitcdHBmZCA9IChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCA9IHJlYWR5WzBdLCAuZXZlbnRzID0gUE9MTElOIH07XG4rXHQvKiBFT0Ygb24gdGhlIGNsb3NlLW9uLWV4ZWMgcGlwZSBkaXN0aW5ndWlzaGVzIGV4ZWMgZnJvbSBpbmhlcml0ZWQgaGFuZGxlcnMuICovXG4rXHRlcnIgPSBjaGlsZC1cdTAwM2VwaWQgXHUwMDNlIDAgPyBwb2xsKFx1MDAyNnBmZCwgMSwgV0FJVF9TVEVQUyAqIFdBSVRfVVMgLyAxMDAwKSA6IC0xO1xuK1x0aWYgKCFBU1NFUlRfR1QoY2hpbGQtXHUwMDNlcGlkLCAwLCBcImZvcmtcIikgfHxcbitcdCAgICAhQVNTRVJUX0dUKGVyciwgMCwgXCJleGVjIHRpbWVvdXRcIikgfHxcbitcdCAgICAhQVNTRVJUX0VRKHJlYWQocmVhZHlbMF0sIFx1MDAyNmVyciwgc2l6ZW9mKGVycikpLCAwLCBcImV4ZWNcIikpIHtcbitcdFx0Y2xvc2UocmVhZHlbMF0pO1xuK1x0XHRjb25zdW1lcl9jbGVhbnVwKGNoaWxkKTtcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1x0Y2xvc2UocmVhZHlbMF0pO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBib29sIGNvbnN1bWVyX2ZpbmlzaChzdHJ1Y3QgY29uc3VtZXIgKmNoaWxkLCBpbnQgc2lnbm8sIGJvb2wgc3VjY2VzcyxcbitcdFx0XHQgICAgY2hhciAqb3V0cHV0LCBzaXplX3Qgc2l6ZSlcbit7XG4rXHRpbnQgc3RhdHVzID0gMCwgaTtcbitcdHBpZF90IHJldCA9IDA7XG4rXHRzc2l6ZV90IG47XG4rXHRzaXplX3QgdXNlZCA9IDA7XG4rXG4rXHRpZiAoIUFTU0VSVF9PSyhmY250bChjaGlsZC1cdTAwM2VmZCwgRl9TRVRGTCwgT19OT05CTE9DSyksIFwibm9uYmxvY2tpbmcgb3V0cHV0XCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRpZiAoc2lnbm8gXHUwMDI2XHUwMDI2ICFBU1NFUlRfT0soa2lsbChjaGlsZC1cdTAwM2VwaWQsIHNpZ25vKSwgXCJzaWduYWwgY29uc3VtZXJcIikpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFdBSVRfU1RFUFM7IGkrKykge1xuK1x0XHR3aGlsZSAodXNlZCBcdTAwM2Mgc2l6ZSAtIDEgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICAgICAobiA9IHJlYWQoY2hpbGQtXHUwMDNlZmQsIG91dHB1dCArIHVzZWQsIHNpemUgLSAxIC0gdXNlZCkpIFx1MDAzZSAwKVxuK1x0XHRcdHVzZWQgKz0gbjtcbitcdFx0cmV0ID0gd2FpdHBpZChjaGlsZC1cdTAwM2VwaWQsIFx1MDAyNnN0YXR1cywgV05PSEFORyk7XG4rXHRcdGlmIChyZXQgPT0gY2hpbGQtXHUwMDNlcGlkKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyAhPSBFSU5UUilcbitcdFx0XHRicmVhaztcbitcdFx0dXNsZWVwKFdBSVRfVVMpO1xuK1x0fVxuK1x0aWYgKCFBU1NFUlRfRVEocmV0LCBjaGlsZC1cdTAwM2VwaWQsIFwiYm91bmRlZCBjb25zdW1lciBleGl0XCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRjaGlsZC1cdTAwM2VwaWQgPSAtMTtcbitcdHdoaWxlICh1c2VkIFx1MDAzYyBzaXplIC0gMSBcdTAwMjZcdTAwMjYgKG4gPSByZWFkKGNoaWxkLVx1MDAzZWZkLCBvdXRwdXQgKyB1c2VkLCBzaXplIC0gMSAtIHVzZWQpKSBcdTAwM2UgMClcbitcdFx0dXNlZCArPSBuO1xuK1x0b3V0cHV0W3VzZWRdID0gJ1xcMCc7XG4rXHRyZXR1cm4gQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwibm9ybWFsIGV4aXRcIikgXHUwMDI2XHUwMDI2XG4rXHQgICAgICAgQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cykgPT0gMCwgc3VjY2VzcywgXCJleGl0IHN0YXR1c1wiKTtcbit9XG4rXG4rc3RhdGljIGJvb2wgY29uc3VtZXJfcmVhZHkoc3RydWN0IGNvbnN1bWVyICpjaGlsZClcbit7XG4rXHR1bnNpZ25lZCBsb25nIGxvbmcgY2F1Z2h0O1xuK1x0Y2hhciBwYXRoWzY0XSwgbGluZVsyNTZdO1xuK1x0aW50IGk7XG4rXHRGSUxFICpmO1xuK1xuK1x0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBcIi9wcm9jLyVkL3N0YXR1c1wiLCBjaGlsZC1cdTAwM2VwaWQpO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgV0FJVF9TVEVQUzsgaSsrKSB7XG4rXHRcdGYgPSBmb3BlbihwYXRoLCBcInJcIik7XG4rXHRcdGlmICghZilcbitcdFx0XHRicmVhaztcbitcdFx0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHtcbitcdFx0XHRpZiAoc3NjYW5mKGxpbmUsIFwiU2lnQ2d0OiAlbGx4XCIsIFx1MDAyNmNhdWdodCkgPT0gMSBcdTAwMjZcdTAwMjZcbitcdFx0XHQgICAgKGNhdWdodCBcdTAwMjYgKDFVTEwgXHUwMDNjXHUwMDNjIChTSUdJTlQgLSAxKSkpIFx1MDAyNlx1MDAyNlxuK1x0XHRcdCAgICAoY2F1Z2h0IFx1MDAyNiAoMVVMTCBcdTAwM2NcdTAwM2MgKFNJR1RFUk0gLSAxKSkpKSB7XG4rXHRcdFx0XHRmY2xvc2UoZik7XG4rXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0XHR9XG4rXHRcdH1cbitcdFx0ZmNsb3NlKGYpO1xuK1x0XHR1c2xlZXAoV0FJVF9VUyk7XG4rXHR9XG4rXHRyZXR1cm4gQVNTRVJUX1RSVUUoZmFsc2UsIFwiY29uc3VtZXIgc2lnbmFsIGhhbmRsZXJzIHJlYWR5XCIpO1xuK31cbitcbitzdGF0aWMgYm9vbCBlbWl0X3JlY29yZChzdHJ1Y3QgYnBmdG9vbF9yaW5nYnVmICpza2VsLCBpbnQgcmVjb3JkKVxuK3tcbitcdGNoYXIgcGFja2V0WzY0XSA9IHt9O1xuK1xuK1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMsXG4rXHRcdCAgICAuZGF0YV9pbiA9IHBhY2tldCxcbitcdFx0ICAgIC5kYXRhX3NpemVfaW4gPSBzaXplb2YocGFja2V0KSxcbitcdCk7XG4rXG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNvcmQgPSByZWNvcmQ7XG4rXHRyZXR1cm4gQVNTRVJUX09LKGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MucHJvZHVjZSksXG4rXHRcdFx0XHRcdCAgICAgIFx1MDAyNm9wdHMpLCBcInByb2R1Y2UgcmVjb3JkXCIpIFx1MDAyNlx1MDAyNlxuK1x0ICAgICAgIEFTU0VSVF9PSyhza2VsLVx1MDAzZWJzcy1cdTAwM2VvdXRwdXRfZXJyLCBcInJpbmdidWYgb3V0cHV0XCIpO1xuK31cbitcbitzdGF0aWMgYm9vbCBjb25zdW1lZCh1bnNpZ25lZCBsb25nICpwb3NpdGlvbiwgdW5zaWduZWQgbG9uZyBleHBlY3RlZClcbit7XG4rXHRpbnQgaTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFdBSVRfU1RFUFM7IGkrKykge1xuK1x0XHRpZiAoX19hdG9taWNfbG9hZF9uKHBvc2l0aW9uLCBfX0FUT01JQ19BQ1FVSVJFKSA9PSBleHBlY3RlZClcbitcdFx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0dXNsZWVwKFdBSVRfVVMpO1xuK1x0fVxuK1x0cmV0dXJuIEFTU0VSVF9FUSgqcG9zaXRpb24sIGV4cGVjdGVkLCBcImNvbnN1bWVyIHBvc2l0aW9uXCIpO1xuK31cbitcbitzdGF0aWMgdm9pZCBjaGVja19qc29uKGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqZXhwZWN0ZWQpXG4re1xuK1x0Y2hhciAqc3JjID0gb3V0cHV0LCAqZHN0ID0gb3V0cHV0O1xuK1x0Ym9vbCBxdW90ZWQgPSBmYWxzZSwgZXNjYXBlZCA9IGZhbHNlO1xuK1xuK1x0LyogSWdub3JlIGZvcm1hdHRpbmcgd2hpdGVzcGFjZSB3aGlsZSBjaGVja2luZyB0aGUgZW50aXJlIEpTT04gZG9jdW1lbnQuICovXG4rXHR3aGlsZSAoKnNyYykge1xuK1x0XHRpZiAocXVvdGVkIHx8ICFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxuK1x0XHRcdCpkc3QrKyA9ICpzcmM7XG4rXHRcdGlmICghZXNjYXBlZCBcdTAwMjZcdTAwMjYgKnNyYyA9PSAnXCInKVxuK1x0XHRcdHF1b3RlZCA9ICFxdW90ZWQ7XG4rXHRcdGVzY2FwZWQgPSAhZXNjYXBlZCBcdTAwMjZcdTAwMjYgcXVvdGVkIFx1MDAyNlx1MDAyNiAqc3JjID09ICdcXFxcJztcbitcdFx0c3JjKys7XG4rXHR9XG4rXHQqZHN0ID0gJ1xcMCc7XG4rXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCJKU09OIHJlY29yZHNcIik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfY29uc3VtZXIoYm9vbCBqc29uLCBib29sIGlkbGUsIGludCBzaWdubylcbit7XG4rXHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcbitcdHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWw7XG4rXHR1bnNpZ25lZCBsb25nICpwb3NpdGlvbiA9IE1BUF9GQUlMRUQ7XG4rXHRpbnQgcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKSwgZmQ7XG4rXHRjaGFyIG91dHB1dFs0MDk2XTtcbitcdHN0cnVjdCBwb2xsZmQgcGZkO1xuK1xuK1x0c2tlbCA9IGJwZnRvb2xfcmluZ2J1Zl9fb3BlbigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwib3BlblwiKSlcbitcdFx0cmV0dXJuO1xuK1x0YnBmX21hcF9fc2V0X21heF9lbnRyaWVzKHNrZWwtXHUwMDNlbWFwcy5yaW5nYnVmLCBwYWdlX3NpemUpO1xuK1x0aWYgKCFBU1NFUlRfT0soYnBmdG9vbF9yaW5nYnVmX19sb2FkKHNrZWwpLCBcImxvYWRcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZmQgPSBicGZfbWFwX19mZChza2VsLVx1MDAzZW1hcHMucmluZ2J1Zik7XG4rXHRwb3NpdGlvbiA9IG1tYXAoTlVMTCwgcGFnZV9zaXplLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIGZkLCAwKTtcbitcdGlmICghQVNTRVJUX05FUShwb3NpdGlvbiwgTUFQX0ZBSUxFRCwgXCJjb25zdW1lciBtbWFwXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghaWRsZSBcdTAwMjZcdTAwMjYgKCFlbWl0X3JlY29yZChza2VsLCAwKSB8fCAhZW1pdF9yZWNvcmQoc2tlbCwgMSkpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghY29uc3VtZXJfc3RhcnQoXHUwMDI2Y2hpbGQsIGZkLCBqc29uLCBOVUxMLCBmYWxzZSwgZmFsc2UpIHx8XG4rXHQgICAgIWNvbnN1bWVyX3JlYWR5KFx1MDAyNmNoaWxkKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIWlkbGUpIHtcbitcdFx0LyogQm90aCBwcmVmaWxsZWQgcmVjb3JkcyBvY2N1cHkgMTYgYnl0ZXMgaW5jbHVkaW5nIHRoZWlyIGhlYWRlcnMuICovXG4rXHRcdGlmICghY29uc3VtZWQocG9zaXRpb24sIDMyKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0cGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gY2hpbGQuZmQsIC5ldmVudHMgPSBQT0xMSU4gfTtcbitcdFx0aWYgKCFBU1NFUlRfR1QocG9sbChcdTAwMjZwZmQsIDEsIFdBSVRfU1RFUFMgKiBXQUlUX1VTIC8gMTAwMCksIDAsXG4rXHRcdFx0ICAgICAgIFwicmVjb3JkcyBmbHVzaGVkIGJlZm9yZSBleGl0XCIpIHx8XG4rXHRcdCAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgXHUwMDI2IFBPTExJTiwgXCJyZWNvcmQgb3V0cHV0IHJlYWRhYmxlXCIpIHx8XG4rXHRcdCAgICAhZW1pdF9yZWNvcmQoc2tlbCwgMikgfHwgIWNvbnN1bWVkKHBvc2l0aW9uLCA2NCkpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRpZiAoIWNvbnN1bWVyX2ZpbmlzaChcdTAwMjZjaGlsZCwgc2lnbm8sIHRydWUsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmIChqc29uKVxuK1x0XHRjaGVja19qc29uKG91dHB1dCwgaWRsZSA/IFwiW11cIiA6XG4rXHRcdFx0ICAgXCJbe1xcXCJzaXplXFxcIjoyLFxcXCJkYXRhXFxcIjpbMCwyNTVdfSxcIlxuK1x0XHRcdCAgIFwie1xcXCJzaXplXFxcIjo1LFxcXCJkYXRhXFxcIjpbMSwyLDMsNCw1XX0sXCJcbitcdFx0XHQgICBcIntcXFwic2l6ZVxcXCI6MTcsXFxcImRhdGFcXFwiOlsxNiwxNywxOCwxOSwyMCwyMSwyMiwyMyxcIlxuK1x0XHRcdCAgIFwiMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzJdfV1cIik7XG4rXHRlbHNlXG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGlkbGUgPyBcIlwiIDpcbitcdFx0XHQgICAgIFwiPT0gc2l6ZTogMiA9PT09PVxcbjAwIGZmXFxuXCJcbitcdFx0XHQgICAgIFwiPT0gc2l6ZTogNSA9PT09PVxcbjAxIDAyIDAzIDA0IDA1XFxuXCJcbitcdFx0XHQgICAgIFwiPT0gc2l6ZTogMTcgPT09PT1cXG4xMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAgXCJcbitcdFx0XHQgICAgIFwiMTggMTkgMWEgMWIgMWMgMWQgMWUgMWZcXG4yMFxcblwiLCBcInBsYWluIHJlY29yZHNcIik7XG4rb3V0OlxuK1x0Y29uc3VtZXJfY2xlYW51cChcdTAwMjZjaGlsZCk7XG4rXHRpZiAocG9zaXRpb24gIT0gTUFQX0ZBSUxFRClcbitcdFx0bXVubWFwKHBvc2l0aW9uLCBwYWdlX3NpemUpO1xuK1x0YnBmdG9vbF9yaW5nYnVmX19kZXN0cm95KHNrZWwpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X3BlcmZfY29uc3VtZXIodm9pZClcbit7XG4rXHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcbitcdHVuc2lnbmVkIGxvbmcgbG9uZyBzZWNvbmRzLCBuYW5vc2Vjb25kcztcbitcdHN0cnVjdCBicGZ0b29sX3JpbmdidWYgKnNrZWw7XG4rXHRjaGFyIG91dHB1dFsxNjM4NF0sIGV4cGVjdGVkWzE2Mzg0XTtcbitcdGludCBucl9jcHVzLCBjcHUsIGluZGV4LCBvZmZzZXQgPSAwLCBpLCB1c2VkID0gMCwgZmllbGRzO1xuK1x0c3RydWN0IHBvbGxmZCBwZmQ7XG4rXG4rXHRucl9jcHVzID0gbGliYnBmX251bV9wb3NzaWJsZV9jcHVzKCk7XG4rXHRpZiAoIUFTU0VSVF9HVChucl9jcHVzLCAwLCBcInBvc3NpYmxlIGNwdXNcIikpXG4rXHRcdHJldHVybjtcbitcdHNrZWwgPSBicGZ0b29sX3JpbmdidWZfX29wZW4oKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcIm9wZW5cIikpXG4rXHRcdHJldHVybjtcbitcdGJwZl9tYXBfX3NldF9tYXhfZW50cmllcyhza2VsLVx1MDAzZW1hcHMucmluZ2J1ZiwgZ2V0cGFnZXNpemUoKSk7XG4rXHRicGZfbWFwX19zZXRfbWF4X2VudHJpZXMoc2tlbC1cdTAwM2VtYXBzLnBlcmZidWYsIG5yX2NwdXMpO1xuK1x0aWYgKCFBU1NFUlRfT0soYnBmdG9vbF9yaW5nYnVmX19sb2FkKHNrZWwpLCBcImxvYWRcIikgfHxcbitcdCAgICAhY29uc3VtZXJfc3RhcnQoXHUwMDI2Y2hpbGQsIGJwZl9tYXBfX2ZkKHNrZWwtXHUwMDNlbWFwcy5wZXJmYnVmKSwgZmFsc2UsXG4rXHRcdFx0ICAgIE5VTEwsIGZhbHNlLCBmYWxzZSkgfHwgIWNvbnN1bWVyX3JlYWR5KFx1MDAyNmNoaWxkKSB8fFxuK1x0ICAgICFlbWl0X3JlY29yZChza2VsLCAzKSlcbitcdFx0Z290byBvdXQ7XG4rXHQvKiBPbmUgbGFyZ2UgcmVjb3JkIGZsdXNoZXMgdGhlIGV4aXN0aW5nIGJ1ZmZlcmVkIHBlcmYgb3V0cHV0IGNhbGxiYWNrLiAqL1xuK1x0cGZkID0gKHN0cnVjdCBwb2xsZmQpIHsgLmZkID0gY2hpbGQuZmQsIC5ldmVudHMgPSBQT0xMSU4gfTtcbitcdGlmICghQVNTRVJUX0dUKHBvbGwoXHUwMDI2cGZkLCAxLCBXQUlUX1NURVBTICogV0FJVF9VUyAvIDEwMDApLCAwLFxuK1x0XHQgICAgICAgXCJwZXJmIHJlY29yZCBvdXRwdXRcIikgfHxcbitcdCAgICAhQVNTRVJUX1RSVUUocGZkLnJldmVudHMgXHUwMDI2IFBPTExJTiwgXCJwZXJmIG91dHB1dCByZWFkYWJsZVwiKSB8fFxuK1x0ICAgICFjb25zdW1lcl9maW5pc2goXHUwMDI2Y2hpbGQsIFNJR0lOVCwgdHJ1ZSwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSkpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZmllbGRzID0gc3NjYW5mKG91dHB1dCwgXCI9PSBAJWxsdS4lbGx1IENQVTogJWQgaW5kZXg6ICVkID09PT09XFxuJW5cIixcbitcdFx0XHRcdTAwMjZzZWNvbmRzLCBcdTAwMjZuYW5vc2Vjb25kcywgXHUwMDI2Y3B1LCBcdTAwMjZpbmRleCwgXHUwMDI2b2Zmc2V0KTtcbitcdGlmICghQVNTRVJUX0VRKGZpZWxkcywgNCwgXCJwZXJmIGhlYWRlclwiKSB8fFxuK1x0ICAgICFBU1NFUlRfR1Qob2Zmc2V0LCAwLCBcInBlcmYgcGF5bG9hZCBvZmZzZXRcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0QVNTRVJUX0dUKHNlY29uZHMgKiAxMDAwMDAwMDAwVUxMICsgbmFub3NlY29uZHMsIDAsIFwicGVyZiB0aW1lc3RhbXBcIik7XG4rXHRBU1NFUlRfTFQobmFub3NlY29uZHMsIDEwMDAwMDAwMDBVTEwsIFwicGVyZiB0aW1lc3RhbXAgbmFub3NlY29uZHNcIik7XG4rXHRBU1NFUlRfR0UoY3B1LCAwLCBcInBlcmYgY3B1XCIpO1xuK1x0QVNTRVJUX0xUKGNwdSwgbnJfY3B1cywgXCJwZXJmIGNwdSByYW5nZVwiKTtcbitcdEFTU0VSVF9FUShpbmRleCwgY3B1LCBcInBlcmYgaW5kZXhcIik7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzaXplb2Yoc2tlbC1cdTAwM2Vyb2RhdGEtXHUwMDNlcGVyZl9wYXlsb2FkKTsgaSsrKSB7XG4rXHRcdGNvbnN0IGNoYXIgKnNlcGFyYXRvciA9ICFpID8gXCJcIiA6ICEoaSAlIDE2KSA/IFwiXFxuXCIgOlxuK1x0XHRcdFx0XHQhKGkgJSA4KSA/IFwiICBcIiA6IFwiIFwiO1xuK1xuK1x0XHR1c2VkICs9IHNucHJpbnRmKGV4cGVjdGVkICsgdXNlZCwgc2l6ZW9mKGV4cGVjdGVkKSAtIHVzZWQsXG4rXHRcdFx0XHQgXCIlcyUwMnhcIiwgc2VwYXJhdG9yLCBpID09IDEgPyAweGZmIDogMCk7XG4rXHR9XG4rXHRzbnByaW50ZihleHBlY3RlZCArIHVzZWQsIHNpemVvZihleHBlY3RlZCkgLSB1c2VkLCBcIlxcblwiKTtcbitcdEFTU0VSVF9TVFJFUShvdXRwdXQgKyBvZmZzZXQsIGV4cGVjdGVkLCBcInBlcmYgcGF5bG9hZFwiKTtcbitvdXQ6XG4rXHRjb25zdW1lcl9jbGVhbnVwKFx1MDAyNmNoaWxkKTtcbitcdGJwZnRvb2xfcmluZ2J1Zl9fZGVzdHJveShza2VsKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9yZWplY3QoZW51bSBicGZfbWFwX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uLCBib29sIHBhaXIsIGJvb2wganNvbilcbit7XG4rXHRzdHJ1Y3QgY29uc3VtZXIgY2hpbGQgPSB7IC5waWQgPSAtMSwgLmZkID0gLTEgfTtcbitcdGJvb2wgcmluZyA9IHR5cGUgPT0gQlBGX01BUF9UWVBFX1JJTkdCVUYgfHwgdHlwZSA9PSBCUEZfTUFQX1RZUEVfVVNFUl9SSU5HQlVGO1xuK1x0Y29uc3QgY2hhciAqZXhwZWN0ZWQgPSBvcHRpb24gP1xuK1x0XHRcIntcXFwiZXJyb3JcXFwiOlxcXCJyaW5nIGJ1ZmZlciBtYXBzIGRvIG5vdCBzdXBwb3J0IGNwdSBvciBpbmRleCBhcmd1bWVudHNcXFwifVwiIDpcbitcdFx0XCJ7XFxcImVycm9yXFxcIjpcXFwibWFwIGlzIG5vdCBhIHBlcmYgZXZlbnQgYXJyYXkgb3IgcmluZyBidWZmZXJcXFwifVwiO1xuK1x0Y2hhciBvdXRwdXRbNDA5Nl07XG4rXHRpbnQgZmQ7XG4rXG4rXHRmZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsIE5VTEwsIHJpbmcgPyAwIDogNCwgcmluZyA/IDAgOiA0LFxuK1x0XHRcdCAgICByaW5nID8gZ2V0cGFnZXNpemUoKSA6IDEsIE5VTEwpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwiY3JlYXRlIG1hcFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0aWYgKGNvbnN1bWVyX3N0YXJ0KFx1MDAyNmNoaWxkLCBmZCwganNvbiwgb3B0aW9uLCBwYWlyLCB0cnVlKSBcdTAwMjZcdTAwMjZcbitcdCAgICBjb25zdW1lcl9maW5pc2goXHUwMDI2Y2hpbGQsIDAsIGZhbHNlLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpKSkge1xuK1x0XHRpZiAoanNvbilcbitcdFx0XHRjaGVja19qc29uKG91dHB1dCwgZXhwZWN0ZWQpO1xuK1x0XHRlbHNlXG4rXHRcdFx0QVNTRVJUX0dUKHN0cmxlbihvdXRwdXQpLCAwLCBcImVycm9yIGRpYWdub3N0aWNcIik7XG4rXHR9XG4rXHRjb25zdW1lcl9jbGVhbnVwKFx1MDAyNmNoaWxkKTtcbitcdGNsb3NlKGZkKTtcbit9XG4rXG4rdm9pZCB0ZXN0X2JwZnRvb2xfcmluZ2J1Zih2b2lkKVxuK3tcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicGVyZl9ldmVudF9hcnJheVwiKSlcbitcdFx0dGVzdF9wZXJmX2NvbnN1bWVyKCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInBsYWluXCIpKVxuK1x0XHR0ZXN0X2NvbnN1bWVyKGZhbHNlLCBmYWxzZSwgU0lHSU5UKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwianNvblwiKSlcbitcdFx0dGVzdF9jb25zdW1lcih0cnVlLCBmYWxzZSwgU0lHVEVSTSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImlkbGVfc2lnaW50XCIpKVxuK1x0XHR0ZXN0X2NvbnN1bWVyKGZhbHNlLCB0cnVlLCBTSUdJTlQpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJpZGxlX3NpZ3Rlcm1fanNvblwiKSlcbitcdFx0dGVzdF9jb25zdW1lcih0cnVlLCB0cnVlLCBTSUdURVJNKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicmVqZWN0X2FycmF5XCIpKVxuK1x0XHR0ZXN0X3JlamVjdChCUEZfTUFQX1RZUEVfQVJSQVksIE5VTEwsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJlamVjdF91c2VyX3JpbmdidWZcIikpXG4rXHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9VU0VSX1JJTkdCVUYsIE5VTEwsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJlamVjdF9jcHVcIikpXG4rXHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCBcImNwdVwiLCBmYWxzZSwgZmFsc2UpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyZWplY3RfaW5kZXhcIikpXG4rXHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCBcImluZGV4XCIsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJlamVjdF9jcHVfaW5kZXhcIikpXG4rXHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCBcImNwdVwiLCB0cnVlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInJlamVjdF91c2VyX3JpbmdidWZfanNvblwiKSlcbitcdFx0dGVzdF9yZWplY3QoQlBGX01BUF9UWVBFX1VTRVJfUklOR0JVRiwgTlVMTCwgZmFsc2UsIHRydWUpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJyZWplY3RfY3B1X2luZGV4X2pzb25cIikpXG4rXHRcdHRlc3RfcmVqZWN0KEJQRl9NQVBfVFlQRV9SSU5HQlVGLCBcImNwdVwiLCB0cnVlLCB0cnVlKTtcbit9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYmJiYzkzYzMwYTgzM1xuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2JwZnRvb2xfcmluZ2J1Zi5jXG5AQCAtMCwwICsxLDQ3IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUklOR0JVRik7XG4rfSByaW5nYnVmIFNFQyhcIi5tYXBzXCIpO1xuK1xuK3N0cnVjdCB7XG4rXHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVkpO1xuK1x0X191aW50KGtleV9zaXplLCBzaXplb2YoX191MzIpKTtcbitcdF9fdWludCh2YWx1ZV9zaXplLCBzaXplb2YoX191MzIpKTtcbitcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4rfSBwZXJmYnVmIFNFQyhcIi5tYXBzXCIpO1xuK1xuKy8qXG4rICogSW5jbHVkZSB0aGUgdTMyIHJhdyBzaXplIGluIHBlcmYncyA4LWJ5dGUgYWxpZ25tZW50IHRvIGF2b2lkIHBhZGRpbmcuXG4rICogS2VlcCBwbGFpbiBvdXRwdXQgbGFyZ2UgZW5vdWdoIHRvIGZsdXNoIHN0ZGlvIGJlZm9yZSB0aGUgY29uc3VtZXIgZXhpdHMuXG4rICovXG4rY29uc3QgdW5zaWduZWQgY2hhciBwZXJmX3BheWxvYWRbNDA5Ml0gPSB7IDB4MDAsIDB4ZmYgfTtcbitcbitpbnQgcmVjb3JkO1xuK2ludCBvdXRwdXRfZXJyO1xuK1xuK1NFQyhcInNvY2tldFwiKVxuK2ludCBwcm9kdWNlKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYilcbit7XG4rXHR1bnNpZ25lZCBjaGFyIGZpcnN0W10gPSB7IDB4MDAsIDB4ZmYgfTtcbitcdHVuc2lnbmVkIGNoYXIgc2Vjb25kW10gPSB7IDEsIDIsIDMsIDQsIDUgfTtcbitcdHVuc2lnbmVkIGNoYXIgdGhpcmRbXSA9IHtcbitcdFx0MHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNyxcbitcdFx0MHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCxcbitcdH07XG4rXG4rXHRpZiAocmVjb3JkID09IDApXG4rXHRcdG91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoXHUwMDI2cmluZ2J1ZiwgZmlyc3QsIHNpemVvZihmaXJzdCksIDApO1xuK1x0ZWxzZSBpZiAocmVjb3JkID09IDEpXG4rXHRcdG91dHB1dF9lcnIgPSBicGZfcmluZ2J1Zl9vdXRwdXQoXHUwMDI2cmluZ2J1Ziwgc2Vjb25kLCBzaXplb2Yoc2Vjb25kKSwgMCk7XG4rXHRlbHNlIGlmIChyZWNvcmQgPT0gMilcbitcdFx0b3V0cHV0X2VyciA9IGJwZl9yaW5nYnVmX291dHB1dChcdTAwMjZyaW5nYnVmLCB0aGlyZCwgc2l6ZW9mKHRoaXJkKSwgMCk7XG4rXHRlbHNlXG4rXHRcdG91dHB1dF9lcnIgPSBicGZfcGVyZl9ldmVudF9vdXRwdXQoc2tiLCBcdTAwMjZwZXJmYnVmLCBCUEZfRl9DVVJSRU5UX0NQVSxcbitcdFx0XHRcdFx0XHQgICAodm9pZCAqKXBlcmZfcGF5bG9hZCwgc2l6ZW9mKHBlcmZfcGF5bG9hZCkpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK2NoYXIgTElDRU5TRVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDI6MjA6MzIuNTczNTE1NjY5WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDUzMzAwNzQ5OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIEV2YWx1YXRpb246IFRoaXMgUGF0Y2ggU2VyaWVzKipcblxuT2theSwgbGV0J3Mgc2VlLiBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRvIGFzc2VzcyBpZiB0aGlzIHBhdGNoIHNlcmllcyB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLiBUaGUgZmlyc3Qgc3RlcCBpcyB0byBkaXZlIGludG8gdGhlIGRpZmYuIFRoZSBmaWxlcyB0b3VjaGVkIGFyZSBhbGwgbG9jYXRlZCBpbiBgdG9vbHMvYDogc3BlY2lmaWNhbGx5LCBgdG9vbHMvYnBmL2JwZnRvb2wvYCBhbmQgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9gLiBXZSBoYXZlOiBgRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RgLCB0aGUgYGJwZnRvb2xgIGJhc2ggY29tcGxldGlvbiBzY3JpcHQsIGBtYXBfcGVyZl9yaW5nLmNgIHdpdGhpbiBgYnBmdG9vbGAsIGFuZCBhIGZldyByZWxhdGVkIHRlc3RzIGluIHRoZSBgc2VsZnRlc3RzYCBkaXJlY3RvcnkuXG5cbk5vdywgbGV0J3MgZG91YmxlLWNoZWNrIHRoZSBmdXp6aW5nIGd1aWRlbGluZXMuIFNlY3Rpb24gMiBjbGVhcmx5IGxheXMgb3V0IHRoZSBcIm5lZ2F0aXZlIGNyaXRlcmlhXCIgLSB0aGUgY2FzZXMgd2hlcmUgd2UgKmRvbid0KiBmdXp6LiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgYWxpZ25zIHdpdGggdGhlIHJ1bGVzLiBUaGUgZ3VpZGVsaW5lcyBleHBsaWNpdGx5IHN0YXRlIHRoYXQgY2hhbmdlcyB3aXRoaW4gdXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyB0aGF0ICpkb24ndCogYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKGB2bWxpbnV4YCkgb3Iga2VybmVsIG1vZHVsZXMgYXJlIGEgbm8tZ28gZm9yIGZ1enppbmcuXG5cbkdpdmVuIHRoYXQgYWxsIHRoZSBtb2RpZmljYXRpb25zIGFyZSBzcXVhcmVseSB3aXRoaW4gdGhlIGB0b29scy9gIGRpcmVjdG9yeSwgc3BlY2lmaWNhbGx5IHdpdGhpbiBgYnBmdG9vbGAgKHdoaWNoIGlzIGEgdXNlci1zcGFjZSB0b29sKSBhbmQgdGhlIGFzc29jaWF0ZWQgQlBGIHNlbGZ0ZXN0cywgaXQgc2VlbXMgY2xlYXIgdGhpcyBmYWxscyB1bmRlciB0aGUgXCJub3Qgd29ydGggZnV6emluZ1wiIGNhdGVnb3J5LiBOb25lIG9mIHRoZXNlIGNoYW5nZXMgdG91Y2ggYW55IGtlcm5lbCBydW50aW1lIGNvZGUgKHRoZSBjcml0aWNhbCBgdm1saW51eGAgb3IgbW9kdWxlIGNvZGUpLiBJdCdzIGFsbCBzZWxmLWNvbnRhaW5lZC5cblxuVGhlcmVmb3JlLCBteSBmaW5hbCBjb25jbHVzaW9uIGlzIHRoYXQgYFdvcnRoRnV6emluZyA9IGZhbHNlYC4gQ29uc2VxdWVudGx5LCBgRm9jdXNTeW1ib2xzYCB3aWxsIGJlIGVtcHR5LCBhcyB3aWxsIGBFbmFibGVDb25maWdzYC4gVGhlIHJlYXNvbmluZyBpcyB0aGF0IHRoZSBwYXRjaCBzZXJpZXMgaXMgZW50aXJlbHkgY29uZmluZWQgdG8gdXNlci1zcGFjZSB0b29saW5nIGFuZCB0ZXN0cywgbGVhdmluZyB0aGUga2VybmVsIHJ1bnRpbWUgdW5hZmZlY3RlZC4gSSB3aWxsIG5vdyBjYWxsIGBzZXQtcmVzdWx0c2Agd2l0aCB0aGlzIGFuYWx5c2lzIGFuZCBtb3ZlIG9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTE5NCwiT3V0cHV0VG9rZW5zIjoxMDIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0OTksIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwMjoyMDozNy4xMDY1MjU2ODdaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyNDgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNlcmllcyBleGNsdXNpdmVseSBtb2RpZmllcyB1c2VyLXNwYWNlIHRvb2xpbmcgKGJwZnRvb2wpIGFuZCBzZWxmdGVzdHMgdW5kZXIgdGhlIHRvb2xzLyBkaXJlY3RvcnkgKHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYpLiBObyBrZXJuZWwgcnVudGltZSBjb2RlLCBtb2R1bGVzLCBvciB2bWxpbnV4IGltYWdlcyBhcmUgbW9kaWZpZWQsIHNvIHRoaXMgY2hhbmdlIGRvZXMgbm90IHdhcnJhbnQgc3l6a2FsbGVyIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzZXJpZXMgZXhjbHVzaXZlbHkgbW9kaWZpZXMgdXNlci1zcGFjZSB0b29saW5nIChicGZ0b29sKSBhbmQgc2VsZnRlc3RzIHVuZGVyIHRoZSB0b29scy8gZGlyZWN0b3J5ICh0b29scy9icGYvYnBmdG9vbCBhbmQgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmKS4gTm8ga2VybmVsIHJ1bnRpbWUgY29kZSwgbW9kdWxlcywgb3Igdm1saW51eCBpbWFnZXMgYXJlIG1vZGlmaWVkLCBzbyB0aGlzIGNoYW5nZSBkb2VzIG5vdCB3YXJyYW50IHN5emthbGxlciBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDI6MjA6MzcuMTA2NTUyNTg3WiIsIlNlcSI6NSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI2MTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowdl8x6[1] Phase: Running StartedAt: 2026-09-07 02:20:47 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdl8x6[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-09-07 02:20:47 +0000 UTC FinishedAt: 2026-09-07 02:20:52 +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,}