Name: series-workflowrtdc2 Phase: Failed StartedAt: 2026-07-15 21:15:08 +0000 UTC FinishedAt: 2026-07-15 21:32:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrtdc2[0] Phase: Succeeded StartedAt: 2026-07-15 21:15:08 +0000 UTC FinishedAt: 2026-07-15 21:31:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrtdc2[0].run-triage Phase: Succeeded StartedAt: 2026-07-15 21:15:08 +0000 UTC FinishedAt: 2026-07-15 21:31:03 +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+CgkJCTx0ZD4yMDI2LzA3LzE1IDIxOjI5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgaG9zdC1zaWRlIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIGxpYnJhcnkgZnVuY3Rpb25zIGFuZCBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gZm9yIEtWTSB0byB1c2UuIEhvd2V2ZXIsIEtWTSBzdXBwb3J0IGZvciBSZWFsbXMgaXMgbm90IGluY2x1ZGVkIGluIHRoaXMgcGF0Y2gsIG1ha2luZyB0aGUgZXhwb3J0ZWQgbGlicmFyeSBmdW5jdGlvbnMgdW5yZWFjaGFibGUgZnJvbSB1c2VyLXNwYWNlLiBGdXJ0aGVybW9yZSwgdGhlIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiByZXF1aXJlcyBzcGVjaWZpYyBoYXJkd2FyZS9maXJtd2FyZSAoUk1NKSBzdXBwb3J0IHRoYXQgaXMgbm90IHByZXNlbnQgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLCBhbmQgaXQgd2lsbCBzaW1wbHkgYmFpbCBvdXQgZWFybHkuIFRoZXJlIGFyZSBubyBzeXNjYWxscywgaW9jdGxzLCBvciBvdGhlciB1c2VyLXNwYWNlIGludGVyZmFjZXMgaW50cm9kdWNlZCB0aGF0IHN5emthbGxlciBjb3VsZCBmdXp6LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAyMToyOTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDljYTM0NzQ0NWM2Y2FjYzliYTBjODA4MTE2ZmJjZDhkYzA3OTAxMTlcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIEp1bCAxNSAyMToyOTo1MiAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L0tjb25maWcgYi9hcmNoL2FybTY0L0tjb25maWdcbmluZGV4IGIzYWZlMDY4ODkxOWJkLi4wZjE5NTZlZGYxMzA3YiAxMDA2NDRcbi0tLSBhL2FyY2gvYXJtNjQvS2NvbmZpZ1xuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9LY29uZmlnXG5AQCAtMzgsNiAmIzQzOzM4LDcgQEAgY29uZmlnIEFSTTY0XG4gXHRzZWxlY3QgQVJDSF9IQVNfTUVNQkFSUklFUl9TWU5DX0NPUkVcbiBcdHNlbGVjdCBBUkNIX0hBU19NRU1fRU5DUllQVFxuIFx0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNFQUxfU1lTVEVNX01BUFBJTkdTXG4mIzQzO1x0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfUk1NXG4gXHRzZWxlY3QgQVJDSF9IQVNfTk1JX1NBRkVfVEhJU19DUFVfT1BTXG4gXHRzZWxlY3QgQVJDSF9IQVNfTk9OX09WRVJMQVBQSU5HX0FERFJFU1NfU1BBQ0VcbiBcdHNlbGVjdCBBUkNIX0hBU19OT05MRUFGX1BNRF9ZT1VORyBpZiBBUk02NF9IQUZUXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLmYxM2VjZGI0MGRlZDQxXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmhcbkBAIC0wLDAgJiM0MzsxLDQ1OSBAQFxuJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xuJiM0MzsvKlxuJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLlxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgX19BU01fUk1JX0NNRFNfSFxuJiM0MzsjZGVmaW5lIF9fQVNNX1JNSV9DTURTX0hcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2FybS1ybWktY21kcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2FybS1zbWNjYy1ybWkuaFx1MDAzZVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ydHRfZGF0YV9tYXBfaW5pdCgpIC0gQ3JlYXRlIGEgcHJvdGVjdGVkIG1hcHBpbmcgd2l0aCBkYXRhIGNvbnRlbnRzXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqIEBkYXRhOiBQQSBvZiB0aGUgdGFyZ2V0IGdyYW51bGVcbiYjNDM7ICogQGlwYTogSVBBIGF0IHdoaWNoIHRoZSBncmFudWxlIHdpbGwgYmUgbWFwcGVkIGluIHRoZSBndWVzdFxuJiM0MzsgKiBAc3JjOiBQQSBvZiB0aGUgc291cmNlIGdyYW51bGVcbiYjNDM7ICogQGZsYWdzOiBSTUlfTUVBU1VSRV9DT05URU5UIGlmIHRoZSBjb250ZW50cyBzaG91bGQgYmUgbWVhc3VyZWRcbiYjNDM7ICpcbiYjNDM7ICogQ3JlYXRlIGEgbWFwcGluZyBmcm9tIFByb3RlY3RlZCBJUEEgc3BhY2UgdG8gY29udmVudGlvbmFsIG1lbW9yeSwgY29weWluZ1xuJiM0MzsgKiBjb250ZW50cyBmcm9tIGEgTm9uLXNlY3VyZSBHcmFudWxlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2RhdGFfbWFwX2luaXQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBkYXRhLFxuJiM0MztcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBpcGEsIHVuc2lnbmVkIGxvbmcgc3JjLFxuJiM0MztcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBmbGFncylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVQsIHJkLCBkYXRhLCBpcGEsIHNyYywgZmxhZ3NcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9kYXRhX21hcCgpIC0gQ3JlYXRlIG1hcHBpbmdzIGluIHByb3RlY3RlZCBJUEEgd2l0aCB1bmtub3duIGNvbnRlbnRzXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4mIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuJiM0MzsgKiBAZmxhZ3M6IEZsYWdzXG4mIzQzOyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbiYjNDM7ICogQG91dF90b3A6IFRvcCBhZGRyZXNzIG9mIHJhbmdlIHdoaWNoIHdhcyBwcm9jZXNzZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGF0YV9tYXAodW5zaWduZWQgbG9uZyByZCxcbiYjNDM7XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyB0b3AsXG4mIzQzO1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBmbGFncyxcbiYjNDM7XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuJiM0MztcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9EQVRBX01BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4mIzQzO1x0fTtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChvdXRfdG9wKVxuJiM0MztcdFx0Km91dF90b3AgPSByZWdzLmExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9kYXRhX3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3MgdG8gY29udmVudGlvbmFsIG1lbW9yeVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCBSZWFsbVxuJiM0MzsgKiBAYmFzZTogQmFzZSBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcbiYjNDM7ICogQGZsYWdzOiBGbGFnc1xuJiM0MzsgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXG4mIzQzOyAqIEBvdXRfdG9wOiBSZXR1cm5zIHRvcCBJUEEgb2YgcmFuZ2Ugd2hpY2ggaGFzIGJlZW4gdW5tYXBwZWRcbiYjNDM7ICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2VcbiYjNDM7ICogQG91dF9jb3VudDogTnVtYmVyIG9mIGVudHJpZXMgaW4gb3V0cHV0IGFkZHJlc3MgbGlzdFxuJiM0MzsgKlxuJiM0MzsgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIGNvbnZlbnRpb24gbWVtb3J5IHdpdGggYSB0YXJnZXQgUHJvdGVjdGVkIElQQSByYW5nZS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGF0YV91bm1hcCh1bnNpZ25lZCBsb25nIHJkLFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4mIzQzO1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcbiYjNDM7XHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3AsXG4mIzQzO1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nICpvdXRfcmFuZ2UsXG4mIzQzO1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nICpvdXRfY291bnQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9EQVRBX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcbiYjNDM7XHR9O1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKG91dF90b3ApXG4mIzQzO1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4mIzQzO1x0aWYgKG91dF9yYW5nZSlcbiYjNDM7XHRcdCpvdXRfcmFuZ2UgPSByZWdzLmEyO1xuJiM0MztcdGlmIChvdXRfY291bnQpXG4mIzQzO1x0XHQqb3V0X2NvdW50ID0gcmVncy5hMztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9wc2NpX2NvbXBsZXRlKCkgLSBDb21wbGV0ZSBwZW5kaW5nIFBTQ0kgY29tbWFuZFxuJiM0MzsgKiBAY2FsbGluZ19yZWM6IFBBIG9mIHRoZSBjYWxsaW5nIFJFQ1xuJiM0MzsgKiBAc3RhdHVzOiBTdGF0dXMgb2YgdGhlIFBTQ0kgcmVxdWVzdFxuJiM0MzsgKlxuJiM0MzsgKiBDb21wbGV0ZXMgYSBwZW5kaW5nIFBTQ0kgY29tbWFuZC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9wc2NpX2NvbXBsZXRlKHVuc2lnbmVkIGxvbmcgY2FsbGluZ19yZWMsXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgc3RhdHVzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xuJiM0MztcbiYjNDM7XHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1BTQ0lfQ09NUExFVEUsIGNhbGxpbmdfcmVjLCBzdGF0dXMsIFx1MDAyNnJlcyk7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXMuYTA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcmVhbG1fYWN0aXZhdGUoKSAtIEFjdGl2ZSBhIHJlYWxtXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqXG4mIzQzOyAqIE1hcmsgYSByZWFsbSBhcyBBY3RpdmUgc2lnbmFsbGluZyB0aGF0IGNyZWF0aW9uIGlzIGNvbXBsZXRlIGFuZCBhbGxvd2luZ1xuJiM0MzsgKiBleGVjdXRpb24gb2YgdGhlIHJlYWxtLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX2FjdGl2YXRlKHVuc2lnbmVkIGxvbmcgcmQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XG4mIzQzO1xuJiM0MztcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUkVBTE1fQUNUSVZBVEUsIHJkLCBcdTAwMjZyZXMpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmVzLmEwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3JlYWxtX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgcmVhbG1cbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHBhcmFtczogUEEgb2YgcmVhbG0gcGFyYW1ldGVyc1xuJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuJiM0MzsgKlxuJiM0MzsgKiBDcmVhdGUgYSBuZXcgcmVhbG0gdXNpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcmVhbG1fY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcGFyYW1zLFxuJiM0MztcdFx0XHRcdCAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXG4mIzQzO1x0XHRcdFx0ICAgU01DX1JNSV9SRUFMTV9DUkVBVEUsIHJkLCBwYXJhbXMpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3JlYWxtX3Rlcm1pbmF0ZSgpIC0gVGVybWluYXRlIGEgcmVhbG1cbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbiYjNDM7ICpcbiYjNDM7ICogVGVybWluYXRlcyBhIHJlYWxtLCBtb3ZpbmcgaXQgaW50byBhIFpPTUJJRSBzdGF0ZVxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX3Rlcm1pbmF0ZSh1bnNpZ25lZCBsb25nIHJkLFxuJiM0MztcdFx0XHRcdCAgICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXG4mIzQzO1x0XHRcdFx0ICAgU01DX1JNSV9SRUFMTV9URVJNSU5BVEUsIHJkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9yZWFsbV9kZXN0cm95KCkgLSBEZXN0cm95IGEgcmVhbG1cbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbiYjNDM7ICpcbiYjNDM7ICogRGVzdHJveXMgYSByZWFsbSwgYWxsIG9iamVjdHMgYmVsb25naW5nIHRvIHRoZSByZWFsbSBtdXN0IGJlIGRlc3Ryb3llZCBmaXJzdC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9yZWFsbV9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0ICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXG4mIzQzO1x0XHRcdFx0ICAgU01DX1JNSV9SRUFMTV9ERVNUUk9ZLCByZCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcmVjX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgUkVDXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXG4mIzQzOyAqIEBwYXJhbXM6IFBBIG9mIFJFQyBwYXJhbWV0ZXJzXG4mIzQzOyAqIEBzcm86IEFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXG4mIzQzOyAqXG4mIzQzOyAqIENyZWF0ZSBhIFJFQyB1c2luZyB0aGUgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdCByZWNfcGFyYW1zIHBvaW50ZWRcbiYjNDM7ICogdG8gYnkgQHBhcmFtcy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9yZWNfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgcmVjLFxuJiM0MztcdFx0XHRcdCB1bnNpZ25lZCBsb25nIHBhcmFtcyxcbiYjNDM7XHRcdFx0XHQgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdCpzcm8gPSAoc3RydWN0IHJtaV9zcm9fc3RhdGUpey5yZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9SRUNfQ1JFQVRFLCByZCwgcmVjLCBwYXJhbXNcbiYjNDM7XHR9fTtcbiYjNDM7XHRyZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzcm8sIEdGUF9LRVJORUwpO1xuJiM0MztcdHJtaV9zcm9fZnJlZShzcm8pO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3JlY19kZXN0cm95KCkgLSBEZXN0cm95IGEgUkVDXG4mIzQzOyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXG4mIzQzOyAqIEBzcm86IEFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXG4mIzQzOyAqXG4mIzQzOyAqIERlc3Ryb3lzIGEgUkVDLiBUaGUgUkVDIG11c3Qgbm90IGJlIHJ1bm5pbmcuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcmVjX2Rlc3Ryb3kodW5zaWduZWQgbG9uZyByZWMsXG4mIzQzO1x0XHRcdFx0ICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JFQ19ERVNUUk9ZLCByZWMpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3JlY19lbnRlcigpIC0gRW50ZXIgYSBSRUNcbiYjNDM7ICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUNcbiYjNDM7ICogQHJ1bl9wdHI6IFBBIG9mIFJlY1J1biBzdHJ1Y3R1cmVcbiYjNDM7ICpcbiYjNDM7ICogU3RhcnRzIChvciBjb250aW51ZXMpIGV4ZWN1dGlvbiB3aXRoaW4gYSBSRUMuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcmVjX2VudGVyKHVuc2lnbmVkIGxvbmcgcmVjLCB1bnNpZ25lZCBsb25nIHJ1bl9wdHIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XG4mIzQzO1xuJiM0MztcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUkVDX0VOVEVSLCByZWMsIHJ1bl9wdHIsIFx1MDAyNnJlcyk7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXMuYTA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X2NyZWF0ZSgpIC0gQ3JlYXRlcyBhbiBSVFRcbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHJ0dDogUEEgb2YgdGhlIHRhcmdldCBSVFRcbiYjNDM7ICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUXG4mIzQzOyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWVcbiYjNDM7ICpcbiYjNDM7ICogQ3JlYXRlcyBhbiBSVFQgKFJlYWxtIFRyYW5zbGF0aW9uIFRhYmxlKSBhdCB0aGUgc3BlY2lmaWVkIGxldmVsIGZvciB0aGVcbiYjNDM7ICogdHJhbnNsYXRpb24gb2YgdGhlIHNwZWNpZmllZCBhZGRyZXNzIHdpdGhpbiB0aGUgcmVhbG0uXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJ0dCxcbiYjNDM7XHRcdFx0XHQgdW5zaWduZWQgbG9uZyBpcGEsIGxvbmcgbGV2ZWwpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9DUkVBVEUsIHJkLCBydHQsIGlwYSwgbGV2ZWxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9kZXN0cm95KCkgLSBEZXN0cm95IGFuIFJUVFxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCByZWFsbVxuJiM0MzsgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcbiYjNDM7ICogQGxldmVsOiBSVFQgbGV2ZWxcbiYjNDM7ICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZFxuJiM0MzsgKiBAb3V0X3RvcDogUG9pbnRlciB0byB3cml0ZSB0aGUgdG9wIElQQSBvZiBub24tbGl2ZSBSVFQgZW50cmllcywgZnJvbSBlbnRyeVxuJiM0MzsgKiBhdCB3aGljaCB0aGUgUlRUIHdhbGsgdGVybWluYXRlZC5cbiYjNDM7ICpcbiYjNDM7ICogRGVzdHJveXMgYW4gUlRULiBUaGUgUlRUIG11c3QgYmUgbm9uLWxpdmUsIGkuZS4gbm9uZSBvZiB0aGUgZW50cmllcyBpbiB0aGVcbiYjNDM7ICogdGFibGUgYXJlIGluIEFTU0lHTkVEIG9yIFRBQkxFIHN0YXRlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLFxuJiM0MztcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyBpcGEsXG4mIzQzO1x0XHRcdFx0ICBsb25nIGxldmVsLFxuJiM0MztcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyAqb3V0X3J0dCxcbiYjNDM7XHRcdFx0XHQgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9ERVNUUk9ZLCByZCwgaXBhLCBsZXZlbFxuJiM0MztcdH07XG4mIzQzO1x0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKG91dF9ydHQpXG4mIzQzO1x0XHQqb3V0X3J0dCA9IHJlZ3MuYTE7XG4mIzQzO1x0aWYgKG91dF90b3ApXG4mIzQzO1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTI7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X2ZvbGQoKSAtIEZvbGQgYW4gUlRUXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVFxuJiM0MzsgKiBAbGV2ZWw6IERlcHRoIG9mIHRoZSBSVFQgd2l0aGluIHRoZSB0cmVlXG4mIzQzOyAqIEBvdXRfcnR0OiBQb2ludGVyIHRvIHdyaXRlIHRoZSBQQSBvZiB0aGUgUlRUIHdoaWNoIHdhcyBkZXN0cm95ZWRcbiYjNDM7ICpcbiYjNDM7ICogRm9sZHMgYW4gUlRULiBJZiBhbGwgZW50cmllcyB3aXRoIHRoZSBSVFQgYXJlICYjMzk7aG9tb2dlbmVvdXMmIzM5OyB0aGUgUlRUIGNhbiBiZVxuJiM0MzsgKiBmb2xkZWQgaW50byB0aGUgcGFyZW50IGFuZCB0aGUgUlRUIGRlc3Ryb3llZC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZm9sZCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGlwYSxcbiYjNDM7XHRcdFx0ICAgICAgIGxvbmcgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgKm91dF9ydHQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9GT0xELCByZCwgaXBhLCBsZXZlbFxuJiM0MztcdH07XG4mIzQzO1x0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKG91dF9ydHQpXG4mIzQzO1x0XHQqb3V0X3J0dCA9IHJlZ3MuYTE7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X2luaXRfcmlwYXMoKSAtIFNldCBSSVBBUyBmb3IgbmV3IHJlYWxtXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRhcmdldCBJUEEgcmVnaW9uXG4mIzQzOyAqIEB0b3A6IFRvcCBvZiB0YXJnZXQgSVBBIHJlZ2lvblxuJiM0MzsgKiBAb3V0X3RvcDogVG9wIElQQSBvZiByYW5nZSB3aG9zZSBSSVBBUyB3YXMgbW9kaWZpZWRcbiYjNDM7ICpcbiYjNDM7ICogU2V0cyB0aGUgUklQQVMgb2YgYSB0YXJnZXQgSVBBIHJhbmdlIHRvIFJBTSwgZm9yIGEgcmVhbG0gaW4gdGhlIE5FVyBzdGF0ZS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfaW5pdF9yaXBhcyh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIHRvcCwgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX0lOSVRfUklQQVMsIHJkLCBiYXNlLCB0b3BcbiYjNDM7XHR9O1xuJiM0MztcdGludCByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChvdXRfdG9wKVxuJiM0MztcdFx0Km91dF90b3AgPSByZWdzLmExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF91bnByb3RfbWFwKCkgLSBNYXAgdW5wcm90ZWN0ZWQgZ3JhbnVsZXMgaW50byBhIHJlYWxtXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqIEBiYXNlOiBCYXNlIElQQSBvZiB0aGUgbWFwcGluZ1xuJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcbiYjNDM7ICogQGZsYWdzOiBGbGFnc1xuJiM0MzsgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXG4mIzQzOyAqIEBvdXRfdG9wOiBUb3AgSVBBIG9mIHJhbmdlIHdoaWNoIGhhcyBiZWVuIG1hcHBlZFxuJiM0MzsgKlxuJiM0MzsgKiBDcmVhdGUgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X3VucHJvdF9tYXAodW5zaWduZWQgbG9uZyByZCxcbiYjNDM7XHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSxcbiYjNDM7XHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcbiYjNDM7XHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgb2FkZHIsXG4mIzQzO1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9SVFRfVU5QUk9UX01BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4mIzQzO1x0fTtcbiYjNDM7XHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0MztcbiYjNDM7XHRpZiAob3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ydHRfc2V0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIGFuIHJ1bm5pbmcgcmVhbG1cbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHJlYzogUEEgb2YgdGhlIFJFQyBtYWtpbmcgdGhlIHJlcXVlc3RcbiYjNDM7ICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb25cbiYjNDM7ICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uXG4mIzQzOyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRvcCBJUEEgb2YgcmFuZ2Ugd2hvc2UgUklQQVMgd2FzIG1vZGlmaWVkXG4mIzQzOyAqXG4mIzQzOyAqIENvbXBsZXRlcyBhIHJlcXVlc3QgbWFkZSBieSB0aGUgcmVhbG0gdG8gY2hhbmdlIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEFcbiYjNDM7ICogcmFuZ2UuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X3NldF9yaXBhcyh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJlYyxcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHRvcCxcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX1NFVF9SSVBBUywgcmQsIHJlYywgYmFzZSwgdG9wXG4mIzQzO1x0fTtcbiYjNDM7XHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0MztcbiYjNDM7XHRpZiAob3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ydHRfdW5wcm90X3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3Mgd2l0aGluIGFuIHVucHJvdGVjdGVkIElQQSByYW5nZVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmdcbiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4mIzQzOyAqIEBmbGFnczogRmxhZ3NcbiYjNDM7ICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxuJiM0MzsgKiBAb3V0X3RvcDogVG9wIElQQSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxuJiM0MzsgKiBAb3V0X3JhbmdlOiBPdXRwdXQgYWRkcmVzcyByYW5nZVxuJiM0MzsgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XG4mIzQzOyAqXG4mIzQzOyAqIFJlbW92ZXMgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X3VucHJvdF91bm1hcCh1bnNpZ25lZCBsb25nIHJkLFxuJiM0MztcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuJiM0MztcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLFxuJiM0MztcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuJiM0MztcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxuJiM0MztcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nICpvdXRfcmFuZ2UsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9jb3VudClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX1VOUFJPVF9VTk1BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4mIzQzO1x0fTtcbiYjNDM7XHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0MztcbiYjNDM7XHRpZiAob3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbiYjNDM7XHRpZiAob3V0X3JhbmdlKVxuJiM0MztcdFx0Km91dF9yYW5nZSA9IHJlZ3MuYTI7XG4mIzQzO1x0aWYgKG91dF9jb3VudClcbiYjNDM7XHRcdCpvdXRfY291bnQgPSByZWdzLmEzO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsjZW5kaWYgLyogX19BU01fUk1JX0NNRFNfSCAqL1xuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY1xuaW5kZXggOWEyMmRmMGM1MTIwZjMuLjRhZTYzYzg5Y2RhOTdkIDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNcbkBAIC0yOTMsNiAmIzQzOzI5Myw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRpc2FyM1tdID0ge1xuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRwZnIwW10gPSB7XG4gXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0NTVjNfU0hJRlQsIDQsIDApLFxuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9DU1YyX1NISUZULCA0LCAwKSxcbiYjNDM7XHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX1JNRV9TSElGVCwgNCwgMCksXG4gXHRBUk02NF9GVFJfQklUUyhGVFJfVklTSUJMRSwgRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9ESVRfU0hJRlQsIDQsIDApLFxuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9BTVVfU0hJRlQsIDQsIDApLFxuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9NUEFNX1NISUZULCA0LCAwKSxcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWcgYi9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWdcbmluZGV4IDEyZGM3MDI1NDg0MmNlLi41NTU0Mjg3OWZiYjhhYiAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ1xuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXG5AQCAtMzAxLDUgJiM0MzszMDEsNiBAQCBzb3VyY2UgXCYjMzQ7ZHJpdmVycy9maXJtd2FyZS9zYW1zdW5nL0tjb25maWdcJiMzNDtcbiBzb3VyY2UgXCYjMzQ7ZHJpdmVycy9maXJtd2FyZS9zbWNjYy9LY29uZmlnXCYjMzQ7XG4gc291cmNlIFwmIzM0O2RyaXZlcnMvZmlybXdhcmUvdGVncmEvS2NvbmZpZ1wmIzM0O1xuIHNvdXJjZSBcJiMzNDtkcml2ZXJzL2Zpcm13YXJlL3hpbGlueC9LY29uZmlnXCYjMzQ7XG4mIzQzO3NvdXJjZSBcJiMzNDtkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1wmIzM0O1xuIFxuIGVuZG1lbnVcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlIGIvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZVxuaW5kZXggNGRkZWMyODIwYzk2ZmEuLjA3ZThjYTE3ODliNDllIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZVxuQEAgLTM4LDMgJiM0MzszOCw0IEBAIG9iai15XHRcdFx0XHQmIzQzOz0gc2Ftc3VuZy9cbiBvYmoteVx0XHRcdFx0JiM0Mzs9IHNtY2NjL1xuIG9iai15XHRcdFx0XHQmIzQzOz0gdGVncmEvXG4gb2JqLXlcdFx0XHRcdCYjNDM7PSB4aWxpbngvXG4mIzQzO29iai15XHRcdFx0XHQmIzQzOz0gYXJtX3JtbS9cbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLmQyMjRhNzJjY2E5MDg5XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1xuQEAgLTAsMCAmIzQzOzEsMjIgQEBcbiYjNDM7XG4mIzQzO2NvbmZpZyBBUkNIX1NVUFBPUlRTX1JNTVxuJiM0MztcdGJvb2xcbiYjNDM7XG4mIzQzO2NvbmZpZyBBUk1fUk1NXG4mIzQzO1x0Ym9vbCBcJiMzNDtSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3IgKFJNTSkgU3VwcG9ydFwmIzM0O1xuJiM0MztcdGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19STU1cbiYjNDM7XHRkZWZhdWx0IHlcbiYjNDM7XHRoZWxwXG4mIzQzO1x0ICBTdXBwb3J0IHRoZSBSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3IgKFJNTSkgb24gQXJtIHN5c3RlbXMgdGhhdFxuJiM0MztcdCAgaW1wbGVtZW50IHRoZSBSZWFsbSBNYW5hZ2VtZW50IEV4dGVuc2lvbiAoUk1FKSwgYXMgZGVmaW5lZCBieSB0aGVcbiYjNDM7XHQgIEFybSBDb25maWRlbnRpYWwgQ29tcHV0ZSBBcmNoaXRlY3R1cmUuXG4mIzQzO1xuJiM0MztcdCAgVGhlIFJNTSBydW5zIGluIHRoZSBSZWFsbSB3b3JsZCBhbmQgcHJvdmlkZXMgdGhlIFJlYWxtIE1hbmFnZW1lbnRcbiYjNDM7XHQgIEludGVyZmFjZSAoUk1JKSB1c2VkIGJ5IGEgTm9ybWFsIFdvcmxkIGhvc3QgdG8gY3JlYXRlLCBtYW5hZ2UgYW5kIHJ1blxuJiM0MztcdCAgcHJvdGVjdGVkIHZpcnR1YWwgbWFjaGluZXMgY2FsbGVkIFJlYWxtcy4gVGhpcyBvcHRpb24gYnVpbGRzIHRoZVxuJiM0MztcdCAgaG9zdC1zaWRlIFJNSSBzdXBwb3J0IHVzZWQgYnkgS1ZNIHRvIGRldGVjdCBhIGNvbXBhdGlibGUgUk1NLFxuJiM0MztcdCAgY29uZmlndXJlIGl0LCBtYW5hZ2UgZGVsZWdhdGVkIG1lbW9yeSBhbmQgZW5hYmxlIFJlYWxtIGd1ZXN0cy5cbiYjNDM7XG4mIzQzO1x0ICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gZG9lcyBub3QgYnkgaXRzZWxmIG1ha2UgUmVhbG0gZ3Vlc3RzIGF2YWlsYWJsZTpcbiYjNDM7XHQgIHRoZSBzeXN0ZW0gbXVzdCBhbHNvIHByb3ZpZGUgUk1FLWNhcGFibGUgaGFyZHdhcmUgYW5kIGZpcm13YXJlIHdpdGggYVxuJiM0MztcdCAgY29tcGF0aWJsZSBSTU0gaW1wbGVtZW50YXRpb24uXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjUxYWVmNWNjMDRiMDJjXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcbkBAIC0wLDAgJiM0MzsxLDIgQEBcbiYjNDM7XG4mIzQzO29iai0kKENPTkZJR19BUk1fUk1NKVx0PSBybWkub1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5kMGMwODNiZGYyNTFmNFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jXG5AQCAtMCwwICYjNDM7MSw3MjQgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LypcbiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9jcHVmZWF0dXJlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbWVtYmxvY2suaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9hcm0tcm1pLWNtZHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9wcm9jZXNzb3IuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2FzbS9tZW1vcnkuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20vcGd0YWJsZS1od2RlZi5oXHUwMDNlXG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBhcm02NF9ybWlfaXNfYXZhaWxhYmxlO1xuJiM0MztcbiYjNDM7LyogQ3VycmVudGx5IG9ubHkgdGhlIGZpcnN0IDIgcmVnaXN0ZXJzIGFyZSB1c2VkIGJ5IExpbnV4ICovXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRfUkVHX0NPVU5UXHQyXG4mIzQzO3N0YXRpYyBfX3JvX2FmdGVyX2luaXQgdW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWdfY2FjaGVbUk1JX0ZFQVRfUkVHX0NPVU5UXTtcbiYjNDM7XG4mIzQzO3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaWQpXG4mIzQzO3tcbiYjNDM7XHRpZiAoV0FSTl9PTihpZCBcdTAwM2U9IFJNSV9GRUFUX1JFR19DT1VOVCkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJtaV9mZWF0X3JlZ19jYWNoZVtpZF07XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX2ZlYXRfcmVnKTtcbiYjNDM7XG4mIzQzO2ludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cyxcbiYjNDM7XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsXG4mIzQzO1x0XHQgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyByZXQgPSAwO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgdG9wID0gcGh5cyAmIzQzOyBzaXplO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgb3V0X3RvcDtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKHBoeXMgXHUwMDNjIHRvcCkge1xuJiM0MztcdFx0cmV0ID0gcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUocGh5cywgdG9wLCBcdTAwMjZvdXRfdG9wKTtcbiYjNDM7XHRcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpXG4mIzQzO1x0XHRcdHBoeXMgPSBvdXRfdG9wO1xuJiM0MztcdFx0ZWxzZSBpZiAocmV0ID09IFJNSV9CVVNZIHx8IHJldCA9PSBSTUlfQkxPQ0tFRClcbiYjNDM7XHRcdFx0Y3B1X3JlbGF4KCk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG91dF9waHlzKVxuJiM0MztcdFx0Km91dF9waHlzID0gcGh5cztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfZGVsZWdhdGVfcmFuZ2UpO1xuJiM0MztcbiYjNDM7aW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsXG4mIzQzO1x0XHRcdCB1bnNpZ25lZCBsb25nIHNpemUpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHJldCA9IDA7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB0b3AgPSBwaHlzICYjNDM7IHNpemU7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBvdXRfdG9wO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAocGh5cyBcdTAwM2MgdG9wKSB7XG4mIzQzO1x0XHRyZXQgPSBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHBoeXMsIHRvcCwgXHUwMDI2b3V0X3RvcCk7XG4mIzQzO1x0XHRpZiAocmV0ID09IFJNSV9TVUNDRVNTKVxuJiM0MztcdFx0XHRwaHlzID0gb3V0X3RvcDtcbiYjNDM7XHRcdGVsc2UgaWYgKHJldCA9PSBSTUlfQlVTWSB8fCByZXQgPT0gUk1JX0JMT0NLRUQpXG4mIzQzO1x0XHRcdGNwdV9yZWxheCgpO1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3VuZGVsZWdhdGVfcmFuZ2UpO1xuJiM0MztcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgZG9uYXRlX3JlcV90b19zaXplKHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIEJJVChBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUKDMgLSB1bml0X3NpemUpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgcm1pX3NtY2NjX2ludm9rZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzX2luLFxuJiM0MztcdFx0XHQgICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3Nfb3V0KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gKnJlZ3NfaW47XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzdGF0dXM7XG4mIzQzO1xuJiM0MztcdHdoaWxlICgxKSB7XG4mIzQzO1x0XHRhcm1fc21jY2NfMV8yX2ludm9rZShcdTAwMjZyZWdzLCByZWdzX291dCk7XG4mIzQzO1x0XHRzdGF0dXMgPSBSTUlfUkVUVVJOX1NUQVRVUyhyZWdzX291dC1cdTAwM2VhMCk7XG4mIzQzO1x0XHRpZiAoc3RhdHVzICE9IFJNSV9CVVNZIFx1MDAyNlx1MDAyNiBzdGF0dXMgIT0gUk1JX0JMT0NLRUQpXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0Y3B1X3JlbGF4KCk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBybWlfb3BfY29udGludWUodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLCB1bnNpZ25lZCBsb25nIGZsYWdzLFxuJiM0MztcdFx0XHQgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX09QX0NPTlRJTlVFLCBzcm9faGFuZGxlLCBmbGFnc1xuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdHJtaV9zbWNjY19pbnZva2UoXHUwMDI2cmVncywgb3V0X3JlZ3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBybWlfb3BfY2FuY2VsKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfT1BfQ0FOQ0VMLCBzcm9faGFuZGxlXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cm1pX3NtY2NjX2ludm9rZShcdTAwMjZyZWdzLCBvdXRfcmVncyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJtaV9vcF9tZW1fZG9uYXRlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsXG4mIzQzO1x0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9jb3VudCwgdW5zaWduZWQgbG9uZyBmbGFncyxcbiYjNDM7XHRcdFx0ICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX09QX01FTV9ET05BVEUsIHNyb19oYW5kbGUsIGxpc3RfYWRkciwgbGlzdF9jb3VudCwgZmxhZ3NcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX21lbV9yZWNsYWltKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9hZGRyLFxuJiM0MztcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2NvdW50LFxuJiM0MztcdFx0XHQgICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnRcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbiYjNDM7e1xuJiM0MztcdGlmIChXQVJOX09OX09OQ0Uocm1pX3VuZGVsZWdhdGVfcGFnZShwaHlzKSkpIHtcbiYjNDM7XHRcdC8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovXG4mIzQzO1x0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBoeXNfdG9fdmlydChwaHlzKSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKGZyZWVfZGVsZWdhdGVkX3BhZ2UpO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgY291bnQpXG4mIzQzO3tcbiYjNDM7XHRpZiAoV0FSTl9PTl9PTkNFKHNyby1cdTAwM2VhZGRyX2NvdW50IFx1MDAzZSBSTUlfTUFYX0FERFJfTElTVCkpXG4mIzQzO1x0XHRyZXR1cm4gLUVPVkVSRkxPVztcbiYjNDM7XG4mIzQzO1x0aWYgKGNvdW50IFx1MDAzZSBSTUlfTUFYX0FERFJfTElTVCAtIHNyby1cdTAwM2VhZGRyX2NvdW50KVxuJiM0MztcdFx0cmV0dXJuIC1FTk9TUEM7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHRcdCB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuJiM0MztcdFx0XHRcdCBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcbiYjNDM7XHRcdFx0XHQgZ2ZwX3QgZ2ZwKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZV9ieXRlcyA9IGRvbmF0ZV9yZXFfdG9fc2l6ZShkb25hdGVyZXEpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHNpemUgPSB1bml0X3NpemVfYnl0ZXMgKiBjb3VudDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XHR2b2lkICp2aXJ0O1xuJiM0MztcdHBoeXNfYWRkcl90IHBoeXM7XG4mIzQzO1xuJiM0MztcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBzcm8tXHUwMDNlYWRkcl9jb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXHUwMDNlYWRkcl9saXN0W2ldO1xuJiM0MztcbiYjNDM7XHRcdGlmIChSTUlfQUREUl9SQU5HRV9TSVpFKGVudHJ5KSA9PSB1bml0X3NpemUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IGNvdW50IFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBJU19BTElHTkVEKFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpLCBzaXplKSkge1xuJiM0MztcdFx0XHRzcm8tXHUwMDNlYWRkcl9jb3VudC0tO1xuJiM0MztcdFx0XHRzd2FwKHNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdLFxuJiM0MztcdFx0XHQgICAgIHNyby1cdTAwM2VhZGRyX2xpc3RbaV0pO1xuJiM0MztcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHR2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3Qoc2l6ZSwgZ2ZwKTtcbiYjNDM7XHRpZiAoIXZpcnQpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XHRwaHlzID0gdmlydF90b19waHlzKHZpcnQpO1xuJiM0MztcbiYjNDM7XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHtcbiYjNDM7XHRcdHBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzO1xuJiM0MztcbiYjNDM7XHRcdGlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgc2l6ZSwgXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XG4mIzQzO1x0XHRcdGlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSlcbiYjNDM7XHRcdFx0XHRmcmVlX3BhZ2VzX2V4YWN0KHZpcnQsIHNpemUpO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVOWElPO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0YWRkcl9yYW5nZSA9IHBoeXMgXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcbiYjNDM7XHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCB1bml0X3NpemUpO1xuJiM0MztcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCBjb3VudCk7XG4mIzQzO1x0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIHN0YXRlKTtcbiYjNDM7XG4mIzQzO1x0c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudF0gPSBhZGRyX3JhbmdlO1xuJiM0MztcbiYjNDM7b3V0OlxuJiM0MztcdHJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdCAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdKSwgMSxcbiYjNDM7XHRcdFx0ICAwLCBvdXRfcmVncyk7XG4mIzQzO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9ncmFudWxlcyA9IG91dF9yZWdzLVx1MDAzZWExO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplID0gZG9uYXRlZF9ncmFudWxlcyBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiYjNDM7XG4mIzQzO1x0aWYgKGRvbmF0ZWRfZ3JhbnVsZXMgPT0gMCkge1xuJiM0MztcdFx0LyogTm8gcGFnZXMgdXNlZCBieSB0aGUgUk1NICovXG4mIzQzO1x0XHRzcm8tXHUwMDNlYWRkcl9jb3VudCYjNDM7JiM0Mzs7XG4mIzQzO1x0fSBlbHNlIGlmIChkb25hdGVkX3NpemUgXHUwMDNjIHNpemUpIHtcbiYjNDM7XHRcdHBoeXMgPSBzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSBcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xuJiM0MztcbiYjNDM7XHRcdC8qIE5vdCBhbGwgZ3JhbnVsZXMgdXNlZCBieSB0aGUgUk1NLCBmcmVlIHRoZSByZW1haW5pbmcgcGFnZXMgKi9cbiYjNDM7XHRcdGZvciAobG9uZyBpID0gZG9uYXRlZF9zaXplOyBpIFx1MDAzYyBzaXplOyBpICYjNDM7PSBQQUdFX1NJWkUpIHtcbiYjNDM7XHRcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKVxuJiM0MztcdFx0XHRcdGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyAmIzQzOyBpKTtcbiYjNDM7XHRcdFx0ZWxzZVxuJiM0MztcdFx0XHRcdF9fZnJlZV9wYWdlKHBoeXNfdG9fcGFnZShwaHlzICYjNDM7IGkpKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuJiM0MztcdFx0XHRcdCAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcbiYjNDM7XHRcdFx0XHQgICAgZ2ZwX3QgZ2ZwKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZV9ieXRlcyA9IGRvbmF0ZV9yZXFfdG9fc2l6ZShkb25hdGVyZXEpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGZvdW5kID0gMDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFkZHJfbGlzdF9zdGFydCA9IHNyby1cdTAwM2VhZGRyX2NvdW50O1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBhZGRyX2xpc3Rfc3RhcnQgXHUwMDI2XHUwMDI2IGZvdW5kIFx1MDAzYyBjb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXHUwMDNlYWRkcl9saXN0W2ldO1xuJiM0MztcbiYjNDM7XHRcdGlmIChSTUlfQUREUl9SQU5HRV9TSVpFKGVudHJ5KSA9PSB1bml0X3NpemUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IDEgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpID09IHN0YXRlKSB7XG4mIzQzO1x0XHRcdGFkZHJfbGlzdF9zdGFydC0tO1xuJiM0MztcdFx0XHRzd2FwKHNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSxcbiYjNDM7XHRcdFx0ICAgICBzcm8tXHUwMDNlYWRkcl9saXN0W2ldKTtcbiYjNDM7XHRcdFx0Zm91bmQmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRpLS07XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIGNvdW50IC0gZm91bmQpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoZm91bmQgXHUwMDNjIGNvdW50KSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XG4mIzQzO1x0XHR2b2lkICp2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3QodW5pdF9zaXplX2J5dGVzLCBnZnApO1xuJiM0MztcdFx0cGh5c19hZGRyX3QgcGh5cztcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIXZpcnQpXG4mIzQzO1x0XHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcbiYjNDM7XHRcdHBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7XG4mIzQzO1x0XHRcdHBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzO1xuJiM0MztcbiYjNDM7XHRcdFx0aWYgKHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCB1bml0X3NpemVfYnl0ZXMsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XG4mIzQzO1x0XHRcdFx0aWYgKCFybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBkZWxlZ2F0ZWRfcGh5cyAtIHBoeXMpKVxuJiM0MztcdFx0XHRcdFx0ZnJlZV9wYWdlc19leGFjdCh2aXJ0LCB1bml0X3NpemVfYnl0ZXMpO1xuJiM0MztcdFx0XHRcdHJldHVybiAtRU5YSU87XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRhZGRyX3JhbmdlID0gcGh5cyBcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xuJiM0MztcdFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTSywgXHUwMDI2YWRkcl9yYW5nZSwgdW5pdF9zaXplKTtcbiYjNDM7XHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCAxKTtcbiYjNDM7XHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCBzdGF0ZSk7XG4mIzQzO1xuJiM0MztcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudCYjNDM7JiM0MztdID0gYWRkcl9yYW5nZTtcbiYjNDM7XHRcdGZvdW5kJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdCAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSksXG4mIzQzO1x0XHRcdCAgZm91bmQsIDAsIG91dF9yZWdzKTtcbiYjNDM7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBkb25hdGVkX2dyYW51bGVzID0gb3V0X3JlZ3MtXHUwMDNlYTE7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBncmFudWxlc19wZXJfdW5pdCA9IHVuaXRfc2l6ZV9ieXRlcyBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGNvbnN1bWVkX3VuaXRzO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBSTU0gc2hvdWxkbiYjMzk7dCByZXBvcnQgbW9yZSBncmFudWxlcyB0aGFuIHdlIHByb3ZpZGVkLCBidXQgY2xhbXBcbiYjNDM7XHQgKiBqdXN0IGluIGNhc2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKFdBUk5fT05fT05DRShkb25hdGVkX2dyYW51bGVzIFx1MDAzZSBmb3VuZCAqIGdyYW51bGVzX3Blcl91bml0KSlcbiYjNDM7XHRcdGRvbmF0ZWRfZ3JhbnVsZXMgPSBmb3VuZCAqIGdyYW51bGVzX3Blcl91bml0O1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBSTU0gcmVwb3J0cyB0aGUgY29uc3VtZWQgbWVtb3J5IGluIHRlcm1zIG9mIGdyYW51bGVzLCBidXQgd2VcbiYjNDM7XHQgKiB0cmFjayBpbiB0aGUgYWRkcmVzcyBsaXN0cyBpbiB1bml0LXNpemVkIHJhbmdlcy4gU28gZGl2aWRlIHRvIGdldFxuJiM0MztcdCAqIHRoZSBudW1iZXIgb2YgKGNvbXBsZXRlKSBjb25zdW1lZCB1bml0cy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRjb25zdW1lZF91bml0cyA9IGRvbmF0ZWRfZ3JhbnVsZXMgLyBncmFudWxlc19wZXJfdW5pdDtcbiYjNDM7XHRpZiAoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl91bml0KSB7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogQSB1bml0IGhhcyBiZWVuIHBhcnRpYWxseSBjb25zdW1lZCwgdGhlIHN0YXJ0IGlzIG93bmVkIGJ5XG4mIzQzO1x0XHQgKiB0aGUgUk1NLCB0aGUgdGFpbCBpcyBvd25lZCBieSB0aGUgaG9zdFxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGVudHJ5ID1cbiYjNDM7XHRcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgJiM0MzsgY29uc3VtZWRfdW5pdHNdO1xuJiM0MztcdFx0cGh5c19hZGRyX3QgcGh5cyA9IFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBkb25hdGVkX3NpemUgPVxuJiM0MztcdFx0XHQoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl91bml0KSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiYjNDM7XG4mIzQzO1x0XHQvKiBGcmVlIHRoZSB0YWlsIGJhY2sgKi9cbiYjNDM7XHRcdGZvciAodW5zaWduZWQgbG9uZyBpID0gZG9uYXRlZF9zaXplOyBpIFx1MDAzYyB1bml0X3NpemVfYnl0ZXM7XG4mIzQzO1x0XHQgICAgIGkgJiM0Mzs9IFBBR0VfU0laRSkge1xuJiM0MztcdFx0XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpXG4mIzQzO1x0XHRcdFx0ZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzICYjNDM7IGkpO1xuJiM0MztcdFx0XHRlbHNlXG4mIzQzO1x0XHRcdFx0X19mcmVlX3BhZ2UocGh5c190b19wYWdlKHBoeXMgJiM0MzsgaSkpO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBUaGlzIHVuaXQgaXMgbm93IGZ1bGx5ICYjMzk7Y29uc3VtZWQmIzM5OyAoZWl0aGVyIGhlbGQgYnkgdGhlIFJNTSBvclxuJiM0MztcdFx0ICogZnJlZWQpXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGNvbnN1bWVkX3VuaXRzJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEtlZXAganVzdCB0aGUgdW5pdHMgdGhlIFJNTSBkaWRuJiMzOTt0IHVzZSBpbiBhZGRyX2xpc3QgKi9cbiYjNDM7XHRmb3IgKHVuc2lnbmVkIGxvbmcgaSA9IGNvbnN1bWVkX3VuaXRzOyBpIFx1MDAzYyBmb3VuZDsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRzcm8tXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCAmIzQzOyBpIC0gY29uc3VtZWRfdW5pdHNdID1cbiYjNDM7XHRcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgJiM0MzsgaV07XG4mIzQzO1xuJiM0MztcdHNyby1cdTAwM2VhZGRyX2NvdW50IC09IGNvbnN1bWVkX3VuaXRzO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfc3JvX2RvbmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHQgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSxcbiYjNDM7XHRcdFx0ICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzLFxuJiM0MztcdFx0XHQgIGdmcF90IGdmcClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XG4mIzQzO1xuJiM0MztcdGlmIChXQVJOX09OX09OQ0UoIWNvdW50KSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRpZiAoUk1JX0RPTkFURV9DT05USUcoZG9uYXRlcmVxKSkge1xuJiM0MztcdFx0cmV0dXJuIHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzcm8sIHNyb19oYW5kbGUsIGRvbmF0ZXJlcSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgcmVncywgZ2ZwKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0cmV0dXJuIHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzcm8sIHNyb19oYW5kbGUsIGRvbmF0ZXJlcSxcbiYjNDM7XHRcdFx0XHRcdFx0cmVncywgZ2ZwKTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcm1pX3Nyb19yZWNsYWltKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4mIzQzO1x0XHRcdCAgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGNhcGFjaXR5O1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgMSk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJtaV9zcm9fZnJlZShzcm8pO1xuJiM0MztcbiYjNDM7XHRjYXBhY2l0eSA9IFJNSV9NQVhfQUREUl9MSVNUIC0gc3JvLVx1MDAzZWFkZHJfY291bnQ7XG4mIzQzO1xuJiM0MztcdHJtaV9vcF9tZW1fcmVjbGFpbShzcm9faGFuZGxlLFxuJiM0MztcdFx0XHQgICB2aXJ0X3RvX3BoeXMoXHUwMDI2c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudF0pLFxuJiM0MztcdFx0XHQgICBjYXBhY2l0eSwgb3V0X3JlZ3MpO1xuJiM0MztcbiYjNDM7XHRpZiAoV0FSTl9PTl9PTkNFKG91dF9yZWdzLVx1MDAzZWExIFx1MDAzZSBjYXBhY2l0eSkpXG4mIzQzO1x0XHRvdXRfcmVncy1cdTAwM2VhMSA9IGNhcGFjaXR5O1xuJiM0MztcbiYjNDM7XHRzcm8tXHUwMDNlYWRkcl9jb3VudCAmIzQzOz0gb3V0X3JlZ3MtXHUwMDNlYTE7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuJiM0Mzt7XG4mIzQzO1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIHNyby1cdTAwM2VhZGRyX2NvdW50OyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9IHNyby1cdTAwM2VhZGRyX2xpc3RbaV07XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGFkZHIgPSBSTUlfQUREUl9SQU5HRV9BRERSKGVudHJ5KTtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplID0gUk1JX0FERFJfUkFOR0VfU0laRShlbnRyeSk7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KTtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgc2l6ZSA9IGRvbmF0ZV9yZXFfdG9fc2l6ZSh1bml0X3NpemUpICogY291bnQ7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7XG4mIzQzO1x0XHRcdGlmIChXQVJOX09OX09OQ0Uocm1pX3VuZGVsZWdhdGVfcmFuZ2UoYWRkciwgc2l6ZSkpKSB7XG4mIzQzO1x0XHRcdFx0LyogTGVhayB0aGUgcGFnZXMgKi9cbiYjNDM7XHRcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fVxuJiM0MztcdFx0ZnJlZV9wYWdlc19leGFjdChwaHlzX3RvX3ZpcnQoYWRkciksIHNpemUpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0c3JvLVx1MDAzZWFkZHJfY291bnQgPSAwO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fZnJlZSk7XG4mIzQzO1xuJiM0Mzt1bnNpZ25lZCBsb25nIHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sIGdmcF90IGdmcClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZTtcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzID0gXHUwMDI2c3JvLVx1MDAzZXJlZ3M7XG4mIzQzO1xuJiM0MztcdHJtaV9zbWNjY19pbnZva2UocmVncywgcmVncyk7XG4mIzQzO1xuJiM0MztcdHNyb19oYW5kbGUgPSByZWdzLVx1MDAzZWExO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCkgPT0gUk1JX0lOQ09NUExFVEUpIHtcbiYjNDM7XHRcdGJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLVx1MDAzZWEwKTtcbiYjNDM7XHRcdGludCByZXQgPSAwO1xuJiM0MztcbiYjNDM7XHRcdHN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy1cdTAwM2VhMCkpIHtcbiYjNDM7XHRcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcbiYjNDM7XHRcdFx0cm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLFxuJiM0MztcdFx0XHRcdFx0cmVncyk7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0Y2FzZSBSTUlfT1BfTUVNX1JFUV9ET05BVEU6XG4mIzQzO1x0XHRcdHJldCA9IHJtaV9zcm9fZG9uYXRlKHNybywgc3JvX2hhbmRsZSwgcmVncy1cdTAwM2VhMiwgcmVncyxcbiYjNDM7XHRcdFx0XHRcdCAgICAgZ2ZwKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU06XG4mIzQzO1x0XHRcdHJldCA9IHJtaV9zcm9fcmVjbGFpbShzcm8sIHNyb19oYW5kbGUsIHJlZ3MpO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGRlZmF1bHQ6XG4mIzQzO1x0XHRcdHJldCA9IFdBUk5fT05fT05DRSgxKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0aWYgKHJldCkge1xuJiM0MztcdFx0XHRpZiAoY2FuX2NhbmNlbClcbiYjNDM7XHRcdFx0XHRybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpO1xuJiM0MztcbiYjNDM7XHRcdFx0aWYgKFdBUk5fT05fT05DRShSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVx1MDAzZWEwKSAhPSBSTUlfSU5DT01QTEVURSkpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiByZWdzLVx1MDAzZWEwO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKTtcbiYjNDM7XG4mIzQzOy8qIEZvciBSTUkgY29tbWFuZHMgdGhhdCBhcmUgc3RhdGVmdWwgYnV0IG5vdCBtZW1vcnktdHJhbnNmZXJyaW5nICovXG4mIzQzO3Vuc2lnbmVkIGxvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHNyb19oYW5kbGU7XG4mIzQzO1xuJiM0MztcdHJtaV9zbWNjY19pbnZva2UocmVncywgcmVncyk7XG4mIzQzO1xuJiM0MztcdHNyb19oYW5kbGUgPSByZWdzLVx1MDAzZWExO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCkgPT0gUk1JX0lOQ09NUExFVEUpIHtcbiYjNDM7XHRcdGJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLVx1MDAzZWEwKTtcbiYjNDM7XG4mIzQzO1x0XHRzd2l0Y2ggKFJNSV9SRVRVUk5fTUVNUkVRKHJlZ3MtXHUwMDNlYTApKSB7XG4mIzQzO1x0XHRjYXNlIFJNSV9PUF9NRU1fUkVRX05PTkU6XG4mIzQzO1x0XHRcdHJtaV9vcF9jb250aW51ZShzcm9faGFuZGxlLCBSTUlfQ09OVElOVUVfS0VFUF9HT0lORyxcbiYjNDM7XHRcdFx0XHRcdHJlZ3MpO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGRlZmF1bHQ6XG4mIzQzO1x0XHRcdFdBUk5fT05fT05DRSgxKTtcbiYjNDM7XHRcdFx0aWYgKCFjYW5fY2FuY2VsKVxuJiM0MztcdFx0XHRcdHJldHVybiByZWdzLVx1MDAzZWEwO1xuJiM0MztcbiYjNDM7XHRcdFx0cm1pX29wX2NhbmNlbChzcm9faGFuZGxlLCByZWdzKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiByZWdzLVx1MDAzZWEwO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fZXhlY3V0ZSk7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9jaGVja192ZXJzaW9uKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XG4mIzQzO1x0dW5zaWduZWQgc2hvcnQgdmVyc2lvbl9tYWpvciwgdmVyc2lvbl9taW5vcjtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGhvc3RfdmVyc2lvbiA9IFJNSV9BQklfVkVSU0lPTihSTUlfQUJJX01BSk9SX1ZFUlNJT04sXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgUk1JX0FCSV9NSU5PUl9WRVJTSU9OKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFhNjRwZnIwID0gcmVhZF9zYW5pdGlzZWRfZnRyX3JlZyhTWVNfSURfQUE2NFBGUjBfRUwxKTtcbiYjNDM7XG4mIzQzO1x0LyogSWYgUk1FIGlzbiYjMzk7dCBzdXBwb3J0ZWQsIHRoZW4gUk1JIGNhbiYjMzk7dCBiZSAqL1xuJiM0MztcdGlmIChjcHVpZF9mZWF0dXJlX2V4dHJhY3RfdW5zaWduZWRfZmllbGQoYWE2NHBmcjAsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQpID09IDApXG4mIzQzO1x0XHRyZXR1cm4gLUVOWElPO1xuJiM0MztcbiYjNDM7XHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1ZFUlNJT04sIGhvc3RfdmVyc2lvbiwgXHUwMDI2cmVzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJlcy5hMCA9PSBTTUNDQ19SRVRfTk9UX1NVUFBPUlRFRClcbiYjNDM7XHRcdHJldHVybiAtRU5YSU87XG4mIzQzO1xuJiM0MztcdHZlcnNpb25fbWFqb3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHJlcy5hMSk7XG4mIzQzO1x0dmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmExKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJlcy5hMCAhPSBSTUlfU1VDQ0VTUykge1xuJiM0MztcdFx0dW5zaWduZWQgc2hvcnQgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3I7XG4mIzQzO1xuJiM0MztcdFx0aGlnaF92ZXJzaW9uX21ham9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUihyZXMuYTIpO1xuJiM0MztcdFx0aGlnaF92ZXJzaW9uX21pbm9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NSU5PUihyZXMuYTIpO1xuJiM0MztcbiYjNDM7XHRcdHByX2VycihcJiMzNDtVbnN1cHBvcnRlZCBSTUkgQUJJICh2JWQuJWQgLSB2JWQuJWQpIHdlIHdhbnQgdiVkLiVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IsXG4mIzQzO1x0XHQgICAgICAgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3IsXG4mIzQzO1x0XHQgICAgICAgUk1JX0FCSV9NQUpPUl9WRVJTSU9OLFxuJiM0MztcdFx0ICAgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7XG4mIzQzO1x0XHRyZXR1cm4gLUVOWElPO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cHJfaW5mbyhcJiMzNDtSTUkgQUJJIHZlcnNpb24gJWQuJWRcXG5cJiMzNDssIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfcmVhZF9mZWF0dXJlcyh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBTaW5jZSB3ZSYjMzk7dmUgbmVnb3RpYXRlZCBhIGNvbXBhdGlibGUgdmVyc2lvbiB0aGVzZSBmZWF0dXJlIHJlZ2lzdGVyc1xuJiM0MztcdCAqIHNob3VsZCBhbHdheXMgYmUgYXZhaWxhYmxlXG4mIzQzO1x0ICovXG4mIzQzO1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIFJNSV9GRUFUX1JFR19DT1VOVDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChXQVJOX09OKHJtaV9mZWF0dXJlcyhpLCBcdTAwMjZybWlfZmVhdF9yZWdfY2FjaGVbaV0pKSlcbiYjNDM7XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfY29uZmlndXJlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHJldDtcbiYjNDM7XHRzdHJ1Y3Qgcm1tX2NvbmZpZyAqY29uZmlnIF9fZnJlZShmcmVlX3BhZ2UpID0gKHN0cnVjdCBybW1fY29uZmlnICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpO1xuJiM0MztcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8gX19mcmVlKGtmcmVlKSA9IChzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqKWttYWxsb2Nfb2JqKCpzcm8pO1xuJiM0MztcbiYjNDM7XHRpZiAoIWNvbmZpZyB8fCAhc3JvKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAoUEFHRV9TSVpFKSB7XG4mIzQzO1x0Y2FzZSBTWl80SzpcbiYjNDM7XHRcdGNvbmZpZy1cdTAwM2VybWlfZ3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV80S0I7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRjYXNlIFNaXzE2SzpcbiYjNDM7XHRcdGNvbmZpZy1cdTAwM2VybWlfZ3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV8xNktCO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBTWl82NEs6XG4mIzQzO1x0XHRjb25maWctXHUwMDNlcm1pX2dyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNjRLQjtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGRlZmF1bHQ6XG4mIzQzO1x0XHRCVUlMRF9CVUcoKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogRm9yIG5vdyB3ZSBzZXQgdGhlIHRyYWNraW5nX3JlZ2lvbl9zaXplIHRvIDAgd2hpY2ggaXMgdGhlIG9ubHkgb3B0aW9uXG4mIzQzO1x0ICogZm9yIDRLQiBQQUdFX1NJWkUgKDFHQiBmb3IgNEtCIFBBR0VfU0laRSwgMzJNQi81MTJNQiBmb3IgMTZLQi82NEtCKS5cbiYjNDM7XHQgKiBUT0RPOiBTdXBwb3J0IG90aGVyIHRyYWNraW5nIHNpemVzIHZpYSBLY29uZmlnIG9wdGlvbiBmb3Igb3RoZXJcbiYjNDM7XHQgKiBQQUdFX1NJWkVTXG4mIzQzO1x0ICovXG4mIzQzO1x0Y29uZmlnLVx1MDAzZXRyYWNraW5nX3JlZ2lvbl9zaXplID0gMDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX3JtbV9jb25maWdfc2V0KHZpcnRfdG9fcGh5cyhjb25maWcpKTtcbiYjNDM7XHRpZiAocmV0KSB7XG4mIzQzO1x0XHRwcl9lcnIoXCYjMzQ7Uk1NIGNvbmZpZyBzZXQgZmFpbGVkXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX3JtbV9hY3RpdmF0ZShzcm8pO1xuJiM0MztcdGlmIChyZXQpIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDtSTU0gYWN0aXZhdGUgZmFpbGVkXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiAtRU5YSU87XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogTWFrZSBzdXJlIHRoZSBhcmVhIGlzIHRyYWNrZWQgYnkgUk1NIGF0IEZJTkUgZ3JhbnVsYXJpdHkuXG4mIzQzOyAqIFdlIGRvIG5vdCBzdXBwb3J0IGNoYW5naW5nIHRoZSB0cmFja2luZyB5ZXQuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IHJtaV92ZXJpZnlfbWVtb3J5X3RyYWNraW5nKHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpXG4mIzQzO3tcbiYjNDM7XHR3aGlsZSAoc3RhcnQgXHUwMDNjIGVuZCkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyByZXQsIGNhdGVnb3J5LCBzdGF0ZSwgbmV4dDtcbiYjNDM7XG4mIzQzO1x0XHRyZXQgPSBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQoc3RhcnQsIGVuZCwgXHUwMDI2Y2F0ZWdvcnksIFx1MDAyNnN0YXRlLCBcdTAwMjZuZXh0KTtcbiYjNDM7XHRcdGlmIChyZXQgIT0gUk1JX1NVQ0NFU1MgfHxcbiYjNDM7XHRcdCAgICBzdGF0ZSAhPSBSTUlfVFJBQ0tJTkdfRklORSB8fFxuJiM0MztcdFx0ICAgIGNhdGVnb3J5ICE9IFJNSV9NRU1fQ0FURUdPUllfQ09OVkVOVElPTkFMKSB7XG4mIzQzO1x0XHRcdC8qIFRPRE86IFNldCBncmFudWxlIHRyYWNraW5nIGluIHRoaXMgY2FzZSAqL1xuJiM0MztcdFx0XHRwcl9lcnIoXCYjMzQ7R3JhbnVsZSB0cmFja2luZyBmb3IgcmVnaW9uIGlzbiYjMzk7dCBmaW5lL2NvbnZlbnRpb25hbDogJWxseFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgIHN0YXJ0KTtcbiYjNDM7XHRcdFx0cmV0dXJuIC1FTk9ERVY7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRzdGFydCA9IG5leHQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfY3JlYXRlX2dwdHMocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm87XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBsMGdwdF9zejtcbiYjNDM7XG4mIzQzO1x0c3JvID0ga21hbGxvY19vYmooKnNybywgR0ZQX0tFUk5FTCk7XG4mIzQzO1x0aWYgKCFzcm8pXG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XG4mIzQzO1x0bDBncHRfc3ogPSAxVUwgXHUwMDNjXHUwMDNjICgzMCAmIzQzOyBGSUVMRF9HRVQoUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9MMEdQVFNaLFxuJiM0MztcdFx0XHRcdFx0ICBybWlfZmVhdF9yZWcoMSkpKTtcbiYjNDM7XHRzdGFydCA9IEFMSUdOX0RPV04oc3RhcnQsIGwwZ3B0X3N6KTtcbiYjNDM7XHRlbmQgPSBBTElHTihlbmQsIGwwZ3B0X3N6KTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKHN0YXJ0IFx1MDAzYyBlbmQpIHtcbiYjNDM7XHRcdGludCByZXQgPSBybWlfZ3B0X2wxX2NyZWF0ZShzdGFydCwgc3JvLCBHRlBfS0VSTkVMKTtcbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogTWFrZSBzdXJlIHRoZSBMMSBHUFQgdGFibGVzIGFyZSBjcmVhdGVkIGZvciB0aGUgcmVnaW9uLlxuJiM0MztcdFx0ICogUk1JX0VSUk9SX0dQVCBpbmRpY2F0ZXMgdGhlIEwxIHRhYmxlIGFscmVhZHkgZXhpc3RzLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAocmV0ICE9IFJNSV9TVUNDRVNTIFx1MDAyNlx1MDAyNiBSTUlfUkVUVVJOX1NUQVRVUyhyZXQpICE9IFJNSV9FUlJPUl9HUFQpIHtcbiYjNDM7XHRcdFx0cHJfZXJyKFwmIzM0O0dQVCBMZXZlbDEgdGFibGUgbWlzc2luZyBmb3IgJWxseFxcblwmIzM0Oywgc3RhcnQpO1xuJiM0MztcdFx0XHRrZnJlZShzcm8pO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHN0YXJ0ICYjNDM7PSBsMGdwdF9zejtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtmcmVlKHNybyk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcm1pX2luaXRfbWV0YWRhdGEodm9pZClcbiYjNDM7e1xuJiM0MztcdHBoeXNfYWRkcl90IHN0YXJ0LCBlbmQ7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcjtcbiYjNDM7XG4mIzQzO1x0Zm9yX2VhY2hfbWVtX3JlZ2lvbihyKSB7XG4mIzQzO1x0XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRcdHN0YXJ0ID0gbWVtYmxvY2tfcmVnaW9uX21lbW9yeV9iYXNlX3BmbihyKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiYjNDM7XHRcdGVuZCA9IG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfZW5kX3BmbihyKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiYjNDM7XHRcdHJldCA9IHJtaV92ZXJpZnlfbWVtb3J5X3RyYWNraW5nKHN0YXJ0LCBlbmQpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdHJldCA9IHJtaV9jcmVhdGVfZ3B0cyhzdGFydCwgZW5kKTtcbiYjNDM7XHRcdGlmIChyZXQpXG4mIzQzO1x0XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7Ym9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gYXJtNjRfcm1pX2lzX2F2YWlsYWJsZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBfX2luaXQgYXJtNjRfaW5pdF9ybWkodm9pZClcbiYjNDM7e1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdC8qIENvbnRpbnVlIHdpdGhvdXQgcmVhbG0gc3VwcG9ydCBpZiB3ZSBjYW4mIzM5O3QgYWdyZWUgb24gYSB2ZXJzaW9uICovXG4mIzQzO1x0cmV0ID0gcm1pX2NoZWNrX3ZlcnNpb24oKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX3JlYWRfZmVhdHVyZXMoKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX2NvbmZpZ3VyZSgpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfaW5pdF9tZXRhZGF0YSgpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRhcm02NF9ybWlfaXNfYXZhaWxhYmxlID0gdHJ1ZTtcbiYjNDM7XHRwcl9pbmZvKFwmIzM0O1JNSSBjb25maWd1cmVkXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIE5vdGUgYXJtNjRfaW5pdF9ybWkoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUga3ZtX2luaXRfcm1pKCkgb3RoZXJ3aXNlIEtWTVxuJiM0MzsgKiB3aWxsIG5vdCBzdXBwb3J0IHJlYWxtIGd1ZXN0cy4gc3Vic3lzX2luaXRjYWxsKCkgaXMgY2FsbGVkIGJlZm9yZVxuJiM0MzsgKiBtb2R1bGVfaW5pdCgpICh1c2VkIGZvciBLVk0pIHNvIHRoaXMgaXMgT0suXG4mIzQzOyAqL1xuJiM0MztzdWJzeXNfaW5pdGNhbGwoYXJtNjRfaW5pdF9ybWkpO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmggYi9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjEzODk4M2FiNGUzYzIyXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oXG5AQCAtMCwwICYjNDM7MSwyMDUgQEBcbiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbiYjNDM7LypcbiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDI2IEFSTSBMdGQuXG4mIzQzOyAqL1xuJiM0MztcbiYjNDM7I2lmbmRlZiBfX0xJTlVYX0FSTV9STUlfQ01EU19IX1xuJiM0MzsjZGVmaW5lIF9fTElOVVhfQVJNX1JNSV9DTURTX0hfXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9hcm0tc21jY2Mtcm1pLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYnVnLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvdHlwZXMuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYXNtL3BhZ2UuaFx1MDAzZVxuJiM0MztcbiYjNDM7c3RydWN0IHJ0dF9lbnRyeSB7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB3YWxrX2xldmVsO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZGVzYztcbiYjNDM7XHRpbnQgc3RhdGU7XG4mIzQzO1x0aW50IHJpcGFzO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfTUFYX0FERFJfTElTVFx0MjU2XG4mIzQzO1xuJiM0MztzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSB7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgYWRkcl9jb3VudDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFkZHJfbGlzdFtSTUlfTUFYX0FERFJfTElTVF07XG4mIzQzO307XG4mIzQzO1xuJiM0Mzt1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZyh1bnNpZ25lZCBsb25nIGlkKTtcbiYjNDM7XG4mIzQzO2ludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplLFxuJiM0MztcdFx0ICAgICAgIHBoeXNfYWRkcl90ICpvdXRfcGh5cyk7XG4mIzQzO2ludCBybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUpO1xuJiM0MztpbnQgZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzX2FkZHJfdCBwaHlzKTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9kZWxlZ2F0ZV9wYWdlKHBoeXNfYWRkcl90IHBoeXMpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIFBBR0VfU0laRSwgTlVMTCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBQQUdFX1NJWkUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mztib29sIGlzX3JtaV9hdmFpbGFibGUodm9pZCk7XG4mIzQzO1xuJiM0Mzt1bnNpZ25lZCBsb25nIHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sIGdmcF90IGdmcCk7XG4mIzQzO3ZvaWQgcm1pX3Nyb19mcmVlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pO1xuJiM0Mzt1bnNpZ25lZCBsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKTtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIGdmcCwgLi4uKSAoe1x0XHRcdFx0XFxcbiYjNDM7XHRzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqX19zcm8gPSAoc3JvKTtcdFx0XHRcdFxcXG4mIzQzO1x0Kl9fc3JvID0gKHN0cnVjdCBybWlfc3JvX3N0YXRlKXsgLnJlZ3MgPSB7X19WQV9BUkdTX199IH07XHRcXFxuJiM0MztcdGludCBfX3JldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKF9fc3JvLCBnZnApO1x0XHRcXFxuJiM0MztcdHJtaV9zcm9fZnJlZShfX3Nybyk7XHRcdFx0XHRcdFx0XFxcbiYjNDM7XHRfX3JldDtcdFx0XHRcdFx0XHRcdFx0XFxcbiYjNDM7fSlcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcm1tX2NvbmZpZ19zZXQoKSAtIENvbmZpZ3VyZSB0aGUgUk1NXG4mIzQzOyAqIEBjZmdfcHRyOiBQQSBvZiBhIHN0cnVjdCBybW1fY29uZmlnXG4mIzQzOyAqXG4mIzQzOyAqIFNldHMgY29uZmlndXJhdGlvbiBvcHRpb25zIG9uIHRoZSBSTU0uXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcm1tX2NvbmZpZ19zZXQodW5zaWduZWQgbG9uZyBjZmdfcHRyKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xuJiM0MztcbiYjNDM7XHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1JNTV9DT05GSUdfU0VULCBjZmdfcHRyLCBcdTAwMjZyZXMpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmVzLmEwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3JtbV9hY3RpdmF0ZSgpIC0gQWN0aXZhdGUgdGhlIFJNTVxuJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3JtbV9hY3RpdmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JNTV9BQ1RJVkFURSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQoKSAtIEdldCBjb25maWd1cmF0aW9uIG9mIGEgR3JhbnVsZSB0cmFja2luZyByZWdpb25cbiYjNDM7ICogQHN0YXJ0OiBCYXNlIFBBIG9mIHRoZSB0cmFja2luZyByZWdpb25cbiYjNDM7ICogQGVuZDogRW5kIG9mIHRoZSBQQSByZWdpb25cbiYjNDM7ICogQG91dF9jYXRlZ29yeTogTWVtb3J5IGNhdGVnb3J5XG4mIzQzOyAqIEBvdXRfc3RhdGU6IFRyYWNraW5nIHJlZ2lvbiBzdGF0ZVxuJiM0MzsgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBtZW1vcnkgcmVnaW9uXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQodW5zaWduZWQgbG9uZyBzdGFydCxcbiYjNDM7XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgZW5kLFxuJiM0MztcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X2NhdGVnb3J5LFxuJiM0MztcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3N0YXRlLFxuJiM0MztcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbiYjNDM7XG4mIzQzO1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX0dFVCwgc3RhcnQsIGVuZCwgXHUwMDI2cmVzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKG91dF9jYXRlZ29yeSlcbiYjNDM7XHRcdCpvdXRfY2F0ZWdvcnkgPSByZXMuYTE7XG4mIzQzO1x0aWYgKG91dF9zdGF0ZSlcbiYjNDM7XHRcdCpvdXRfc3RhdGUgPSByZXMuYTI7XG4mIzQzO1x0aWYgKG91dF90b3ApXG4mIzQzO1x0XHQqb3V0X3RvcCA9IHJlcy5hMztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJlcy5hMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ncHRfbDFfY3JlYXRlKCkgLSBDcmVhdGUgYSBMZXZlbCAxIEdQVFxuJiM0MzsgKiBAYWRkcjogQmFzZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lvbiBkZXNjcmliZWQgYnkgdGhlIEwxR1BUXG4mIzQzOyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXG4mIzQzOyAqIEBnZnA6IEFsbG9jYXRpb24gZmxhZ3MgZm9yIFNSTyBtZW1vcnkgZG9uYXRpb24gcmVxdWVzdHNcbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ncHRfbDFfY3JlYXRlKHVuc2lnbmVkIGxvbmcgYWRkcixcbiYjNDM7XHRcdFx0XHQgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyxcbiYjNDM7XHRcdFx0XHQgICAgZ2ZwX3QgZ2ZwKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBnZnAsIFNNQ19STUlfR1BUX0wxX0NSRUFURSwgYWRkcik7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfZmVhdHVyZXMoKSAtIFJlYWQgZmVhdHVyZSByZWdpc3RlclxuJiM0MzsgKiBAaW5kZXg6IEZlYXR1cmUgcmVnaXN0ZXIgaW5kZXhcbiYjNDM7ICogQG91dDogRmVhdHVyZSByZWdpc3RlciB2YWx1ZSBpcyB3cml0dGVuIHRvIHRoaXMgcG9pbnRlclxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2ZlYXR1cmVzKHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgKm91dClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbiYjNDM7XG4mIzQzO1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9GRUFUVVJFUywgaW5kZXgsIFx1MDAyNnJlcyk7XG4mIzQzO1xuJiM0MztcdGlmIChvdXQpXG4mIzQzO1x0XHQqb3V0ID0gcmVzLmExO1xuJiM0MztcdHJldHVybiByZXMuYTA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSgpIC0gRGVsZWdhdGUgZ3JhbnVsZXNcbiYjNDM7ICogQGJhc2U6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG9mIHRoZSByYW5nZVxuJiM0MzsgKiBAdG9wOiBQQSBvZiB0aGUgZmlyc3QgZ3JhbnVsZSBhZnRlciB0aGUgcmFuZ2VcbiYjNDM7ICogQG91dF90b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG5vdCBkZWxlZ2F0ZWRcbiYjNDM7ICpcbiYjNDM7ICogRGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlIGZvciB1c2UgYnkgdGhlIHJlYWxtIHdvcmxkLiBJZiB0aGUgZW50aXJlIHJhbmdlXG4mIzQzOyAqIHdhcyBkZWxlZ2F0ZWQgdGhlbiBAb3V0X3RvcCA9PSBAdG9wLCBvdGhlcndpc2UgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbiYjNDM7ICogYWdhaW4gd2l0aCBAYmFzZSA9PSBAb3V0X3RvcC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4mIzQzO1x0XHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX0dSQU5VTEVfUkFOR0VfREVMRUdBVEUsIGJhc2UsIHRvcFxuJiM0MztcdH07XG4mIzQzO1x0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKG91dF90b3ApXG4mIzQzO1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKCkgLSBVbmRlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZXNcbiYjNDM7ICogQGJhc2U6IEJhc2UgUEEgb2YgdGhlIHRhcmdldCByYW5nZVxuJiM0MzsgKiBAdG9wOiBUb3AgUEEgb2YgdGhlIHRhcmdldCByYW5nZVxuJiM0MzsgKiBAb3V0X3RvcDogUmV0dXJucyB0aGUgdG9wIFBBIG9mIHJhbmdlIHdob3NlIHN0YXRlIGlzIHVuZGVsZWdhdGVkXG4mIzQzOyAqXG4mIzQzOyAqIFVuZGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlcyB0byBhbGxvdyB1c2UgYnkgdGhlIG5vcm1hbCB3b3JsZC4gV2lsbCBmYWlsIGlmXG4mIzQzOyAqIHRoZSBncmFudWxlcyBhcmUgaW4gdXNlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfR1JBTlVMRV9SQU5HRV9VTkRFTEVHQVRFLCBiYXNlLCB0b3BcbiYjNDM7XHR9O1xuJiM0MztcdGludCByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChvdXRfdG9wKVxuJiM0MztcdFx0Km91dF90b3AgPSByZWdzLmExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsjZW5kaWZcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaCBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLmM5NjVlODg2NzUxOGYzXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaFxuQEAgLTAsMCAmIzQzOzEsNDk5IEBAXG4mIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4mIzQzOy8qXG4mIzQzOyAqIENvcHlyaWdodCAoQykgMjAyMy0yMDI2IEFSTSBMdGQuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSB2YWx1ZXMgYW5kIHN0cnVjdHVyZXMgaW4gdGhpcyBmaWxlIGFyZSBmcm9tIHRoZSBSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3JcbiYjNDM7ICogc3BlY2lmaWNhdGlvbiAoREVOMDEzNykgdmVyc2lvbiAyLjAtYmV0MjpcbiYjNDM7ICogaHR0cHM6Ly9kZXZlbG9wZXIuYXJtLmNvbS9kb2N1bWVudGF0aW9uL2RlbjAxMzcvMi0wYmV0Mi9cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaWZuZGVmIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IX1xuJiM0MzsjZGVmaW5lIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IX1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYXJtLXNtY2NjLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYml0ZmllbGQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYnVpbGRfYnVnLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc2l6ZXMuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYXNtL3BhZ2UuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20vc3lzcmVnLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9DQUxMKGZ1bmMpXHRcdFx0XHRcXFxuJiM0MztcdEFSTV9TTUNDQ19DQUxMX1ZBTChBUk1fU01DQ0NfRkFTVF9DQUxMLFx0XHRcXFxuJiM0MztcdFx0XHQgICBBUk1fU01DQ0NfU01DXzY0LFx0XHRcXFxuJiM0MztcdFx0XHQgICBBUk1fU01DQ0NfT1dORVJfU1RBTkRBUkQsXHRcXFxuJiM0MztcdFx0XHQgICAoZnVuYykpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkVSU0lPTlx0XHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1MClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9NQVBfSU5JVFx0XHRTTUNfUk1JX0NBTEwoMHgwMTUzKVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQUxNX0FDVElWQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1NylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQUxNX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNTgpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1OSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQ19DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTVhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVDX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTViKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVDX0VOVEVSXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1YylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTVkKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTVlKVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9SRUFEX0VOVFJZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2MSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1ZBTElEQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxNjMpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU0NJX0NPTVBMRVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2NClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0ZFQVRVUkVTXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2NSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9GT0xEXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2NilcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfSU5JVF9SSVBBU1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjgpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1JJUEFTXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2OSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNmEpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WU01NVV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2YilcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9STU1fQ09ORklHX1NFVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNmUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9JUlFfTk9USUZZXHRcdFNNQ19STUlfQ0FMTCgweDAxNmYpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9BVFRFU1RfUExBVF9UT0tFTl9SRUZSRVNIXHRTTUNfUk1JX0NBTEwoMHgwMTcwKVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQUJPUlRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTc0KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9DT01NVU5JQ0FURVx0XHRTTUNfUk1JX0NBTEwoMHgwMTc1KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTc2KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3NylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfR0VUX1NUQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3OClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUkVGUkVTSFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TRVRfUFVCS0VZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3YilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RPUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxN2MpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxN2QpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdlKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9GT0xEXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3ZilcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0FCT1JUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4NSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfQ09NTVVOSUNBVEVcdFx0U01DX1JNSV9DQUxMKDB4MDE4NilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4NylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODgpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9TVEFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODkpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX1VOTE9DS1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxOGEpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1MyQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMThiKVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfR0VUX0lOVEVSRkFDRV9SRVBPUlRcdFNNQ19STUlfQ0FMTCgweDAxZDApXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9NRUFTVVJFTUVOVFNcdFx0U01DX1JNSV9DQUxMKDB4MDFkMSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfTE9DS1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxZDIpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX1NUQVJUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkMylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfUDJQX0JJTkRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWQ0KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9QMlBfVU5CSU5EXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkNSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0VWRU5UX0hBTkRMRVx0XHRTTUNfUk1JX0NBTEwoMHgwMWQ2KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfQUNUSVZBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWQ3KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfREVBQ1RJVkFURVx0XHRTTUNfUk1JX0NBTEwoMHgwMWQ4KVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX1NUX0wyX0NSRUFURVx0XHRTTUNfUk1JX0NBTEwoMHgwMWRiKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfREVTVFJPWVx0XHRTTUNfUk1JX0NBTEwoMHgwMWRjKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfRFBUX0wwX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZGQpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9EUFRfTDBfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZGUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9EUFRfTDFfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkZilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0RQVF9MMV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlMClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfR0VUXHRcdFNNQ19STUlfQ0FMTCgweDAxZTEpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19TRVRcdFx0U01DX1JNSV9DQUxMKDB4MDFlMylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0NNRU1fQUREX1BERVZcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWU0KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfQ01FTV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWU1KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfQ01FTV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlNilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0NNRU1fUE9QVUxBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWU3KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfQ01FTV9SRU1PVkVfUERFVlx0XHRTTUNfUk1JX0NBTEwoMHgwMWU4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfQ01FTV9TVEFSVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZTkpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9DTUVNX1NUT1BcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWVhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfQ01FTV9VTlBPUFVMQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlYilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9DT05GSUdfR0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlYylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfTUVDX1JFRlJFU0hcdFx0U01DX1JNSV9DQUxMKDB4MDFlZClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9TVEFURV9HRVRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWVlKVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX0VWRU5UX0NPTlNVTUVcdFx0U01DX1JNSV9DQUxMKDB4MDFmMClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfUkFOR0VfREVMRUdBVEVcdFx0U01DX1JNSV9DQUxMKDB4MDFmMSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfUkFOR0VfVU5ERUxFR0FURVx0U01DX1JNSV9DQUxMKDB4MDFmMilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0dQVF9MMV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWYzKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfR1BUX0wxX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWY0KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmNSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX1VOTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmNilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9ERVZfTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmNylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9ERVZfVU5NQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWY4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FSQ0hfREVWX01BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWY5KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FSQ0hfREVWX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmEpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX01BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZmIpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmMpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1BST1RfTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmQpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1BST1RfVU5NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmZSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX01BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZmKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9VTlBST1RfVU5NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDIwMClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQUxNX1RFUk1JTkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMDEpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9STU1fQUNUSVZBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAyKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfQ09OVElOVUVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAzKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fQ09OTkVDVFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA0KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fRElTQ09OTkVDVFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA1KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fQ09NUExFVEVcdFx0U01DX1JNSV9DQUxMKDB4MDIwNilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0tFWV9QVVJHRVx0XHRTTUNfUk1JX0NBTEwoMHgwMjA3KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfTUVNX0RPTkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMDgpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9PUF9NRU1fUkVDTEFJTVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMDkpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9PUF9DQU5DRUxcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfRkVBVFVSRVNcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBiKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0dFVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMGMpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WU01NVV9DTURfQ09NUExFVEVcdFx0U01DX1JNSV9DQUxMKDB4MDIwZClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX0lORk9cdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBlKVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfQUJJX01BSk9SX1ZFUlNJT05cdDJcbiYjNDM7I2RlZmluZSBSTUlfQUJJX01JTk9SX1ZFUlNJT05cdDBcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUih2ZXJzaW9uKSAoKHZlcnNpb24pIFx1MDAzZVx1MDAzZSAxNilcbiYjNDM7I2RlZmluZSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHZlcnNpb24pICgodmVyc2lvbikgXHUwMDI2IDB4RkZGRilcbiYjNDM7I2RlZmluZSBSTUlfQUJJX1ZFUlNJT04obWFqb3IsIG1pbm9yKSAgICAgICgoKG1ham9yKSBcdTAwM2NcdTAwM2MgMTYpIHwgKG1pbm9yKSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9TVEFUVVNfTUFTS1x0XHQoMHhGRlVMKVxuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fSU5ERVhfTUFTS1x0XHQoMHhGRlVMIFx1MDAzY1x1MDAzYyA4KVxuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRX01BU0tcdFx0KDB4M1VMIFx1MDAzY1x1MDAzYyA4KVxuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLXHQoMHgxVUwgXHUwMDNjXHUwMDNjIDEwKVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVUyhyZXQpXHRcdEZJRUxEX0dFVChSTUlfUkVUVVJOX1NUQVRVU19NQVNLLCByZXQpXG4mIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9JTkRFWChyZXQpXHRcdEZJRUxEX0dFVChSTUlfUkVUVVJOX0lOREVYX01BU0ssIHJldClcbiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX01FTVJFUShyZXQpXHRcdEZJRUxEX0dFVChSTUlfUkVUVVJOX01FTVJFUV9NQVNLLCByZXQpXG4mIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJldClcdEZJRUxEX0dFVChSTUlfUkVUVVJOX0NBTl9DQU5DRUxfTUFTSywgcmV0KVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfU1VDQ0VTU1x0XHRcdDBcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfSU5QVVRcdFx0XHQxXG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JFQUxNXHRcdFx0MlxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9SRUNcdFx0XHQzXG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JUVFx0XHRcdDRcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfTk9UX1NVUFBPUlRFRFx0XHQ1XG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0RFVklDRVx0XHQ2XG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JUVF9BVVhcdFx0N1xuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9QU01NVV9TVFx0XHQ4XG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0RQVFx0XHRcdDlcbiYjNDM7I2RlZmluZSBSTUlfQlVTWVx0XHRcdDEwXG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0dMT0JBTFx0XHQxMVxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9UUkFDS0lOR1x0XHQxMlxuJiM0MzsjZGVmaW5lIFJNSV9JTkNPTVBMRVRFXHRcdFx0MTNcbiYjNDM7I2RlZmluZSBSTUlfQkxPQ0tFRFx0XHRcdDE0XG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0dQVFx0XHRcdDE1XG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0dSQU5VTEVcdFx0MTZcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkdcdFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9DT05USU5VRV9TVE9QXHRcdDFcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX09QX01FTV9SRVFfTk9ORVx0XHQwXG4mIzQzOyNkZWZpbmUgUk1JX09QX01FTV9SRVFfRE9OQVRFXHRcdDFcbiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX1JFUV9SRUNMQUlNXHRcdDJcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TSVpFX01BU0tcdFx0M1VMXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVF9NQVNLXHRcdEdFTk1BU0soMTUsIDIpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT05USUdfTUFTS1x0XHRCSVQoMTYpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURV9NQVNLXHRcdEJJVCgxNylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TSVpFKHJlcSlcdFx0RklFTERfR0VUKFJNSV9ET05BVEVfU0laRV9NQVNLLCByZXEpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVChyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPVU5UX01BU0ssIHJlcSlcbiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJRyhyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPTlRJR19NQVNLLCByZXEpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURShyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX1NUQVRFX01BU0ssIHJlcSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX09QX01FTV9ERUxFR0FURURcdFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9PUF9NRU1fVU5ERUxFR0FURURcdFx0MVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9UWVBFX05PTkVcdFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1RZUEVfU0lOR0xFXHRcdDFcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9UWVBFX0xJU1RcdFx0MlxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TSVpFX01BU0tcdEdFTk1BU0soMSwgMClcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLXHRHRU5NQVNLKFBBR0VfU0hJRlQgLSAxLCAyKVxuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFJfTUFTS1x0KFBBR0VfTUFTSyBcdTAwMjYgR0VOTUFTSyg1MSwgMCkpXG4mIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTS1x0QklUKDYzKVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TSVpFKGFyKVx0XHQoRklFTERfR0VUKFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTSywgXFxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgKGFyKSkpXG4mIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlQoYXIpXHQoRklFTERfR0VUKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIFxcXG4mIzQzO1x0XHRcdFx0XHRcdCAgIChhcikpKVxuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFIoYXIpXHRcdCgoYXIpIFx1MDAyNiBSTUlfQUREUl9SQU5HRV9BRERSX01BU0spXG4mIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU1RBVEUoYXIpXHQoRklFTERfR0VUKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFxcXG4mIzQzO1x0XHRcdFx0XHRcdCAgIChhcikpKVxuJiM0MztcbiYjNDM7ZW51bSBybWlfcmlwYXMge1xuJiM0MztcdFJNSV9FTVBUWSA9IDAsXG4mIzQzO1x0Uk1JX1JBTSA9IDEsXG4mIzQzO1x0Uk1JX0RFU1RST1lFRCA9IDIsXG4mIzQzO1x0Uk1JX0RFViA9IDMsXG4mIzQzO307XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9OT19NRUFTVVJFX0NPTlRFTlRcdDBcbiYjNDM7I2RlZmluZSBSTUlfTUVBU1VSRV9DT05URU5UXHQxXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUzJTWlx0XHRHRU5NQVNLKDcsIDApXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9MUEEyXHRcdEJJVCg4KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFXHRcdEJJVCg5KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFX1ZMXHRcdEdFTk1BU0soMTMsIDEwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTlVNX0JQU1x0XHRHRU5NQVNLKDE5LCAxNClcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX05VTV9XUFNcdFx0R0VOTUFTSygyNSwgMjApXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVcdFx0QklUKDI2KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUE1VX05VTV9DVFJTXHRHRU5NQVNLKDMxLCAyNylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl80S0JcdEJJVCgwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfMTZLQlx0QklUKDEpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl82NEtCXHRCSVQoMilcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzI1Nlx0QklUKDMpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8zODRcdEJJVCg0KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfNTEyXHRCSVQoNSlcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX01BWF9SRUNTX09SREVSXHRHRU5NQVNLKDksIDYpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9MMEdQVFNaXHRcdEdFTk1BU0soMTMsIDEwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUFBTXHRcdEdFTk1BU0soMTYsIDE0KVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0RBXHRcdEJJVCgwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfREFfQ09IXHRcdEJJVCgxKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVlNNTVVcdFx0QklUKDIpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9BVFNcdFx0QklUKDMpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9NQVhfVkRFVlNfT1JERVJcdEdFTk1BU0soNywgNClcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1ZERVZfS1JPVVx0QklUKDgpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9OT05fVEVFX1NUUkVBTVx0QklUKDkpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9QMlBcdFx0QklUKDEwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQ01FTV9DWExcdFx0QklUKDExKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfTUFYX0NNRU1cdFx0R0VOTUFTSygxOSwgMTIpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9DTUVNX1RTRV9SRVFcdEJJVCgyMClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19NQVhfTlVNX0FVWF9QTEFORVNcdEdFTk1BU0soMywgMClcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9QTEFORVx0XHRHRU5NQVNLKDUsIDQpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19SVFRfUzJBUF9JTkRJUkVDVFx0QklUKDYpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzRfTUVDX0NPVU5UXHRcdEdFTk1BU0soNjMsIDApXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfQ09OVkVOVElPTkFMXHRcdDBcbiYjNDM7I2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0RFVl9OQ09IXHRcdDFcbiYjNDM7I2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0RFVl9DT0hcdFx0MlxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfUkVTRVJWRURcdFx0XHQwXG4mIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX05PTkVcdFx0XHQxXG4mIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX0ZJTkVcdFx0XHQyXG4mIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX0NPQVJTRVx0XHRcdDNcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV80S0JcdDBcbiYjNDM7I2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzE2S0JcdDFcbiYjNDM7I2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzY0S0JcdDJcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIE5vdGUgbWFueSBvZiB0aGVzZSBmaWVsZHMgYXJlIHNtYWxsZXIgdGhhbiB1NjQgYnV0IGFsbCBmaWVsZHMgaGF2ZSB1NjRcbiYjNDM7ICogYWxpZ25tZW50LCBzbyB1c2UgdTY0IHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudC5cbiYjNDM7ICovXG4mIzQzO3N0cnVjdCBybW1fY29uZmlnIHtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTY0IHRyYWNraW5nX3JlZ2lvbl9zaXplO1xuJiM0MztcdFx0XHR1NjQgcm1pX2dyYW51bGVfc2l6ZTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBzaXplcltTWl80S107XG4mIzQzO1x0fTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBybW1fY29uZmlnKSA9PSBTWl80Syk7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0xQQTJcdFx0QklUKDApXG4mIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfU1ZFXHRcdEJJVCgxKVxuJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX1BNVVx0XHRCSVQoMilcbiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19EQVx0XHRcdEJJVCgzKVxuJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0xGQV9QT0xJQ1lcdFx0R0VOTUFTSyg2LCA1KVxuJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX01FQ19QT0xJQ1lcdFx0R0VOTUFTSyg4LCA3KVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfSEFTSF9TSEFfMjU2XHRcdFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9IQVNIX1NIQV81MTJcdFx0XHQxXG4mIzQzOyNkZWZpbmUgUk1JX0hBU0hfU0hBXzM4NFx0XHRcdDJcbiYjNDM7XG4mIzQzO3N0cnVjdCByZWFsbV9wYXJhbXMge1xuJiM0MztcdHVuaW9uIHsgLyogMHgwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1NjQgZmxhZ3MwO1xuJiM0MztcdFx0XHR1NjQgczJzejtcbiYjNDM7XHRcdFx0dTY0IHN2ZV92bDtcbiYjNDM7XHRcdFx0dTY0IG51bV9icHM7XG4mIzQzO1x0XHRcdHU2NCBudW1fd3BzO1xuJiM0MztcdFx0XHR1NjQgcG11X251bV9jdHJzO1xuJiM0MztcdFx0XHR1NjQgaGFzaF9hbGdvO1xuJiM0MztcdFx0XHR1NjQgbnVtX2F1eF9wbGFuZXM7XG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0dTggcGFkZGluZzBbMHg0MDBdO1xuJiM0MztcdH07XG4mIzQzO1x0dW5pb24geyAvKiAweDQwMCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTggcnB2WzY0XTtcbiYjNDM7XHRcdFx0dTY0IGF0c19wbGFuZTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nMVsweDQwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4ODAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1NjQgcGFkZGluZztcbiYjNDM7XHRcdFx0dTY0IHJ0dF9iYXNlO1xuJiM0MztcdFx0XHRzNjQgcnR0X2xldmVsX3N0YXJ0O1xuJiM0MztcdFx0XHR1NjQgcnR0X251bV9zdGFydDtcbiYjNDM7XHRcdFx0dTY0IGZsYWdzMTtcbiYjNDM7XHRcdFx0dTY0IGF1eF9ydHRfYmFzZVszXTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nMlsweDgwMF07XG4mIzQzO1x0fTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWFsbV9wYXJhbXMpID09IFNaXzRLKTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSBudW1iZXIgb2YgR1BScyAoc3RhcnRpbmcgZnJvbSBYMCkgdGhhdCBhcmVcbiYjNDM7ICogY29uZmlndXJlZCBieSB0aGUgaG9zdCB3aGVuIGEgUkVDIGlzIGNyZWF0ZWQuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIFJFQ19DUkVBVEVfTlJfR1BSU1x0XHQ4XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJFQ19QQVJBTVNfRkxBR19SVU5OQUJMRVx0QklUX1VMTCgwKVxuJiM0MztcbiYjNDM7c3RydWN0IHJlY19wYXJhbXMge1xuJiM0MztcdHVuaW9uIHsgLyogMHgwICovXG4mIzQzO1x0XHR1NjQgZmxhZ3M7XG4mIzQzO1x0XHR1OCBwYWRkaW5nMFsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MTAwICovXG4mIzQzO1x0XHR1NjQgbXBpZHI7XG4mIzQzO1x0XHR1OCBwYWRkaW5nMVsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MjAwICovXG4mIzQzO1x0XHR1NjQgcGM7XG4mIzQzO1x0XHR1OCBwYWRkaW5nMlsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MzAwICovXG4mIzQzO1x0XHR1NjQgZ3Byc1tSRUNfQ1JFQVRFX05SX0dQUlNdO1xuJiM0MztcdFx0dTggcGFkZGluZzNbMHhkMDBdO1xuJiM0MztcdH07XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3BhcmFtcykgPT0gU1pfNEspO1xuJiM0MztcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19FTVVMQVRFRF9NTUlPXHRCSVQoMClcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19JTkpFQ1RfU0VBXHRCSVQoMSlcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGSVx0XHRCSVQoMilcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGRVx0XHRCSVQoMylcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19SSVBBU19SRVNQT05TRVx0QklUKDQpXG4mIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfUzJBUF9SRVNQT05TRVx0QklUKDUpXG4mIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfREVWX01FTV9SRVNQT05TRVx0QklUKDYpXG4mIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfRk9SQ0VfUDBcdFx0QklUKDcpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJFQ19SVU5fR1BSU1x0XHRcdDMxXG4mIzQzOyNkZWZpbmUgUkVDX01BWF9HSUNfTlVNX0xSU1x0XHQxNlxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfUEVSTUlUVEVEX0dJQ1YzX0hDUl9CSVRTXHQoSUNIX0hDUl9FTDJfVUlFIHxcdFx0XFxcbiYjNDM7XHRcdFx0XHRcdCBJQ0hfSENSX0VMMl9MUkVOUElFIHxcdFx0XFxcbiYjNDM7XHRcdFx0XHRcdCBJQ0hfSENSX0VMMl9OUElFIHxcdFx0XFxcbiYjNDM7XHRcdFx0XHRcdCBJQ0hfSENSX0VMMl9WR3JwMEVJRSB8XHRcdFxcXG4mIzQzO1x0XHRcdFx0XHQgSUNIX0hDUl9FTDJfVkdycDBESUUgfFx0XHRcXFxuJiM0MztcdFx0XHRcdFx0IElDSF9IQ1JfRUwyX1ZHcnAxRUlFIHxcdFx0XFxcbiYjNDM7XHRcdFx0XHRcdCBJQ0hfSENSX0VMMl9WR3JwMURJRSB8XHRcdFxcXG4mIzQzO1x0XHRcdFx0XHQgSUNIX0hDUl9FTDJfVERJUilcbiYjNDM7XG4mIzQzO3N0cnVjdCByZWNfZW50ZXIge1xuJiM0MztcdHVuaW9uIHsgLyogMHgwMDAgKi9cbiYjNDM7XHRcdHU2NCBmbGFncztcbiYjNDM7XHRcdHU4IHBhZGRpbmcwWzB4MjAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHgyMDAgKi9cbiYjNDM7XHRcdHU2NCBncHJzW1JFQ19SVU5fR1BSU107XG4mIzQzO1x0XHR1OCBwYWRkaW5nMVsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1OCBwYWRkaW5nM1sweDUwMF07XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2VudGVyKSA9PSBTWl8ySyk7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1NZTkNcdFx0XHQweDAwXG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfSVJRXHRcdFx0MHgwMVxuJiM0MzsjZGVmaW5lIFJNSV9FWElUX0ZJUVx0XHRcdDB4MDJcbiYjNDM7I2RlZmluZSBSTUlfRVhJVF9QU0NJXHRcdFx0MHgwM1xuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1JJUEFTX0NIQU5HRVx0XHQweDA0XG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfSE9TVF9DQUxMXHRcdDB4MDVcbiYjNDM7I2RlZmluZSBSTUlfRVhJVF9TRVJST1JcdFx0XHQweDA2XG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfUzJBUF9DSEFOR0VcdFx0MHgwN1xuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1ZERVZfVkFMSURBVEVfTUFQUElOR1x0MHgwOFxuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1ZTTU1VX0NPTU1BTkRcdFx0MHgwYVxuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1ZERVZfUDJQX0JJTkRJTkdcdDB4MGJcbiYjNDM7XG4mIzQzO3N0cnVjdCByZWNfZXhpdCB7XG4mIzQzO1x0dW5pb24geyAvKiAweDAwMCAqL1xuJiM0MztcdFx0dTggZXhpdF9yZWFzb247XG4mIzQzO1x0XHR1OCBwYWRkaW5nMFsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MTAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1NjQgZXNyO1xuJiM0MztcdFx0XHR1NjQgZmFyO1xuJiM0MztcdFx0XHR1NjQgaHBmYXI7XG4mIzQzO1x0XHRcdHU2NCBydHRfdHJlZTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nMVsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MjAwICovXG4mIzQzO1x0XHR1NjQgZ3Byc1tSRUNfUlVOX0dQUlNdO1xuJiM0MztcdFx0dTggcGFkZGluZzJbMHgxMDBdO1xuJiM0MztcdH07XG4mIzQzO1x0dW5pb24geyAvKiAweDMwMCAqL1xuJiM0MztcdFx0dTggcGFkZGluZzNbMHgxMDBdO1xuJiM0MztcdH07XG4mIzQzO1x0dW5pb24geyAvKiAweDQwMCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTY0IGNudHBfY3RsO1xuJiM0MztcdFx0XHR1NjQgY250cF9jdmFsO1xuJiM0MztcdFx0XHR1NjQgY250dl9jdGw7XG4mIzQzO1x0XHRcdHU2NCBjbnR2X2N2YWw7XG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0dTggcGFkZGluZzRbMHgxMDBdO1xuJiM0MztcdH07XG4mIzQzO1x0dW5pb24geyAvKiAweDUwMCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTY0IHJpcGFzX2Jhc2U7XG4mIzQzO1x0XHRcdHU2NCByaXBhc190b3A7XG4mIzQzO1x0XHRcdHU4IHJpcGFzX3ZhbHVlO1xuJiM0MztcdFx0XHR1OCBwYWRkaW5nOFsxNV07XG4mIzQzO1x0XHRcdHU2NCBzMmFwX2Jhc2U7XG4mIzQzO1x0XHRcdHU2NCBzMmFwX3RvcDtcbiYjNDM7XHRcdFx0dTY0IHZkZXZfaWRfMTtcbiYjNDM7XHRcdFx0dTY0IHZkZXZfaWRfMjtcbiYjNDM7XHRcdFx0dTY0IGRldl9tZW1fYmFzZTtcbiYjNDM7XHRcdFx0dTY0IGRldl9tZW1fdG9wO1xuJiM0MztcdFx0XHR1NjQgZGV2X21lbV9wYTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nNVsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4NjAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1MTYgaW1tO1xuJiM0MztcdFx0XHR1MTYgcGFkZGluZzk7XG4mIzQzO1x0XHRcdHU2NCBwbGFuZTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nNlsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4NzAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1OCBwbXVfb3ZmX3N0YXR1cztcbiYjNDM7XHRcdFx0dTggcGFkZGluZzEwWzE1XTtcbiYjNDM7XHRcdFx0dTY0IHZzbW11O1xuJiM0MztcdFx0fTtcbiYjNDM7XHRcdHU4IHBhZGRpbmc3WzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19leGl0KSA9PSBTWl8ySyk7XG4mIzQzO1xuJiM0MztzdHJ1Y3QgcmVjX3J1biB7XG4mIzQzO1x0c3RydWN0IHJlY19lbnRlciBlbnRlcjtcbiYjNDM7XHRzdHJ1Y3QgcmVjX2V4aXQgZXhpdDtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfcnVuKSA9PSBTWl80Syk7XG4mIzQzO1xuJiM0MzsvKiBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi9cbiYjNDM7I2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfT0FERFJfVFlQRVx0R0VOTUFTSygxLCAwKVxuJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UXHRHRU5NQVNLKDE1LCAyKVxuJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19NRU1BVFRSXHRHRU5NQVNLKDE4LCAxNilcbiYjNDM7I2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfUzJBUFx0XHRHRU5NQVNLKDIyLCAxOSlcbiYjNDM7XG4mIzQzOy8qIFJNSV9SVFRfREFUQV9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi9cbiYjNDM7I2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX09BRERSX1RZUEVcdEdFTk1BU0soMSwgMClcbiYjNDM7I2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX0xJU1RfQ09VTlRcdEdFTk1BU0soMTUsIDIpXG4mIzQzO1xuJiM0MzsvKiBTMkFQIERpcmVjdCBFbmNvZGluZ3MsIHVzZWQgaW4gUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX1MyQVAgKi9cbiYjNDM7I2RlZmluZSBSTUlfUzJBUF9ESVJFQ1RfV1JJVEVcdFx0XHRCSVQoMClcbiYjNDM7I2RlZmluZSBSTUlfUzJBUF9ESVJFQ1RfUkVBRFx0XHRcdEJJVCgxKVxuJiM0MztcbiYjNDM7I2VuZGlmIC8qIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IXyAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDIxOjI5PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgaG9zdC1zaWRlIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIGxpYnJhcnkgZnVuY3Rpb25zIGFuZCBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gZm9yIEtWTSB0byB1c2UuIEhvd2V2ZXIsIEtWTSBzdXBwb3J0IGZvciBSZWFsbXMgaXMgbm90IGluY2x1ZGVkIGluIHRoaXMgcGF0Y2gsIG1ha2luZyB0aGUgZXhwb3J0ZWQgbGlicmFyeSBmdW5jdGlvbnMgdW5yZWFjaGFibGUgZnJvbSB1c2VyLXNwYWNlLiBGdXJ0aGVybW9yZSwgdGhlIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiByZXF1aXJlcyBzcGVjaWZpYyBoYXJkd2FyZS9maXJtd2FyZSAoUk1NKSBzdXBwb3J0IHRoYXQgaXMgbm90IHByZXNlbnQgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLCBhbmQgaXQgd2lsbCBzaW1wbHkgYmFpbCBvdXQgZWFybHkuIFRoZXJlIGFyZSBubyBzeXNjYWxscywgaW9jdGxzLCBvciBvdGhlciB1c2VyLXNwYWNlIGludGVyZmFjZXMgaW50cm9kdWNlZCB0aGF0IHN5emthbGxlciBjb3VsZCBmdXp6LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLApldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXQKICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LAogICBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgOWNhMzQ3NDQ1YzZjYWNjOWJhMGM4MDgxMTZmYmNkOGRjMDc5MDExOQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBXZWQgSnVsIDE1IDIxOjI5OjUyIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29uZmlnCmluZGV4IGIzYWZlMDY4ODkxOWJkLi4wZjE5NTZlZGYxMzA3YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQvS2NvbmZpZwpAQCAtMzgsNiAmIzQzOzM4LDcgQEAgY29uZmlnIEFSTTY0CiAJc2VsZWN0IEFSQ0hfSEFTX01FTUJBUlJJRVJfU1lOQ19DT1JFCiAJc2VsZWN0IEFSQ0hfSEFTX01FTV9FTkNSWVBUCiAJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNFQUxfU1lTVEVNX01BUFBJTkdTCiYjNDM7CXNlbGVjdCBBUkNIX1NVUFBPUlRTX1JNTQogCXNlbGVjdCBBUkNIX0hBU19OTUlfU0FGRV9USElTX0NQVV9PUFMKIAlzZWxlY3QgQVJDSF9IQVNfTk9OX09WRVJMQVBQSU5HX0FERFJFU1NfU1BBQ0UKIAlzZWxlY3QgQVJDSF9IQVNfTk9OTEVBRl9QTURfWU9VTkcgaWYgQVJNNjRfSEFGVApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi5mMTNlY2RiNDBkZWQ0MQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaApAQCAtMCwwICYjNDM7MSw0NTkgQEAKJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLwomIzQzOy8qCiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC4KJiM0MzsgKi8KJiM0MzsKJiM0MzsjaWZuZGVmIF9fQVNNX1JNSV9DTURTX0gKJiM0MzsjZGVmaW5lIF9fQVNNX1JNSV9DTURTX0gKJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYXJtLXJtaS1jbWRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2FybS1zbWNjYy1ybWkuaCZndDsKJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X2RhdGFfbWFwX2luaXQoKSAtIENyZWF0ZSBhIHByb3RlY3RlZCBtYXBwaW5nIHdpdGggZGF0YSBjb250ZW50cwomIzQzOyAqIEByZDogUEEgb2YgdGhlIFJECiYjNDM7ICogQGRhdGE6IFBBIG9mIHRoZSB0YXJnZXQgZ3JhbnVsZQomIzQzOyAqIEBpcGE6IElQQSBhdCB3aGljaCB0aGUgZ3JhbnVsZSB3aWxsIGJlIG1hcHBlZCBpbiB0aGUgZ3Vlc3QKJiM0MzsgKiBAc3JjOiBQQSBvZiB0aGUgc291cmNlIGdyYW51bGUKJiM0MzsgKiBAZmxhZ3M6IFJNSV9NRUFTVVJFX0NPTlRFTlQgaWYgdGhlIGNvbnRlbnRzIHNob3VsZCBiZSBtZWFzdXJlZAomIzQzOyAqCiYjNDM7ICogQ3JlYXRlIGEgbWFwcGluZyBmcm9tIFByb3RlY3RlZCBJUEEgc3BhY2UgdG8gY29udmVudGlvbmFsIG1lbW9yeSwgY29weWluZwomIzQzOyAqIGNvbnRlbnRzIGZyb20gYSBOb24tc2VjdXJlIEdyYW51bGUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9kYXRhX21hcF9pbml0KHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgZGF0YSwKJiM0MzsJCQkJCXVuc2lnbmVkIGxvbmcgaXBhLCB1bnNpZ25lZCBsb25nIHNyYywKJiM0MzsJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9EQVRBX01BUF9JTklULCByZCwgZGF0YSwgaXBhLCBzcmMsIGZsYWdzCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJldHVybiBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3J0dF9kYXRhX21hcCgpIC0gQ3JlYXRlIG1hcHBpbmdzIGluIHByb3RlY3RlZCBJUEEgd2l0aCB1bmtub3duIGNvbnRlbnRzCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAYmFzZTogQmFzZSBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZQomIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZQomIzQzOyAqIEBmbGFnczogRmxhZ3MKJiM0MzsgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yCiYjNDM7ICogQG91dF90b3A6IFRvcCBhZGRyZXNzIG9mIHJhbmdlIHdoaWNoIHdhcyBwcm9jZXNzZWQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm4gUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9kYXRhX21hcCh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nIGJhc2UsCiYjNDM7CQkJCSAgIHVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nIG9hZGRyLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfREFUQV9NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkcgomIzQzOwl9OwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlyZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKG91dF90b3ApCiYjNDM7CQkqb3V0X3RvcCA9IHJlZ3MuYTE7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfZGF0YV91bm1hcCgpIC0gUmVtb3ZlIG1hcHBpbmdzIHRvIGNvbnZlbnRpb25hbCBtZW1vcnkKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCBSZWFsbQomIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlCiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlCiYjNDM7ICogQGZsYWdzOiBGbGFncwomIzQzOyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3IKJiM0MzsgKiBAb3V0X3RvcDogUmV0dXJucyB0b3AgSVBBIG9mIHJhbmdlIHdoaWNoIGhhcyBiZWVuIHVubWFwcGVkCiYjNDM7ICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2UKJiM0MzsgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0CiYjNDM7ICoKJiM0MzsgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIGNvbnZlbnRpb24gbWVtb3J5IHdpdGggYSB0YXJnZXQgUHJvdGVjdGVkIElQQSByYW5nZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9kYXRhX3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsCiYjNDM7CQkJCSAgICAgdW5zaWduZWQgbG9uZyBiYXNlLAomIzQzOwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiYjNDM7CQkJCSAgICAgdW5zaWduZWQgbG9uZyBvYWRkciwKJiM0MzsJCQkJICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wLAomIzQzOwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9yYW5nZSwKJiM0MzsJCQkJICAgICB1bnNpZ25lZCBsb25nICpvdXRfY291bnQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9EQVRBX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHIKJiM0MzsJfTsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChvdXRfdG9wKQomIzQzOwkJKm91dF90b3AgPSByZWdzLmExOwomIzQzOwlpZiAob3V0X3JhbmdlKQomIzQzOwkJKm91dF9yYW5nZSA9IHJlZ3MuYTI7CiYjNDM7CWlmIChvdXRfY291bnQpCiYjNDM7CQkqb3V0X2NvdW50ID0gcmVncy5hMzsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3BzY2lfY29tcGxldGUoKSAtIENvbXBsZXRlIHBlbmRpbmcgUFNDSSBjb21tYW5kCiYjNDM7ICogQGNhbGxpbmdfcmVjOiBQQSBvZiB0aGUgY2FsbGluZyBSRUMKJiM0MzsgKiBAc3RhdHVzOiBTdGF0dXMgb2YgdGhlIFBTQ0kgcmVxdWVzdAomIzQzOyAqCiYjNDM7ICogQ29tcGxldGVzIGEgcGVuZGluZyBQU0NJIGNvbW1hbmQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9wc2NpX2NvbXBsZXRlKHVuc2lnbmVkIGxvbmcgY2FsbGluZ19yZWMsCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nIHN0YXR1cykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfcmVzIHJlczsKJiM0MzsKJiM0MzsJYXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9QU0NJX0NPTVBMRVRFLCBjYWxsaW5nX3JlYywgc3RhdHVzLCAmYW1wO3Jlcyk7CiYjNDM7CiYjNDM7CXJldHVybiByZXMuYTA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9yZWFsbV9hY3RpdmF0ZSgpIC0gQWN0aXZlIGEgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqCiYjNDM7ICogTWFyayBhIHJlYWxtIGFzIEFjdGl2ZSBzaWduYWxsaW5nIHRoYXQgY3JlYXRpb24gaXMgY29tcGxldGUgYW5kIGFsbG93aW5nCiYjNDM7ICogZXhlY3V0aW9uIG9mIHRoZSByZWFsbS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX2FjdGl2YXRlKHVuc2lnbmVkIGxvbmcgcmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7CiYjNDM7CiYjNDM7CWFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUkVBTE1fQUNUSVZBVEUsIHJkLCAmYW1wO3Jlcyk7CiYjNDM7CiYjNDM7CXJldHVybiByZXMuYTA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9yZWFsbV9jcmVhdGUoKSAtIENyZWF0ZSBhIHJlYWxtCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAcGFyYW1zOiBQQSBvZiByZWFsbSBwYXJhbWV0ZXJzCiYjNDM7ICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWQKJiM0MzsgKgomIzQzOyAqIENyZWF0ZSBhIG5ldyByZWFsbSB1c2luZyB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHBhcmFtcywKJiM0MzsJCQkJICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybykKJiM0Mzt7CiYjNDM7CXJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwKJiM0MzsJCQkJICAgU01DX1JNSV9SRUFMTV9DUkVBVEUsIHJkLCBwYXJhbXMpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcmVhbG1fdGVybWluYXRlKCkgLSBUZXJtaW5hdGUgYSByZWFsbQomIzQzOyAqIEByZDogUEEgb2YgdGhlIFJECiYjNDM7ICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWQKJiM0MzsgKgomIzQzOyAqIFRlcm1pbmF0ZXMgYSByZWFsbSwgbW92aW5nIGl0IGludG8gYSBaT01CSUUgc3RhdGUKJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX3Rlcm1pbmF0ZSh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgICAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKQomIzQzO3sKJiM0MzsJcmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLAomIzQzOwkJCQkgICBTTUNfUk1JX1JFQUxNX1RFUk1JTkFURSwgcmQpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcmVhbG1fZGVzdHJveSgpIC0gRGVzdHJveSBhIHJlYWxtCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZAomIzQzOyAqCiYjNDM7ICogRGVzdHJveXMgYSByZWFsbSwgYWxsIG9iamVjdHMgYmVsb25naW5nIHRvIHRoZSByZWFsbSBtdXN0IGJlIGRlc3Ryb3llZCBmaXJzdC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX2Rlc3Ryb3kodW5zaWduZWQgbG9uZyByZCwKJiM0MzsJCQkJICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsCiYjNDM7CQkJCSAgIFNNQ19STUlfUkVBTE1fREVTVFJPWSwgcmQpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcmVjX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgUkVDCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQwomIzQzOyAqIEBwYXJhbXM6IFBBIG9mIFJFQyBwYXJhbWV0ZXJzCiYjNDM7ICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWQKJiM0MzsgKgomIzQzOyAqIENyZWF0ZSBhIFJFQyB1c2luZyB0aGUgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdCByZWNfcGFyYW1zIHBvaW50ZWQKJiM0MzsgKiB0byBieSBAcGFyYW1zLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcmVjX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgdW5zaWduZWQgbG9uZyByZWMsCiYjNDM7CQkJCSB1bnNpZ25lZCBsb25nIHBhcmFtcywKJiM0MzsJCQkJIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pCiYjNDM7ewomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwkqc3JvID0gKHN0cnVjdCBybWlfc3JvX3N0YXRlKXsucmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUkVDX0NSRUFURSwgcmQsIHJlYywgcGFyYW1zCiYjNDM7CX19OwomIzQzOwlyZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzcm8sIEdGUF9LRVJORUwpOwomIzQzOwlybWlfc3JvX2ZyZWUoc3JvKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3JlY19kZXN0cm95KCkgLSBEZXN0cm95IGEgUkVDCiYjNDM7ICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUMKJiM0MzsgKiBAc3JvOiBBbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZAomIzQzOyAqCiYjNDM7ICogRGVzdHJveXMgYSBSRUMuIFRoZSBSRUMgbXVzdCBub3QgYmUgcnVubmluZy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3JlY19kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmVjLAomIzQzOwkJCQkgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUkVDX0RFU1RST1ksIHJlYyk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9yZWNfZW50ZXIoKSAtIEVudGVyIGEgUkVDCiYjNDM7ICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUMKJiM0MzsgKiBAcnVuX3B0cjogUEEgb2YgUmVjUnVuIHN0cnVjdHVyZQomIzQzOyAqCiYjNDM7ICogU3RhcnRzIChvciBjb250aW51ZXMpIGV4ZWN1dGlvbiB3aXRoaW4gYSBSRUMuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9yZWNfZW50ZXIodW5zaWduZWQgbG9uZyByZWMsIHVuc2lnbmVkIGxvbmcgcnVuX3B0cikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfcmVzIHJlczsKJiM0MzsKJiM0MzsJYXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9SRUNfRU5URVIsIHJlYywgcnVuX3B0ciwgJmFtcDtyZXMpOwomIzQzOwomIzQzOwlyZXR1cm4gcmVzLmEwOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X2NyZWF0ZSgpIC0gQ3JlYXRlcyBhbiBSVFQKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBydHQ6IFBBIG9mIHRoZSB0YXJnZXQgUlRUCiYjNDM7ICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUCiYjNDM7ICogQGxldmVsOiBEZXB0aCBvZiB0aGUgUlRUIHdpdGhpbiB0aGUgdHJlZQomIzQzOyAqCiYjNDM7ICogQ3JlYXRlcyBhbiBSVFQgKFJlYWxtIFRyYW5zbGF0aW9uIFRhYmxlKSBhdCB0aGUgc3BlY2lmaWVkIGxldmVsIGZvciB0aGUKJiM0MzsgKiB0cmFuc2xhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGFkZHJlc3Mgd2l0aGluIHRoZSByZWFsbS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9jcmVhdGUodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBydHQsCiYjNDM7CQkJCSB1bnNpZ25lZCBsb25nIGlwYSwgbG9uZyBsZXZlbCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUlRUX0NSRUFURSwgcmQsIHJ0dCwgaXBhLCBsZXZlbAomIzQzOwl9OwomIzQzOwomIzQzOwlyZXR1cm4gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfZGVzdHJveSgpIC0gRGVzdHJveSBhbiBSVFQKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCByZWFsbQomIzQzOyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVAomIzQzOyAqIEBsZXZlbDogUlRUIGxldmVsCiYjNDM7ICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZAomIzQzOyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRoZSB0b3AgSVBBIG9mIG5vbi1saXZlIFJUVCBlbnRyaWVzLCBmcm9tIGVudHJ5CiYjNDM7ICogYXQgd2hpY2ggdGhlIFJUVCB3YWxrIHRlcm1pbmF0ZWQuCiYjNDM7ICoKJiM0MzsgKiBEZXN0cm95cyBhbiBSVFQuIFRoZSBSVFQgbXVzdCBiZSBub24tbGl2ZSwgaS5lLiBub25lIG9mIHRoZSBlbnRyaWVzIGluIHRoZQomIzQzOyAqIHRhYmxlIGFyZSBpbiBBU1NJR05FRCBvciBUQUJMRSBzdGF0ZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgIHVuc2lnbmVkIGxvbmcgaXBhLAomIzQzOwkJCQkgIGxvbmcgbGV2ZWwsCiYjNDM7CQkJCSAgdW5zaWduZWQgbG9uZyAqb3V0X3J0dCwKJiM0MzsJCQkJICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfREVTVFJPWSwgcmQsIGlwYSwgbGV2ZWwKJiM0MzsJfTsKJiM0MzsJaW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAob3V0X3J0dCkKJiM0MzsJCSpvdXRfcnR0ID0gcmVncy5hMTsKJiM0MzsJaWYgKG91dF90b3ApCiYjNDM7CQkqb3V0X3RvcCA9IHJlZ3MuYTI7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfZm9sZCgpIC0gRm9sZCBhbiBSVFQKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVAomIzQzOyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWUKJiM0MzsgKiBAb3V0X3J0dDogUG9pbnRlciB0byB3cml0ZSB0aGUgUEEgb2YgdGhlIFJUVCB3aGljaCB3YXMgZGVzdHJveWVkCiYjNDM7ICoKJiM0MzsgKiBGb2xkcyBhbiBSVFQuIElmIGFsbCBlbnRyaWVzIHdpdGggdGhlIFJUVCBhcmUgJiMzOTtob21vZ2VuZW91cyYjMzk7IHRoZSBSVFQgY2FuIGJlCiYjNDM7ICogZm9sZGVkIGludG8gdGhlIHBhcmVudCBhbmQgdGhlIFJUVCBkZXN0cm95ZWQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZm9sZCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGlwYSwKJiM0MzsJCQkgICAgICAgbG9uZyBsZXZlbCwgdW5zaWduZWQgbG9uZyAqb3V0X3J0dCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUlRUX0ZPTEQsIHJkLCBpcGEsIGxldmVsCiYjNDM7CX07CiYjNDM7CWludCByZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKG91dF9ydHQpCiYjNDM7CQkqb3V0X3J0dCA9IHJlZ3MuYTE7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfaW5pdF9yaXBhcygpIC0gU2V0IFJJUEFTIGZvciBuZXcgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRhcmdldCBJUEEgcmVnaW9uCiYjNDM7ICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uCiYjNDM7ICogQG91dF90b3A6IFRvcCBJUEEgb2YgcmFuZ2Ugd2hvc2UgUklQQVMgd2FzIG1vZGlmaWVkCiYjNDM7ICoKJiM0MzsgKiBTZXRzIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEEgcmFuZ2UgdG8gUkFNLCBmb3IgYSByZWFsbSBpbiB0aGUgTkVXIHN0YXRlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2luaXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBiYXNlLAomIzQzOwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdG9wLCB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfSU5JVF9SSVBBUywgcmQsIGJhc2UsIHRvcAomIzQzOwl9OwomIzQzOwlpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChvdXRfdG9wKQomIzQzOwkJKm91dF90b3AgPSByZWdzLmExOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X3VucHJvdF9tYXAoKSAtIE1hcCB1bnByb3RlY3RlZCBncmFudWxlcyBpbnRvIGEgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBiYXNlOiBCYXNlIElQQSBvZiB0aGUgbWFwcGluZwomIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZQomIzQzOyAqIEBmbGFnczogRmxhZ3MKJiM0MzsgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yCiYjNDM7ICogQG91dF90b3A6IFRvcCBJUEEgb2YgcmFuZ2Ugd2hpY2ggaGFzIGJlZW4gbWFwcGVkCiYjNDM7ICoKJiM0MzsgKiBDcmVhdGUgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfdW5wcm90X21hcCh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSwKJiM0MzsJCQkJICAgICB1bnNpZ25lZCBsb25nIHRvcCwKJiM0MzsJCQkJICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLAomIzQzOwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb2FkZHIsCiYjNDM7CQkJCSAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUlRUX1VOUFJPVF9NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkcgomIzQzOwl9OwomIzQzOwlpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChvdXRfdG9wKQomIzQzOwkJKm91dF90b3AgPSByZWdzLmExOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X3NldF9yaXBhcygpIC0gU2V0IFJJUEFTIGZvciBhbiBydW5uaW5nIHJlYWxtCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgUkVDIG1ha2luZyB0aGUgcmVxdWVzdAomIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRhcmdldCBJUEEgcmVnaW9uCiYjNDM7ICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uCiYjNDM7ICogQG91dF90b3A6IFBvaW50ZXIgdG8gd3JpdGUgdG9wIElQQSBvZiByYW5nZSB3aG9zZSBSSVBBUyB3YXMgbW9kaWZpZWQKJiM0MzsgKgomIzQzOyAqIENvbXBsZXRlcyBhIHJlcXVlc3QgbWFkZSBieSB0aGUgcmVhbG0gdG8gY2hhbmdlIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEEKJiM0MzsgKiByYW5nZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9zZXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyByZWMsCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUlRUX1NFVF9SSVBBUywgcmQsIHJlYywgYmFzZSwgdG9wCiYjNDM7CX07CiYjNDM7CWludCByZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKG91dF90b3ApCiYjNDM7CQkqb3V0X3RvcCA9IHJlZ3MuYTE7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfdW5wcm90X3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3Mgd2l0aGluIGFuIHVucHJvdGVjdGVkIElQQSByYW5nZQomIzQzOyAqIEByZDogUEEgb2YgdGhlIFJECiYjNDM7ICogQGJhc2U6IEJhc2UgSVBBIG9mIHRoZSBtYXBwaW5nCiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlCiYjNDM7ICogQGZsYWdzOiBGbGFncwomIzQzOyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3IKJiM0MzsgKiBAb3V0X3RvcDogVG9wIElQQSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZAomIzQzOyAqIEBvdXRfcmFuZ2U6IE91dHB1dCBhZGRyZXNzIHJhbmdlCiYjNDM7ICogQG91dF9jb3VudDogTnVtYmVyIG9mIGVudHJpZXMgaW4gb3V0cHV0IGFkZHJlc3MgbGlzdAomIzQzOyAqCiYjNDM7ICogUmVtb3ZlcyBtYXBwaW5ncyB0byBtZW1vcnkgd2l0aGluIGEgdGFyZ2V0IHVucHJvdGVjdGVkIElQQSByYW5nZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF91bnByb3RfdW5tYXAodW5zaWduZWQgbG9uZyByZCwKJiM0MzsJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSwKJiM0MzsJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywKJiM0MzsJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgb2FkZHIsCiYjNDM7CQkJCSAgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wLAomIzQzOwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3JhbmdlLAomIzQzOwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X2NvdW50KQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHIKJiM0MzsJfTsKJiM0MzsJaW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAob3V0X3RvcCkKJiM0MzsJCSpvdXRfdG9wID0gcmVncy5hMTsKJiM0MzsJaWYgKG91dF9yYW5nZSkKJiM0MzsJCSpvdXRfcmFuZ2UgPSByZWdzLmEyOwomIzQzOwlpZiAob3V0X2NvdW50KQomIzQzOwkJKm91dF9jb3VudCA9IHJlZ3MuYTM7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOyNlbmRpZiAvKiBfX0FTTV9STUlfQ01EU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMKaW5kZXggOWEyMmRmMGM1MTIwZjMuLjRhZTYzYzg5Y2RhOTdkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jCkBAIC0yOTMsNiAmIzQzOzI5Myw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRpc2FyM1tdID0gewogc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NHBmcjBbXSA9IHsKIAlBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0NTVjNfU0hJRlQsIDQsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQ1NWMl9TSElGVCwgNCwgMCksCiYjNDM7CUFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfUk1FX1NISUZULCA0LCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfVklTSUJMRSwgRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9ESVRfU0hJRlQsIDQsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQU1VX1NISUZULCA0LCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX01QQU1fU0hJRlQsIDQsIDApLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnCmluZGV4IDEyZGM3MDI1NDg0MmNlLi41NTU0Mjg3OWZiYjhhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZwpAQCAtMzAxLDUgJiM0MzszMDEsNiBAQCBzb3VyY2UgJiMzNDtkcml2ZXJzL2Zpcm13YXJlL3NhbXN1bmcvS2NvbmZpZyYjMzQ7CiBzb3VyY2UgJiMzNDtkcml2ZXJzL2Zpcm13YXJlL3NtY2NjL0tjb25maWcmIzM0Owogc291cmNlICYjMzQ7ZHJpdmVycy9maXJtd2FyZS90ZWdyYS9LY29uZmlnJiMzNDsKIHNvdXJjZSAmIzM0O2RyaXZlcnMvZmlybXdhcmUveGlsaW54L0tjb25maWcmIzM0OwomIzQzO3NvdXJjZSAmIzM0O2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnJiMzNDsKIAogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUKaW5kZXggNGRkZWMyODIwYzk2ZmEuLjA3ZThjYTE3ODliNDllIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUKQEAgLTM4LDMgJiM0MzszOCw0IEBAIG9iai15CQkJCSYjNDM7PSBzYW1zdW5nLwogb2JqLXkJCQkJJiM0Mzs9IHNtY2NjLwogb2JqLXkJCQkJJiM0Mzs9IHRlZ3JhLwogb2JqLXkJCQkJJiM0Mzs9IHhpbGlueC8KJiM0MztvYmoteQkJCQkmIzQzOz0gYXJtX3JtbS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLmQyMjRhNzJjY2E5MDg5Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWcKQEAgLTAsMCAmIzQzOzEsMjIgQEAKJiM0MzsKJiM0Mztjb25maWcgQVJDSF9TVVBQT1JUU19STU0KJiM0MzsJYm9vbAomIzQzOwomIzQzO2NvbmZpZyBBUk1fUk1NCiYjNDM7CWJvb2wgJiMzNDtSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3IgKFJNTSkgU3VwcG9ydCYjMzQ7CiYjNDM7CWRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19STU0KJiM0MzsJZGVmYXVsdCB5CiYjNDM7CWhlbHAKJiM0MzsJICBTdXBwb3J0IHRoZSBSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3IgKFJNTSkgb24gQXJtIHN5c3RlbXMgdGhhdAomIzQzOwkgIGltcGxlbWVudCB0aGUgUmVhbG0gTWFuYWdlbWVudCBFeHRlbnNpb24gKFJNRSksIGFzIGRlZmluZWQgYnkgdGhlCiYjNDM7CSAgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZS4KJiM0MzsKJiM0MzsJICBUaGUgUk1NIHJ1bnMgaW4gdGhlIFJlYWxtIHdvcmxkIGFuZCBwcm92aWRlcyB0aGUgUmVhbG0gTWFuYWdlbWVudAomIzQzOwkgIEludGVyZmFjZSAoUk1JKSB1c2VkIGJ5IGEgTm9ybWFsIFdvcmxkIGhvc3QgdG8gY3JlYXRlLCBtYW5hZ2UgYW5kIHJ1bgomIzQzOwkgIHByb3RlY3RlZCB2aXJ0dWFsIG1hY2hpbmVzIGNhbGxlZCBSZWFsbXMuIFRoaXMgb3B0aW9uIGJ1aWxkcyB0aGUKJiM0MzsJICBob3N0LXNpZGUgUk1JIHN1cHBvcnQgdXNlZCBieSBLVk0gdG8gZGV0ZWN0IGEgY29tcGF0aWJsZSBSTU0sCiYjNDM7CSAgY29uZmlndXJlIGl0LCBtYW5hZ2UgZGVsZWdhdGVkIG1lbW9yeSBhbmQgZW5hYmxlIFJlYWxtIGd1ZXN0cy4KJiM0MzsKJiM0MzsJICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gZG9lcyBub3QgYnkgaXRzZWxmIG1ha2UgUmVhbG0gZ3Vlc3RzIGF2YWlsYWJsZToKJiM0MzsJICB0aGUgc3lzdGVtIG11c3QgYWxzbyBwcm92aWRlIFJNRS1jYXBhYmxlIGhhcmR3YXJlIGFuZCBmaXJtd2FyZSB3aXRoIGEKJiM0MzsJICBjb21wYXRpYmxlIFJNTSBpbXBsZW1lbnRhdGlvbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uNTFhZWY1Y2MwNGIwMmMKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGUKQEAgLTAsMCAmIzQzOzEsMiBAQAomIzQzOwomIzQzO29iai0kKENPTkZJR19BUk1fUk1NKQk9IHJtaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLmQwYzA4M2JkZjI1MWY0Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jCkBAIC0wLDAgJiM0MzsxLDcyNCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLgomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9jcHVmZWF0dXJlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21lbWJsb2NrLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2FybS1ybWktY21kcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9wcm9jZXNzb3IuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc2xhYi5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDthc20vbWVtb3J5LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9wZ3RhYmxlLWh3ZGVmLmgmZ3Q7CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgYXJtNjRfcm1pX2lzX2F2YWlsYWJsZTsKJiM0MzsKJiM0MzsvKiBDdXJyZW50bHkgb25seSB0aGUgZmlyc3QgMiByZWdpc3RlcnMgYXJlIHVzZWQgYnkgTGludXggKi8KJiM0MzsjZGVmaW5lIFJNSV9GRUFUX1JFR19DT1VOVAkyCiYjNDM7c3RhdGljIF9fcm9fYWZ0ZXJfaW5pdCB1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZ19jYWNoZVtSTUlfRkVBVF9SRUdfQ09VTlRdOwomIzQzOwomIzQzO3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaWQpCiYjNDM7ewomIzQzOwlpZiAoV0FSTl9PTihpZCAmZ3Q7PSBSTUlfRkVBVF9SRUdfQ09VTlQpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXJldHVybiBybWlfZmVhdF9yZWdfY2FjaGVbaWRdOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfZmVhdF9yZWcpOwomIzQzOwomIzQzO2ludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywKJiM0MzsJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsCiYjNDM7CQkgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyByZXQgPSAwOwomIzQzOwl1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgJiM0Mzsgc2l6ZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBvdXRfdG9wOwomIzQzOwomIzQzOwl3aGlsZSAocGh5cyAmbHQ7IHRvcCkgewomIzQzOwkJcmV0ID0gcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUocGh5cywgdG9wLCAmYW1wO291dF90b3ApOwomIzQzOwkJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUykKJiM0MzsJCQlwaHlzID0gb3V0X3RvcDsKJiM0MzsJCWVsc2UgaWYgKHJldCA9PSBSTUlfQlVTWSB8fCByZXQgPT0gUk1JX0JMT0NLRUQpCiYjNDM7CQkJY3B1X3JlbGF4KCk7CiYjNDM7CQllbHNlCiYjNDM7CQkJYnJlYWs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG91dF9waHlzKQomIzQzOwkJKm91dF9waHlzID0gcGh5czsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX2RlbGVnYXRlX3JhbmdlKTsKJiM0MzsKJiM0MztpbnQgcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywKJiM0MzsJCQkgdW5zaWduZWQgbG9uZyBzaXplKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyByZXQgPSAwOwomIzQzOwl1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgJiM0Mzsgc2l6ZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBvdXRfdG9wOwomIzQzOwomIzQzOwl3aGlsZSAocGh5cyAmbHQ7IHRvcCkgewomIzQzOwkJcmV0ID0gcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZShwaHlzLCB0b3AsICZhbXA7b3V0X3RvcCk7CiYjNDM7CQlpZiAocmV0ID09IFJNSV9TVUNDRVNTKQomIzQzOwkJCXBoeXMgPSBvdXRfdG9wOwomIzQzOwkJZWxzZSBpZiAocmV0ID09IFJNSV9CVVNZIHx8IHJldCA9PSBSTUlfQkxPQ0tFRCkKJiM0MzsJCQljcHVfcmVsYXgoKTsKJiM0MzsJCWVsc2UKJiM0MzsJCQlicmVhazsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfdW5kZWxlZ2F0ZV9yYW5nZSk7CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgZG9uYXRlX3JlcV90b19zaXplKHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTsKJiM0MzsKJiM0MzsJcmV0dXJuIEJJVChBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUKDMgLSB1bml0X3NpemUpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcm1pX3NtY2NjX2ludm9rZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzX2luLAomIzQzOwkJCSAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVnc19vdXQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSAqcmVnc19pbjsKJiM0MzsJdW5zaWduZWQgbG9uZyBzdGF0dXM7CiYjNDM7CiYjNDM7CXdoaWxlICgxKSB7CiYjNDM7CQlhcm1fc21jY2NfMV8yX2ludm9rZSgmYW1wO3JlZ3MsIHJlZ3Nfb3V0KTsKJiM0MzsJCXN0YXR1cyA9IFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3Nfb3V0LSZndDthMCk7CiYjNDM7CQlpZiAoc3RhdHVzICE9IFJNSV9CVVNZICZhbXA7JmFtcDsgc3RhdHVzICE9IFJNSV9CTE9DS0VEKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJY3B1X3JlbGF4KCk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX2NvbnRpbnVlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBmbGFncywKJiM0MzsJCQkgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX09QX0NPTlRJTlVFLCBzcm9faGFuZGxlLCBmbGFncwomIzQzOwl9OwomIzQzOwomIzQzOwlybWlfc21jY2NfaW52b2tlKCZhbXA7cmVncywgb3V0X3JlZ3MpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBybWlfb3BfY2FuY2VsKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwKJiM0MzsJCQkgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9PUF9DQU5DRUwsIHNyb19oYW5kbGUKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3JlZ3MsIG91dF9yZWdzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX21lbV9kb25hdGUodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLCB1bnNpZ25lZCBsb25nIGxpc3RfYWRkciwKJiM0MzsJCQkgICAgICB1bnNpZ25lZCBsb25nIGxpc3RfY291bnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiYjNDM7CQkJICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX09QX01FTV9ET05BVEUsIHNyb19oYW5kbGUsIGxpc3RfYWRkciwgbGlzdF9jb3VudCwgZmxhZ3MKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3JlZ3MsIG91dF9yZWdzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX21lbV9yZWNsYWltKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwKJiM0MzsJCQkgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsCiYjNDM7CQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9jb3VudCwKJiM0MzsJCQkgICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnQKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3JlZ3MsIG91dF9yZWdzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cykKJiM0Mzt7CiYjNDM7CWlmIChXQVJOX09OX09OQ0Uocm1pX3VuZGVsZWdhdGVfcGFnZShwaHlzKSkpIHsKJiM0MzsJCS8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovCiYjNDM7CQlyZXR1cm4gLUVCVVNZOwomIzQzOwl9CiYjNDM7CiYjNDM7CWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQocGh5cykpOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwoZnJlZV9kZWxlZ2F0ZWRfcGFnZSk7CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nIGNvdW50KQomIzQzO3sKJiM0MzsJaWYgKFdBUk5fT05fT05DRShzcm8tJmd0O2FkZHJfY291bnQgJmd0OyBSTUlfTUFYX0FERFJfTElTVCkpCiYjNDM7CQlyZXR1cm4gLUVPVkVSRkxPVzsKJiM0MzsKJiM0MzsJaWYgKGNvdW50ICZndDsgUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tJmd0O2FkZHJfY291bnQpCiYjNDM7CQlyZXR1cm4gLUVOT1NQQzsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sCiYjNDM7CQkJCSB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsCiYjNDM7CQkJCSB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSwKJiM0MzsJCQkJIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLAomIzQzOwkJCQkgZ2ZwX3QgZ2ZwKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyB1bml0X3NpemVfYnl0ZXMgPSBkb25hdGVfcmVxX3RvX3NpemUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzaXplID0gdW5pdF9zaXplX2J5dGVzICogY291bnQ7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYWRkcl9yYW5nZTsKJiM0MzsJaW50IHJldDsKJiM0MzsJdm9pZCAqdmlydDsKJiM0MzsJcGh5c19hZGRyX3QgcGh5czsKJiM0MzsKJiM0MzsJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBzcm8tJmd0O2FkZHJfY291bnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLSZndDthZGRyX2xpc3RbaV07CiYjNDM7CiYjNDM7CQlpZiAoUk1JX0FERFJfUkFOR0VfU0laRShlbnRyeSkgPT0gdW5pdF9zaXplICZhbXA7JmFtcDsKJiM0MzsJCSAgICBSTUlfQUREUl9SQU5HRV9DT1VOVChlbnRyeSkgPT0gY291bnQgJmFtcDsmYW1wOwomIzQzOwkJICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgSVNfQUxJR05FRChSTUlfQUREUl9SQU5HRV9BRERSKGVudHJ5KSwgc2l6ZSkpIHsKJiM0MzsJCQlzcm8tJmd0O2FkZHJfY291bnQtLTsKJiM0MzsJCQlzd2FwKHNyby0mZ3Q7YWRkcl9saXN0W3Nyby0mZ3Q7YWRkcl9jb3VudF0sCiYjNDM7CQkJICAgICBzcm8tJmd0O2FkZHJfbGlzdFtpXSk7CiYjNDM7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gcm1pX3Nyb19lbnN1cmVfY2FwYWNpdHkoc3JvLCAxKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXZpcnQgPSBhbGxvY19wYWdlc19leGFjdChzaXplLCBnZnApOwomIzQzOwlpZiAoIXZpcnQpCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsJcGh5cyA9IHZpcnRfdG9fcGh5cyh2aXJ0KTsKJiM0MzsKJiM0MzsJaWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7CiYjNDM7CQlwaHlzX2FkZHJfdCBkZWxlZ2F0ZWRfcGh5czsKJiM0MzsKJiM0MzsJCWlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgc2l6ZSwgJmFtcDtkZWxlZ2F0ZWRfcGh5cykpIHsKJiM0MzsJCQlpZiAoIXJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIGRlbGVnYXRlZF9waHlzIC0gcGh5cykpCiYjNDM7CQkJCWZyZWVfcGFnZXNfZXhhY3QodmlydCwgc2l6ZSk7CiYjNDM7CQkJcmV0dXJuIC1FTlhJTzsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlhZGRyX3JhbmdlID0gcGh5cyAmYW1wOyBSTUlfQUREUl9SQU5HRV9BRERSX01BU0s7CiYjNDM7CUZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TSVpFX01BU0ssICZhbXA7YWRkcl9yYW5nZSwgdW5pdF9zaXplKTsKJiM0MzsJRklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssICZhbXA7YWRkcl9yYW5nZSwgY291bnQpOwomIzQzOwlGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTSywgJmFtcDthZGRyX3JhbmdlLCBzdGF0ZSk7CiYjNDM7CiYjNDM7CXNyby0mZ3Q7YWRkcl9saXN0W3Nyby0mZ3Q7YWRkcl9jb3VudF0gPSBhZGRyX3JhbmdlOwomIzQzOwomIzQzO291dDoKJiM0MzsJcm1pX29wX21lbV9kb25hdGUoc3JvX2hhbmRsZSwKJiM0MzsJCQkgIHZpcnRfdG9fcGh5cygmYW1wO3Nyby0mZ3Q7YWRkcl9saXN0W3Nyby0mZ3Q7YWRkcl9jb3VudF0pLCAxLAomIzQzOwkJCSAgMCwgb3V0X3JlZ3MpOwomIzQzOwomIzQzOwl1bnNpZ25lZCBsb25nIGRvbmF0ZWRfZ3JhbnVsZXMgPSBvdXRfcmVncy0mZ3Q7YTE7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplID0gZG9uYXRlZF9ncmFudWxlcyAmbHQ7Jmx0OyBQQUdFX1NISUZUOwomIzQzOwomIzQzOwlpZiAoZG9uYXRlZF9ncmFudWxlcyA9PSAwKSB7CiYjNDM7CQkvKiBObyBwYWdlcyB1c2VkIGJ5IHRoZSBSTU0gKi8KJiM0MzsJCXNyby0mZ3Q7YWRkcl9jb3VudCYjNDM7JiM0Mzs7CiYjNDM7CX0gZWxzZSBpZiAoZG9uYXRlZF9zaXplICZsdDsgc2l6ZSkgewomIzQzOwkJcGh5cyA9IHNyby0mZ3Q7YWRkcl9saXN0W3Nyby0mZ3Q7YWRkcl9jb3VudF0gJmFtcDsgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLOwomIzQzOwomIzQzOwkJLyogTm90IGFsbCBncmFudWxlcyB1c2VkIGJ5IHRoZSBSTU0sIGZyZWUgdGhlIHJlbWFpbmluZyBwYWdlcyAqLwomIzQzOwkJZm9yIChsb25nIGkgPSBkb25hdGVkX3NpemU7IGkgJmx0OyBzaXplOyBpICYjNDM7PSBQQUdFX1NJWkUpIHsKJiM0MzsJCQlpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpCiYjNDM7CQkJCWZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyAmIzQzOyBpKTsKJiM0MzsJCQllbHNlCiYjNDM7CQkJCV9fZnJlZV9wYWdlKHBoeXNfdG9fcGFnZShwaHlzICYjNDM7IGkpKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfc3JvX2RvbmF0ZV9ub25jb250aWcoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLAomIzQzOwkJCQkgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MsCiYjNDM7CQkJCSAgICBnZnBfdCBnZnApCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9ET05BVEVfU0laRShkb25hdGVyZXEpOwomIzQzOwl1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZV9ieXRlcyA9IGRvbmF0ZV9yZXFfdG9fc2l6ZShkb25hdGVyZXEpOwomIzQzOwl1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0RPTkFURV9DT1VOVChkb25hdGVyZXEpOwomIzQzOwl1bnNpZ25lZCBsb25nIHN0YXRlID0gUk1JX0RPTkFURV9TVEFURShkb25hdGVyZXEpOwomIzQzOwl1bnNpZ25lZCBsb25nIGZvdW5kID0gMDsKJiM0MzsJdW5zaWduZWQgbG9uZyBhZGRyX2xpc3Rfc3RhcnQgPSBzcm8tJmd0O2FkZHJfY291bnQ7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWZvciAoaW50IGkgPSAwOyBpICZsdDsgYWRkcl9saXN0X3N0YXJ0ICZhbXA7JmFtcDsgZm91bmQgJmx0OyBjb3VudDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tJmd0O2FkZHJfbGlzdFtpXTsKJiM0MzsKJiM0MzsJCWlmIChSTUlfQUREUl9SQU5HRV9TSVpFKGVudHJ5KSA9PSB1bml0X3NpemUgJmFtcDsmYW1wOwomIzQzOwkJICAgIFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KSA9PSAxICZhbXA7JmFtcDsKJiM0MzsJCSAgICBSTUlfQUREUl9SQU5HRV9TVEFURShlbnRyeSkgPT0gc3RhdGUpIHsKJiM0MzsJCQlhZGRyX2xpc3Rfc3RhcnQtLTsKJiM0MzsJCQlzd2FwKHNyby0mZ3Q7YWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydF0sCiYjNDM7CQkJICAgICBzcm8tJmd0O2FkZHJfbGlzdFtpXSk7CiYjNDM7CQkJZm91bmQmIzQzOyYjNDM7OwomIzQzOwkJCWktLTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIGNvdW50IC0gZm91bmQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJd2hpbGUgKGZvdW5kICZsdDsgY291bnQpIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkcl9yYW5nZTsKJiM0MzsJCXZvaWQgKnZpcnQgPSBhbGxvY19wYWdlc19leGFjdCh1bml0X3NpemVfYnl0ZXMsIGdmcCk7CiYjNDM7CQlwaHlzX2FkZHJfdCBwaHlzOwomIzQzOwomIzQzOwkJaWYgKCF2aXJ0KQomIzQzOwkJCXJldHVybiAtRU5PTUVNOwomIzQzOwomIzQzOwkJcGh5cyA9IHZpcnRfdG9fcGh5cyh2aXJ0KTsKJiM0MzsKJiM0MzsJCWlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCkgewomIzQzOwkJCXBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzOwomIzQzOwomIzQzOwkJCWlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgdW5pdF9zaXplX2J5dGVzLAomIzQzOwkJCQkJICAgICAgICZhbXA7ZGVsZWdhdGVkX3BoeXMpKSB7CiYjNDM7CQkJCWlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSkKJiM0MzsJCQkJCWZyZWVfcGFnZXNfZXhhY3QodmlydCwgdW5pdF9zaXplX2J5dGVzKTsKJiM0MzsJCQkJcmV0dXJuIC1FTlhJTzsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlhZGRyX3JhbmdlID0gcGh5cyAmYW1wOyBSTUlfQUREUl9SQU5HRV9BRERSX01BU0s7CiYjNDM7CQlGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCAmYW1wO2FkZHJfcmFuZ2UsIHVuaXRfc2l6ZSk7CiYjNDM7CQlGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTSywgJmFtcDthZGRyX3JhbmdlLCAxKTsKJiM0MzsJCUZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCAmYW1wO2FkZHJfcmFuZ2UsIHN0YXRlKTsKJiM0MzsKJiM0MzsJCXNyby0mZ3Q7YWRkcl9saXN0W3Nyby0mZ3Q7YWRkcl9jb3VudCYjNDM7JiM0MztdID0gYWRkcl9yYW5nZTsKJiM0MzsJCWZvdW5kJiM0MzsmIzQzOzsKJiM0MzsJfQomIzQzOwomIzQzOwlybWlfb3BfbWVtX2RvbmF0ZShzcm9faGFuZGxlLAomIzQzOwkJCSAgdmlydF90b19waHlzKCZhbXA7c3JvLSZndDthZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSksCiYjNDM7CQkJICBmb3VuZCwgMCwgb3V0X3JlZ3MpOwomIzQzOwomIzQzOwl1bnNpZ25lZCBsb25nIGRvbmF0ZWRfZ3JhbnVsZXMgPSBvdXRfcmVncy0mZ3Q7YTE7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZ3JhbnVsZXNfcGVyX3VuaXQgPSB1bml0X3NpemVfYnl0ZXMgJmd0OyZndDsgUEFHRV9TSElGVDsKJiM0MzsJdW5zaWduZWQgbG9uZyBjb25zdW1lZF91bml0czsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIFJNTSBzaG91bGRuJiMzOTt0IHJlcG9ydCBtb3JlIGdyYW51bGVzIHRoYW4gd2UgcHJvdmlkZWQsIGJ1dCBjbGFtcAomIzQzOwkgKiBqdXN0IGluIGNhc2UuCiYjNDM7CSAqLwomIzQzOwlpZiAoV0FSTl9PTl9PTkNFKGRvbmF0ZWRfZ3JhbnVsZXMgJmd0OyBmb3VuZCAqIGdyYW51bGVzX3Blcl91bml0KSkKJiM0MzsJCWRvbmF0ZWRfZ3JhbnVsZXMgPSBmb3VuZCAqIGdyYW51bGVzX3Blcl91bml0OwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgUk1NIHJlcG9ydHMgdGhlIGNvbnN1bWVkIG1lbW9yeSBpbiB0ZXJtcyBvZiBncmFudWxlcywgYnV0IHdlCiYjNDM7CSAqIHRyYWNrIGluIHRoZSBhZGRyZXNzIGxpc3RzIGluIHVuaXQtc2l6ZWQgcmFuZ2VzLiBTbyBkaXZpZGUgdG8gZ2V0CiYjNDM7CSAqIHRoZSBudW1iZXIgb2YgKGNvbXBsZXRlKSBjb25zdW1lZCB1bml0cy4KJiM0MzsJICovCiYjNDM7CWNvbnN1bWVkX3VuaXRzID0gZG9uYXRlZF9ncmFudWxlcyAvIGdyYW51bGVzX3Blcl91bml0OwomIzQzOwlpZiAoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl91bml0KSB7CiYjNDM7CQkvKgomIzQzOwkJICogQSB1bml0IGhhcyBiZWVuIHBhcnRpYWxseSBjb25zdW1lZCwgdGhlIHN0YXJ0IGlzIG93bmVkIGJ5CiYjNDM7CQkgKiB0aGUgUk1NLCB0aGUgdGFpbCBpcyBvd25lZCBieSB0aGUgaG9zdAomIzQzOwkJICovCiYjNDM7CQl1bnNpZ25lZCBsb25nIGVudHJ5ID0KJiM0MzsJCQlzcm8tJmd0O2FkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgJiM0MzsgY29uc3VtZWRfdW5pdHNdOwomIzQzOwkJcGh5c19hZGRyX3QgcGh5cyA9IFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpOwomIzQzOwkJdW5zaWduZWQgbG9uZyBkb25hdGVkX3NpemUgPQomIzQzOwkJCShkb25hdGVkX2dyYW51bGVzICUgZ3JhbnVsZXNfcGVyX3VuaXQpICZsdDsmbHQ7IFBBR0VfU0hJRlQ7CiYjNDM7CiYjNDM7CQkvKiBGcmVlIHRoZSB0YWlsIGJhY2sgKi8KJiM0MzsJCWZvciAodW5zaWduZWQgbG9uZyBpID0gZG9uYXRlZF9zaXplOyBpICZsdDsgdW5pdF9zaXplX2J5dGVzOwomIzQzOwkJICAgICBpICYjNDM7PSBQQUdFX1NJWkUpIHsKJiM0MzsJCQlpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpCiYjNDM7CQkJCWZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyAmIzQzOyBpKTsKJiM0MzsJCQllbHNlCiYjNDM7CQkJCV9fZnJlZV9wYWdlKHBoeXNfdG9fcGFnZShwaHlzICYjNDM7IGkpKTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiBUaGlzIHVuaXQgaXMgbm93IGZ1bGx5ICYjMzk7Y29uc3VtZWQmIzM5OyAoZWl0aGVyIGhlbGQgYnkgdGhlIFJNTSBvcgomIzQzOwkJICogZnJlZWQpCiYjNDM7CQkgKi8KJiM0MzsJCWNvbnN1bWVkX3VuaXRzJiM0MzsmIzQzOzsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBLZWVwIGp1c3QgdGhlIHVuaXRzIHRoZSBSTU0gZGlkbiYjMzk7dCB1c2UgaW4gYWRkcl9saXN0ICovCiYjNDM7CWZvciAodW5zaWduZWQgbG9uZyBpID0gY29uc3VtZWRfdW5pdHM7IGkgJmx0OyBmb3VuZDsgaSYjNDM7JiM0MzspCiYjNDM7CQlzcm8tJmd0O2FkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgJiM0MzsgaSAtIGNvbnN1bWVkX3VuaXRzXSA9CiYjNDM7CQkJc3JvLSZndDthZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0ICYjNDM7IGldOwomIzQzOwomIzQzOwlzcm8tJmd0O2FkZHJfY291bnQgLT0gY29uc3VtZWRfdW5pdHM7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sCiYjNDM7CQkJICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsCiYjNDM7CQkJICB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSwKJiM0MzsJCQkgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MsCiYjNDM7CQkJICBnZnBfdCBnZnApCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0RPTkFURV9DT1VOVChkb25hdGVyZXEpOwomIzQzOwomIzQzOwlpZiAoV0FSTl9PTl9PTkNFKCFjb3VudCkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJaWYgKFJNSV9ET05BVEVfQ09OVElHKGRvbmF0ZXJlcSkpIHsKJiM0MzsJCXJldHVybiBybWlfc3JvX2RvbmF0ZV9jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsCiYjNDM7CQkJCQkgICAgIHJlZ3MsIGdmcCk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlyZXR1cm4gcm1pX3Nyb19kb25hdGVfbm9uY29udGlnKHNybywgc3JvX2hhbmRsZSwgZG9uYXRlcmVxLAomIzQzOwkJCQkJCXJlZ3MsIGdmcCk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfc3JvX3JlY2xhaW0oc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywKJiM0MzsJCQkgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsCiYjNDM7CQkJICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIGNhcGFjaXR5OwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcm1pX3Nyb19mcmVlKHNybyk7CiYjNDM7CiYjNDM7CWNhcGFjaXR5ID0gUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tJmd0O2FkZHJfY291bnQ7CiYjNDM7CiYjNDM7CXJtaV9vcF9tZW1fcmVjbGFpbShzcm9faGFuZGxlLAomIzQzOwkJCSAgIHZpcnRfdG9fcGh5cygmYW1wO3Nyby0mZ3Q7YWRkcl9saXN0W3Nyby0mZ3Q7YWRkcl9jb3VudF0pLAomIzQzOwkJCSAgIGNhcGFjaXR5LCBvdXRfcmVncyk7CiYjNDM7CiYjNDM7CWlmIChXQVJOX09OX09OQ0Uob3V0X3JlZ3MtJmd0O2ExICZndDsgY2FwYWNpdHkpKQomIzQzOwkJb3V0X3JlZ3MtJmd0O2ExID0gY2FwYWNpdHk7CiYjNDM7CiYjNDM7CXNyby0mZ3Q7YWRkcl9jb3VudCAmIzQzOz0gb3V0X3JlZ3MtJmd0O2ExOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCBybWlfc3JvX2ZyZWUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybykKJiM0Mzt7CiYjNDM7CWZvciAoaW50IGkgPSAwOyBpICZsdDsgc3JvLSZndDthZGRyX2NvdW50OyBpJiM0MzsmIzQzOykgewomIzQzOwkJdW5zaWduZWQgbG9uZyBlbnRyeSA9IHNyby0mZ3Q7YWRkcl9saXN0W2ldOwomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyID0gUk1JX0FERFJfUkFOR0VfQUREUihlbnRyeSk7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9BRERSX1JBTkdFX1NJWkUoZW50cnkpOwomIzQzOwkJdW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgc3RhdGUgPSBSTUlfQUREUl9SQU5HRV9TVEFURShlbnRyeSk7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHNpemUgPSBkb25hdGVfcmVxX3RvX3NpemUodW5pdF9zaXplKSAqIGNvdW50OwomIzQzOwomIzQzOwkJaWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7CiYjNDM7CQkJaWYgKFdBUk5fT05fT05DRShybWlfdW5kZWxlZ2F0ZV9yYW5nZShhZGRyLCBzaXplKSkpIHsKJiM0MzsJCQkJLyogTGVhayB0aGUgcGFnZXMgKi8KJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwkJZnJlZV9wYWdlc19leGFjdChwaHlzX3RvX3ZpcnQoYWRkciksIHNpemUpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXNyby0mZ3Q7YWRkcl9jb3VudCA9IDA7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fZnJlZSk7CiYjNDM7CiYjNDM7dW5zaWduZWQgbG9uZyBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLCBnZnBfdCBnZnApCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIHNyb19oYW5kbGU7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MgPSAmYW1wO3Nyby0mZ3Q7cmVnczsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZShyZWdzLCByZWdzKTsKJiM0MzsKJiM0MzsJc3JvX2hhbmRsZSA9IHJlZ3MtJmd0O2ExOwomIzQzOwomIzQzOwl3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy0mZ3Q7YTApID09IFJNSV9JTkNPTVBMRVRFKSB7CiYjNDM7CQlib29sIGNhbl9jYW5jZWwgPSBSTUlfUkVUVVJOX0NBTl9DQU5DRUwocmVncy0mZ3Q7YTApOwomIzQzOwkJaW50IHJldCA9IDA7CiYjNDM7CiYjNDM7CQlzd2l0Y2ggKFJNSV9SRVRVUk5fTUVNUkVRKHJlZ3MtJmd0O2EwKSkgewomIzQzOwkJY2FzZSBSTUlfT1BfTUVNX1JFUV9OT05FOgomIzQzOwkJCXJtaV9vcF9jb250aW51ZShzcm9faGFuZGxlLCBSTUlfQ09OVElOVUVfS0VFUF9HT0lORywKJiM0MzsJCQkJCXJlZ3MpOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSBSTUlfT1BfTUVNX1JFUV9ET05BVEU6CiYjNDM7CQkJcmV0ID0gcm1pX3Nyb19kb25hdGUoc3JvLCBzcm9faGFuZGxlLCByZWdzLSZndDthMiwgcmVncywKJiM0MzsJCQkJCSAgICAgZ2ZwKTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCWNhc2UgUk1JX09QX01FTV9SRVFfUkVDTEFJTToKJiM0MzsJCQlyZXQgPSBybWlfc3JvX3JlY2xhaW0oc3JvLCBzcm9faGFuZGxlLCByZWdzKTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCWRlZmF1bHQ6CiYjNDM7CQkJcmV0ID0gV0FSTl9PTl9PTkNFKDEpOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJfQomIzQzOwomIzQzOwkJaWYgKHJldCkgewomIzQzOwkJCWlmIChjYW5fY2FuY2VsKQomIzQzOwkJCQlybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpOwomIzQzOwomIzQzOwkJCWlmIChXQVJOX09OX09OQ0UoUk1JX1JFVFVSTl9TVEFUVVMocmVncy0mZ3Q7YTApICE9IFJNSV9JTkNPTVBMRVRFKSkKJiM0MzsJCQkJcmV0dXJuIHJldDsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gcmVncy0mZ3Q7YTA7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKTsKJiM0MzsKJiM0MzsvKiBGb3IgUk1JIGNvbW1hbmRzIHRoYXQgYXJlIHN0YXRlZnVsIGJ1dCBub3QgbWVtb3J5LXRyYW5zZmVycmluZyAqLwomIzQzO3Vuc2lnbmVkIGxvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIHNyb19oYW5kbGU7CiYjNDM7CiYjNDM7CXJtaV9zbWNjY19pbnZva2UocmVncywgcmVncyk7CiYjNDM7CiYjNDM7CXNyb19oYW5kbGUgPSByZWdzLSZndDthMTsKJiM0MzsKJiM0MzsJd2hpbGUgKFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3MtJmd0O2EwKSA9PSBSTUlfSU5DT01QTEVURSkgewomIzQzOwkJYm9vbCBjYW5fY2FuY2VsID0gUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJlZ3MtJmd0O2EwKTsKJiM0MzsKJiM0MzsJCXN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy0mZ3Q7YTApKSB7CiYjNDM7CQljYXNlIFJNSV9PUF9NRU1fUkVRX05PTkU6CiYjNDM7CQkJcm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLAomIzQzOwkJCQkJcmVncyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlkZWZhdWx0OgomIzQzOwkJCVdBUk5fT05fT05DRSgxKTsKJiM0MzsJCQlpZiAoIWNhbl9jYW5jZWwpCiYjNDM7CQkJCXJldHVybiByZWdzLSZndDthMDsKJiM0MzsKJiM0MzsJCQlybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiByZWdzLSZndDthMDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19leGVjdXRlKTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9jaGVja192ZXJzaW9uKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7CiYjNDM7CXVuc2lnbmVkIHNob3J0IHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3I7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaG9zdF92ZXJzaW9uID0gUk1JX0FCSV9WRVJTSU9OKFJNSV9BQklfTUFKT1JfVkVSU0lPTiwKJiM0MzsJCQkJCQkgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYWE2NHBmcjAgPSByZWFkX3Nhbml0aXNlZF9mdHJfcmVnKFNZU19JRF9BQTY0UEZSMF9FTDEpOwomIzQzOwomIzQzOwkvKiBJZiBSTUUgaXNuJiMzOTt0IHN1cHBvcnRlZCwgdGhlbiBSTUkgY2FuJiMzOTt0IGJlICovCiYjNDM7CWlmIChjcHVpZF9mZWF0dXJlX2V4dHJhY3RfdW5zaWduZWRfZmllbGQoYWE2NHBmcjAsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQpID09IDApCiYjNDM7CQlyZXR1cm4gLUVOWElPOwomIzQzOwomIzQzOwlhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1ZFUlNJT04sIGhvc3RfdmVyc2lvbiwgJmFtcDtyZXMpOwomIzQzOwomIzQzOwlpZiAocmVzLmEwID09IFNNQ0NDX1JFVF9OT1RfU1VQUE9SVEVEKQomIzQzOwkJcmV0dXJuIC1FTlhJTzsKJiM0MzsKJiM0MzsJdmVyc2lvbl9tYWpvciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IocmVzLmExKTsKJiM0MzsJdmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmExKTsKJiM0MzsKJiM0MzsJaWYgKHJlcy5hMCAhPSBSTUlfU1VDQ0VTUykgewomIzQzOwkJdW5zaWduZWQgc2hvcnQgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3I7CiYjNDM7CiYjNDM7CQloaWdoX3ZlcnNpb25fbWFqb3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHJlcy5hMik7CiYjNDM7CQloaWdoX3ZlcnNpb25fbWlub3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHJlcy5hMik7CiYjNDM7CiYjNDM7CQlwcl9lcnIoJiMzNDtVbnN1cHBvcnRlZCBSTUkgQUJJICh2JWQuJWQgLSB2JWQuJWQpIHdlIHdhbnQgdiVkLiVkXG4mIzM0OywKJiM0MzsJCSAgICAgICB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yLAomIzQzOwkJICAgICAgIGhpZ2hfdmVyc2lvbl9tYWpvciwgaGlnaF92ZXJzaW9uX21pbm9yLAomIzQzOwkJICAgICAgIFJNSV9BQklfTUFKT1JfVkVSU0lPTiwKJiM0MzsJCSAgICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pOwomIzQzOwkJcmV0dXJuIC1FTlhJTzsKJiM0MzsJfQomIzQzOwomIzQzOwlwcl9pbmZvKCYjMzQ7Uk1JIEFCSSB2ZXJzaW9uICVkLiVkXG4mIzM0OywgdmVyc2lvbl9tYWpvciwgdmVyc2lvbl9taW5vcik7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9yZWFkX2ZlYXR1cmVzKHZvaWQpCiYjNDM7ewomIzQzOwkvKgomIzQzOwkgKiBTaW5jZSB3ZSYjMzk7dmUgbmVnb3RpYXRlZCBhIGNvbXBhdGlibGUgdmVyc2lvbiB0aGVzZSBmZWF0dXJlIHJlZ2lzdGVycwomIzQzOwkgKiBzaG91bGQgYWx3YXlzIGJlIGF2YWlsYWJsZQomIzQzOwkgKi8KJiM0MzsJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBSTUlfRkVBVF9SRUdfQ09VTlQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoV0FSTl9PTihybWlfZmVhdHVyZXMoaSwgJmFtcDtybWlfZmVhdF9yZWdfY2FjaGVbaV0pKSkKJiM0MzsJCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfY29uZmlndXJlKHZvaWQpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIHJldDsKJiM0MzsJc3RydWN0IHJtbV9jb25maWcgKmNvbmZpZyBfX2ZyZWUoZnJlZV9wYWdlKSA9IChzdHJ1Y3Qgcm1tX2NvbmZpZyAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKJiM0MzsJc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyBfX2ZyZWUoa2ZyZWUpID0gKHN0cnVjdCBybWlfc3JvX3N0YXRlICopa21hbGxvY19vYmooKnNybyk7CiYjNDM7CiYjNDM7CWlmICghY29uZmlnIHx8ICFzcm8pCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJc3dpdGNoIChQQUdFX1NJWkUpIHsKJiM0MzsJY2FzZSBTWl80SzoKJiM0MzsJCWNvbmZpZy0mZ3Q7cm1pX2dyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNEtCOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgU1pfMTZLOgomIzQzOwkJY29uZmlnLSZndDtybWlfZ3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV8xNktCOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgU1pfNjRLOgomIzQzOwkJY29uZmlnLSZndDtybWlfZ3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV82NEtCOwomIzQzOwkJYnJlYWs7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlCVUlMRF9CVUcoKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBGb3Igbm93IHdlIHNldCB0aGUgdHJhY2tpbmdfcmVnaW9uX3NpemUgdG8gMCB3aGljaCBpcyB0aGUgb25seSBvcHRpb24KJiM0MzsJICogZm9yIDRLQiBQQUdFX1NJWkUgKDFHQiBmb3IgNEtCIFBBR0VfU0laRSwgMzJNQi81MTJNQiBmb3IgMTZLQi82NEtCKS4KJiM0MzsJICogVE9ETzogU3VwcG9ydCBvdGhlciB0cmFja2luZyBzaXplcyB2aWEgS2NvbmZpZyBvcHRpb24gZm9yIG90aGVyCiYjNDM7CSAqIFBBR0VfU0laRVMKJiM0MzsJICovCiYjNDM7CWNvbmZpZy0mZ3Q7dHJhY2tpbmdfcmVnaW9uX3NpemUgPSAwOwomIzQzOwomIzQzOwlyZXQgPSBybWlfcm1tX2NvbmZpZ19zZXQodmlydF90b19waHlzKGNvbmZpZykpOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlwcl9lcnIoJiMzNDtSTU0gY29uZmlnIHNldCBmYWlsZWRcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IHJtaV9ybW1fYWN0aXZhdGUoc3JvKTsKJiM0MzsJaWYgKHJldCkgewomIzQzOwkJcHJfZXJyKCYjMzQ7Uk1NIGFjdGl2YXRlIGZhaWxlZFxuJiMzNDspOwomIzQzOwkJcmV0dXJuIC1FTlhJTzsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBNYWtlIHN1cmUgdGhlIGFyZWEgaXMgdHJhY2tlZCBieSBSTU0gYXQgRklORSBncmFudWxhcml0eS4KJiM0MzsgKiBXZSBkbyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aGUgdHJhY2tpbmcgeWV0LgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZCkKJiM0Mzt7CiYjNDM7CXdoaWxlIChzdGFydCAmbHQ7IGVuZCkgewomIzQzOwkJdW5zaWduZWQgbG9uZyByZXQsIGNhdGVnb3J5LCBzdGF0ZSwgbmV4dDsKJiM0MzsKJiM0MzsJCXJldCA9IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldChzdGFydCwgZW5kLCAmYW1wO2NhdGVnb3J5LCAmYW1wO3N0YXRlLCAmYW1wO25leHQpOwomIzQzOwkJaWYgKHJldCAhPSBSTUlfU1VDQ0VTUyB8fAomIzQzOwkJICAgIHN0YXRlICE9IFJNSV9UUkFDS0lOR19GSU5FIHx8CiYjNDM7CQkgICAgY2F0ZWdvcnkgIT0gUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUwpIHsKJiM0MzsJCQkvKiBUT0RPOiBTZXQgZ3JhbnVsZSB0cmFja2luZyBpbiB0aGlzIGNhc2UgKi8KJiM0MzsJCQlwcl9lcnIoJiMzNDtHcmFudWxlIHRyYWNraW5nIGZvciByZWdpb24gaXNuJiMzOTt0IGZpbmUvY29udmVudGlvbmFsOiAlbGx4XG4mIzM0OywKJiM0MzsJCQkgICAgICAgc3RhcnQpOwomIzQzOwkJCXJldHVybiAtRU5PREVWOwomIzQzOwkJfQomIzQzOwkJc3RhcnQgPSBuZXh0OwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9jcmVhdGVfZ3B0cyhwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKQomIzQzO3sKJiM0MzsJc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybzsKJiM0MzsJdW5zaWduZWQgbG9uZyBsMGdwdF9zejsKJiM0MzsKJiM0MzsJc3JvID0ga21hbGxvY19vYmooKnNybywgR0ZQX0tFUk5FTCk7CiYjNDM7CWlmICghc3JvKQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiYjNDM7CWwwZ3B0X3N6ID0gMVVMICZsdDsmbHQ7ICgzMCAmIzQzOyBGSUVMRF9HRVQoUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9MMEdQVFNaLAomIzQzOwkJCQkJICBybWlfZmVhdF9yZWcoMSkpKTsKJiM0MzsJc3RhcnQgPSBBTElHTl9ET1dOKHN0YXJ0LCBsMGdwdF9zeik7CiYjNDM7CWVuZCA9IEFMSUdOKGVuZCwgbDBncHRfc3opOwomIzQzOwomIzQzOwl3aGlsZSAoc3RhcnQgJmx0OyBlbmQpIHsKJiM0MzsJCWludCByZXQgPSBybWlfZ3B0X2wxX2NyZWF0ZShzdGFydCwgc3JvLCBHRlBfS0VSTkVMKTsKJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiBNYWtlIHN1cmUgdGhlIEwxIEdQVCB0YWJsZXMgYXJlIGNyZWF0ZWQgZm9yIHRoZSByZWdpb24uCiYjNDM7CQkgKiBSTUlfRVJST1JfR1BUIGluZGljYXRlcyB0aGUgTDEgdGFibGUgYWxyZWFkeSBleGlzdHMuCiYjNDM7CQkgKi8KJiM0MzsJCWlmIChyZXQgIT0gUk1JX1NVQ0NFU1MgJmFtcDsmYW1wOyBSTUlfUkVUVVJOX1NUQVRVUyhyZXQpICE9IFJNSV9FUlJPUl9HUFQpIHsKJiM0MzsJCQlwcl9lcnIoJiMzNDtHUFQgTGV2ZWwxIHRhYmxlIG1pc3NpbmcgZm9yICVsbHhcbiYjMzQ7LCBzdGFydCk7CiYjNDM7CQkJa2ZyZWUoc3JvKTsKJiM0MzsJCQlyZXR1cm4gLUVOT01FTTsKJiM0MzsJCX0KJiM0MzsJCXN0YXJ0ICYjNDM7PSBsMGdwdF9zejsKJiM0MzsJfQomIzQzOwomIzQzOwlrZnJlZShzcm8pOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfaW5pdF9tZXRhZGF0YSh2b2lkKQomIzQzO3sKJiM0MzsJcGh5c19hZGRyX3Qgc3RhcnQsIGVuZDsKJiM0MzsJY29uc3Qgc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcjsKJiM0MzsKJiM0MzsJZm9yX2VhY2hfbWVtX3JlZ2lvbihyKSB7CiYjNDM7CQlpbnQgcmV0OwomIzQzOwomIzQzOwkJc3RhcnQgPSBtZW1ibG9ja19yZWdpb25fbWVtb3J5X2Jhc2VfcGZuKHIpICZsdDsmbHQ7IFBBR0VfU0hJRlQ7CiYjNDM7CQllbmQgPSBtZW1ibG9ja19yZWdpb25fbWVtb3J5X2VuZF9wZm4ocikgJmx0OyZsdDsgUEFHRV9TSElGVDsKJiM0MzsJCXJldCA9IHJtaV92ZXJpZnlfbWVtb3J5X3RyYWNraW5nKHN0YXJ0LCBlbmQpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwkJcmV0ID0gcm1pX2NyZWF0ZV9ncHRzKHN0YXJ0LCBlbmQpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0Mztib29sIGlzX3JtaV9hdmFpbGFibGUodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBhcm02NF9ybWlfaXNfYXZhaWxhYmxlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IF9faW5pdCBhcm02NF9pbml0X3JtaSh2b2lkKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJLyogQ29udGludWUgd2l0aG91dCByZWFsbSBzdXBwb3J0IGlmIHdlIGNhbiYjMzk7dCBhZ3JlZSBvbiBhIHZlcnNpb24gKi8KJiM0MzsJcmV0ID0gcm1pX2NoZWNrX3ZlcnNpb24oKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IHJtaV9yZWFkX2ZlYXR1cmVzKCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBybWlfY29uZmlndXJlKCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBybWlfaW5pdF9tZXRhZGF0YSgpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJYXJtNjRfcm1pX2lzX2F2YWlsYWJsZSA9IHRydWU7CiYjNDM7CXByX2luZm8oJiMzNDtSTUkgY29uZmlndXJlZCYjMzQ7KTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogTm90ZSBhcm02NF9pbml0X3JtaSgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBrdm1faW5pdF9ybWkoKSBvdGhlcndpc2UgS1ZNCiYjNDM7ICogd2lsbCBub3Qgc3VwcG9ydCByZWFsbSBndWVzdHMuIHN1YnN5c19pbml0Y2FsbCgpIGlzIGNhbGxlZCBiZWZvcmUKJiM0MzsgKiBtb2R1bGVfaW5pdCgpICh1c2VkIGZvciBLVk0pIHNvIHRoaXMgaXMgT0suCiYjNDM7ICovCiYjNDM7c3Vic3lzX2luaXRjYWxsKGFybTY0X2luaXRfcm1pKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmggYi9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi4xMzg5ODNhYjRlM2MyMgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmgKQEAgLTAsMCAmIzQzOzEsMjA1IEBACiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KJiM0MzsvKgomIzQzOyAqIENvcHlyaWdodCAoQykgMjAyNiBBUk0gTHRkLgomIzQzOyAqLwomIzQzOwomIzQzOyNpZm5kZWYgX19MSU5VWF9BUk1fUk1JX0NNRFNfSF8KJiM0MzsjZGVmaW5lIF9fTElOVVhfQVJNX1JNSV9DTURTX0hfCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2FybS1zbWNjYy1ybWkuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnVnLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9wYWdlLmgmZ3Q7CiYjNDM7CiYjNDM7c3RydWN0IHJ0dF9lbnRyeSB7CiYjNDM7CXVuc2lnbmVkIGxvbmcgd2Fsa19sZXZlbDsKJiM0MzsJdW5zaWduZWQgbG9uZyBkZXNjOwomIzQzOwlpbnQgc3RhdGU7CiYjNDM7CWludCByaXBhczsKJiM0Mzt9OwomIzQzOwomIzQzOyNkZWZpbmUgUk1JX01BWF9BRERSX0xJU1QJMjU2CiYjNDM7CiYjNDM7c3RydWN0IHJtaV9zcm9fc3RhdGUgewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3M7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYWRkcl9jb3VudDsKJiM0MzsJdW5zaWduZWQgbG9uZyBhZGRyX2xpc3RbUk1JX01BWF9BRERSX0xJU1RdOwomIzQzO307CiYjNDM7CiYjNDM7dW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWcodW5zaWduZWQgbG9uZyBpZCk7CiYjNDM7CiYjNDM7aW50IHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUsCiYjNDM7CQkgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKTsKJiM0MztpbnQgcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplKTsKJiM0MztpbnQgZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzX2FkZHJfdCBwaHlzKTsKJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfZGVsZWdhdGVfcGFnZShwaHlzX2FkZHJfdCBwaHlzKQomIzQzO3sKJiM0MzsJcmV0dXJuIHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCBQQUdFX1NJWkUsIE5VTEwpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfdW5kZWxlZ2F0ZV9wYWdlKHBoeXNfYWRkcl90IHBoeXMpCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7Ym9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpOwomIzQzOwomIzQzO3Vuc2lnbmVkIGxvbmcgcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywgZ2ZwX3QgZ2ZwKTsKJiM0Mzt2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKTsKJiM0Mzt1bnNpZ25lZCBsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKTsKJiM0MzsKJiM0MzsjZGVmaW5lIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBnZnAsIC4uLikgKHsJCQkJXAomIzQzOwlzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqX19zcm8gPSAoc3JvKTsJCQkJXAomIzQzOwkqX19zcm8gPSAoc3RydWN0IHJtaV9zcm9fc3RhdGUpeyAucmVncyA9IHtfX1ZBX0FSR1NfX30gfTsJXAomIzQzOwlpbnQgX19yZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShfX3NybywgZ2ZwKTsJCVwKJiM0MzsJcm1pX3Nyb19mcmVlKF9fc3JvKTsJCQkJCQlcCiYjNDM7CV9fcmV0OwkJCQkJCQkJXAomIzQzO30pCiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3JtbV9jb25maWdfc2V0KCkgLSBDb25maWd1cmUgdGhlIFJNTQomIzQzOyAqIEBjZmdfcHRyOiBQQSBvZiBhIHN0cnVjdCBybW1fY29uZmlnCiYjNDM7ICoKJiM0MzsgKiBTZXRzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiB0aGUgUk1NLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcm1tX2NvbmZpZ19zZXQodW5zaWduZWQgbG9uZyBjZmdfcHRyKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY19yZXMgcmVzOwomIzQzOwomIzQzOwlhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1JNTV9DT05GSUdfU0VULCBjZmdfcHRyLCAmYW1wO3Jlcyk7CiYjNDM7CiYjNDM7CXJldHVybiByZXMuYTA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ybW1fYWN0aXZhdGUoKSAtIEFjdGl2YXRlIHRoZSBSTU0KJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZAomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcm1tX2FjdGl2YXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUk1NX0FDVElWQVRFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KCkgLSBHZXQgY29uZmlndXJhdGlvbiBvZiBhIEdyYW51bGUgdHJhY2tpbmcgcmVnaW9uCiYjNDM7ICogQHN0YXJ0OiBCYXNlIFBBIG9mIHRoZSB0cmFja2luZyByZWdpb24KJiM0MzsgKiBAZW5kOiBFbmQgb2YgdGhlIFBBIHJlZ2lvbgomIzQzOyAqIEBvdXRfY2F0ZWdvcnk6IE1lbW9yeSBjYXRlZ29yeQomIzQzOyAqIEBvdXRfc3RhdGU6IFRyYWNraW5nIHJlZ2lvbiBzdGF0ZQomIzQzOyAqIEBvdXRfdG9wOiBUb3Agb2YgdGhlIG1lbW9yeSByZWdpb24KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KHVuc2lnbmVkIGxvbmcgc3RhcnQsCiYjNDM7CQkJCQkgICB1bnNpZ25lZCBsb25nIGVuZCwKJiM0MzsJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm91dF9jYXRlZ29yeSwKJiM0MzsJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm91dF9zdGF0ZSwKJiM0MzsJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7CiYjNDM7CiYjNDM7CWFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVQsIHN0YXJ0LCBlbmQsICZhbXA7cmVzKTsKJiM0MzsKJiM0MzsJaWYgKG91dF9jYXRlZ29yeSkKJiM0MzsJCSpvdXRfY2F0ZWdvcnkgPSByZXMuYTE7CiYjNDM7CWlmIChvdXRfc3RhdGUpCiYjNDM7CQkqb3V0X3N0YXRlID0gcmVzLmEyOwomIzQzOwlpZiAob3V0X3RvcCkKJiM0MzsJCSpvdXRfdG9wID0gcmVzLmEzOwomIzQzOwomIzQzOwlyZXR1cm4gcmVzLmEwOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfZ3B0X2wxX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgTGV2ZWwgMSBHUFQKJiM0MzsgKiBAYWRkcjogQmFzZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lvbiBkZXNjcmliZWQgYnkgdGhlIEwxR1BUCiYjNDM7ICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWQKJiM0MzsgKiBAZ2ZwOiBBbGxvY2F0aW9uIGZsYWdzIGZvciBTUk8gbWVtb3J5IGRvbmF0aW9uIHJlcXVlc3RzCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ncHRfbDFfY3JlYXRlKHVuc2lnbmVkIGxvbmcgYWRkciwKJiM0MzsJCQkJICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sCiYjNDM7CQkJCSAgICBnZnBfdCBnZnApCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIGdmcCwgU01DX1JNSV9HUFRfTDFfQ1JFQVRFLCBhZGRyKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX2ZlYXR1cmVzKCkgLSBSZWFkIGZlYXR1cmUgcmVnaXN0ZXIKJiM0MzsgKiBAaW5kZXg6IEZlYXR1cmUgcmVnaXN0ZXIgaW5kZXgKJiM0MzsgKiBAb3V0OiBGZWF0dXJlIHJlZ2lzdGVyIHZhbHVlIGlzIHdyaXR0ZW4gdG8gdGhpcyBwb2ludGVyCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9mZWF0dXJlcyh1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nICpvdXQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7CiYjNDM7CiYjNDM7CWFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfRkVBVFVSRVMsIGluZGV4LCAmYW1wO3Jlcyk7CiYjNDM7CiYjNDM7CWlmIChvdXQpCiYjNDM7CQkqb3V0ID0gcmVzLmExOwomIzQzOwlyZXR1cm4gcmVzLmEwOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSgpIC0gRGVsZWdhdGUgZ3JhbnVsZXMKJiM0MzsgKiBAYmFzZTogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgb2YgdGhlIHJhbmdlCiYjNDM7ICogQHRvcDogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgYWZ0ZXIgdGhlIHJhbmdlCiYjNDM7ICogQG91dF90b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG5vdCBkZWxlZ2F0ZWQKJiM0MzsgKgomIzQzOyAqIERlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZSBmb3IgdXNlIGJ5IHRoZSByZWFsbSB3b3JsZC4gSWYgdGhlIGVudGlyZSByYW5nZQomIzQzOyAqIHdhcyBkZWxlZ2F0ZWQgdGhlbiBAb3V0X3RvcCA9PSBAdG9wLCBvdGhlcndpc2UgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQKJiM0MzsgKiBhZ2FpbiB3aXRoIEBiYXNlID09IEBvdXRfdG9wLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsCiYjNDM7CQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkJICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFLCBiYXNlLCB0b3AKJiM0MzsJfTsKJiM0MzsJaW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAob3V0X3RvcCkKJiM0MzsJCSpvdXRfdG9wID0gcmVncy5hMTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSgpIC0gVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzCiYjNDM7ICogQGJhc2U6IEJhc2UgUEEgb2YgdGhlIHRhcmdldCByYW5nZQomIzQzOyAqIEB0b3A6IFRvcCBQQSBvZiB0aGUgdGFyZ2V0IHJhbmdlCiYjNDM7ICogQG91dF90b3A6IFJldHVybnMgdGhlIHRvcCBQQSBvZiByYW5nZSB3aG9zZSBzdGF0ZSBpcyB1bmRlbGVnYXRlZAomIzQzOyAqCiYjNDM7ICogVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzIHRvIGFsbG93IHVzZSBieSB0aGUgbm9ybWFsIHdvcmxkLiBXaWxsIGZhaWwgaWYKJiM0MzsgKiB0aGUgZ3JhbnVsZXMgYXJlIGluIHVzZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsCiYjNDM7CQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB0b3AsCiYjNDM7CQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfR1JBTlVMRV9SQU5HRV9VTkRFTEVHQVRFLCBiYXNlLCB0b3AKJiM0MzsJfTsKJiM0MzsJaW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAob3V0X3RvcCkKJiM0MzsJCSpvdXRfdG9wID0gcmVncy5hMTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7I2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaCBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi5jOTY1ZTg4Njc1MThmMwotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oCkBAIC0wLDAgJiM0MzsxLDQ5OSBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCiYjNDM7LyoKJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLgomIzQzOyAqCiYjNDM7ICogVGhlIHZhbHVlcyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgYXJlIGZyb20gdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvcgomIzQzOyAqIHNwZWNpZmljYXRpb24gKERFTjAxMzcpIHZlcnNpb24gMi4wLWJldDI6CiYjNDM7ICogaHR0cHM6Ly9kZXZlbG9wZXIuYXJtLmNvbS9kb2N1bWVudGF0aW9uL2RlbjAxMzcvMi0wYmV0Mi8KJiM0MzsgKi8KJiM0MzsKJiM0MzsjaWZuZGVmIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IXwomIzQzOyNkZWZpbmUgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2FybS1zbWNjYy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9iaXRmaWVsZC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9iaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J1aWxkX2J1Zy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zaXplcy5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDthc20vcGFnZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDthc20vc3lzcmVnLmgmZ3Q7CiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX0NBTEwoZnVuYykJCQkJXAomIzQzOwlBUk1fU01DQ0NfQ0FMTF9WQUwoQVJNX1NNQ0NDX0ZBU1RfQ0FMTCwJCVwKJiM0MzsJCQkgICBBUk1fU01DQ0NfU01DXzY0LAkJXAomIzQzOwkJCSAgIEFSTV9TTUNDQ19PV05FUl9TVEFOREFSRCwJXAomIzQzOwkJCSAgIChmdW5jKSkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkVSU0lPTgkJCQlTTUNfUk1JX0NBTEwoMHgwMTUwKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9NQVBfSU5JVAkJU01DX1JNSV9DQUxMKDB4MDE1MykKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVBTE1fQUNUSVZBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTU3KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTU4KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE1OSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVDX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxNWEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQ19ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE1YikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVDX0VOVEVSCQkJU01DX1JNSV9DQUxMKDB4MDE1YykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxNWQpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE1ZSkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1JFQURfRU5UUlkJCQlTTUNfUk1JX0NBTEwoMHgwMTYxKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1ZBTElEQVRFCQlTTUNfUk1JX0NBTEwoMHgwMTYzKQomIzQzOyNkZWZpbmUgU01DX1JNSV9QU0NJX0NPTVBMRVRFCQkJU01DX1JNSV9DQUxMKDB4MDE2NCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfRkVBVFVSRVMJCQlTTUNfUk1JX0NBTEwoMHgwMTY1KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfRk9MRAkJCVNNQ19STUlfQ0FMTCgweDAxNjYpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9JTklUX1JJUEFTCQkJU01DX1JNSV9DQUxMKDB4MDE2OCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9SSVBBUwkJCVNNQ19STUlfQ0FMTCgweDAxNjkpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxNmEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMTZiKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9STU1fQ09ORklHX1NFVAkJCVNNQ19STUlfQ0FMTCgweDAxNmUpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX0lSUV9OT1RJRlkJCVNNQ19STUlfQ0FMTCgweDAxNmYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0FUVEVTVF9QTEFUX1RPS0VOX1JFRlJFU0gJU01DX1JNSV9DQUxMKDB4MDE3MCkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9BQk9SVAkJCVNNQ19STUlfQ0FMTCgweDAxNzQpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQ09NTVVOSUNBVEUJCVNNQ19STUlfQ0FMTCgweDAxNzUpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQ1JFQVRFCQkJU01DX1JNSV9DQUxMKDB4MDE3NikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE3NykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9HRVRfU1RBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTc4KQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUkVGUkVTSAkJU01DX1JNSV9DQUxMKDB4MDE3YSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TRVRfUFVCS0VZCQkJU01DX1JNSV9DQUxMKDB4MDE3YikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVE9QCQkJU01DX1JNSV9DQUxMKDB4MDE3YykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTdkKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMTdlKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0ZPTEQJCQlTTUNfUk1JX0NBTEwoMHgwMTdmKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0FCT1JUCQkJU01DX1JNSV9DQUxMKDB4MDE4NSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9DT01NVU5JQ0FURQkJU01DX1JNSV9DQUxMKDB4MDE4NikKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTg3KQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMTg4KQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9TVEFURQkJCVNNQ19STUlfQ0FMTCgweDAxODkpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfVU5MT0NLCQkJU01DX1JNSV9DQUxMKDB4MDE4YSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9TMkFQCQkJU01DX1JNSV9DQUxMKDB4MDE4YikKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfSU5URVJGQUNFX1JFUE9SVAlTTUNfUk1JX0NBTEwoMHgwMWQwKQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9NRUFTVVJFTUVOVFMJCVNNQ19STUlfQ0FMTCgweDAxZDEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfTE9DSwkJCVNNQ19STUlfQ0FMTCgweDAxZDIpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfU1RBUlQJCQlTTUNfUk1JX0NBTEwoMHgwMWQzKQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX1AyUF9CSU5ECQkJU01DX1JNSV9DQUxMKDB4MDFkNCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9QMlBfVU5CSU5ECQkJU01DX1JNSV9DQUxMKDB4MDFkNSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfRVZFTlRfSEFORExFCQlTTUNfUk1JX0NBTEwoMHgwMWQ2KQomIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9BQ1RJVkFURQkJCVNNQ19STUlfQ0FMTCgweDAxZDcpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX0RFQUNUSVZBVEUJCVNNQ19STUlfQ0FMTCgweDAxZDgpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX1NUX0wyX0NSRUFURQkJU01DX1JNSV9DQUxMKDB4MDFkYikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfREVTVFJPWQkJU01DX1JNSV9DQUxMKDB4MDFkYykKJiM0MzsjZGVmaW5lIFNNQ19STUlfRFBUX0wwX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxZGQpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0RQVF9MMF9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDFkZSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfRFBUX0wxX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxZGYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0RQVF9MMV9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDFlMCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVQJCVNNQ19STUlfQ0FMTCgweDAxZTEpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfU0VUCQlTTUNfUk1JX0NBTEwoMHgwMWUzKQomIzQzOyNkZWZpbmUgU01DX1JNSV9DTUVNX0FERF9QREVWCQkJU01DX1JNSV9DQUxMKDB4MDFlNCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfQ01FTV9DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMWU1KQomIzQzOyNkZWZpbmUgU01DX1JNSV9DTUVNX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMWU2KQomIzQzOyNkZWZpbmUgU01DX1JNSV9DTUVNX1BPUFVMQVRFCQkJU01DX1JNSV9DQUxMKDB4MDFlNykKJiM0MzsjZGVmaW5lIFNNQ19STUlfQ01FTV9SRU1PVkVfUERFVgkJU01DX1JNSV9DQUxMKDB4MDFlOCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfQ01FTV9TVEFSVAkJCVNNQ19STUlfQ0FMTCgweDAxZTkpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0NNRU1fU1RPUAkJCVNNQ19STUlfQ0FMTCgweDAxZWEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0NNRU1fVU5QT1BVTEFURQkJCVNNQ19STUlfQ0FMTCgweDAxZWIpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9DT05GSUdfR0VUCQkJU01DX1JNSV9DQUxMKDB4MDFlYykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9NRUNfUkVGUkVTSAkJU01DX1JNSV9DQUxMKDB4MDFlZCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUk1NX1NUQVRFX0dFVAkJCVNNQ19STUlfQ0FMTCgweDAxZWUpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX0VWRU5UX0NPTlNVTUUJCVNNQ19STUlfQ0FMTCgweDAxZjApCiYjNDM7I2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfUkFOR0VfREVMRUdBVEUJCVNNQ19STUlfQ0FMTCgweDAxZjEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfUkFOR0VfVU5ERUxFR0FURQlTTUNfUk1JX0NBTEwoMHgwMWYyKQomIzQzOyNkZWZpbmUgU01DX1JNSV9HUFRfTDFfQ1JFQVRFCQkJU01DX1JNSV9DQUxMKDB4MDFmMykKJiM0MzsjZGVmaW5lIFNNQ19STUlfR1BUX0wxX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMWY0KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9NQVAJCQlTTUNfUk1JX0NBTEwoMHgwMWY1KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9VTk1BUAkJCVNNQ19STUlfQ0FMTCgweDAxZjYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9ERVZfTUFQCQkJU01DX1JNSV9DQUxMKDB4MDFmNykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9VTk1BUAkJCVNNQ19STUlfQ0FMTCgweDAxZjgpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9NQVAJCVNNQ19STUlfQ0FMTCgweDAxZjkpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9VTk1BUAkJU01DX1JNSV9DQUxMKDB4MDFmYSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1VOUFJPVF9NQVAJCQlTTUNfUk1JX0NBTEwoMHgwMWZiKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQCQlTTUNfUk1JX0NBTEwoMHgwMWZjKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1BST1RfTUFQCQlTTUNfUk1JX0NBTEwoMHgwMWZkKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1BST1RfVU5NQVAJCVNNQ19STUlfQ0FMTCgweDAxZmUpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX01BUAkJU01DX1JNSV9DQUxMKDB4MDFmZikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9VTlBST1RfVU5NQVAJCVNNQ19STUlfQ0FMTCgweDAyMDApCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQUxNX1RFUk1JTkFURQkJCVNNQ19STUlfQ0FMTCgweDAyMDEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9BQ1RJVkFURQkJCVNNQ19STUlfQ0FMTCgweDAyMDIpCiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX0NPTlRJTlVFCQkJU01DX1JNSV9DQUxMKDB4MDIwMykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fQ09OTkVDVAkJU01DX1JNSV9DQUxMKDB4MDIwNCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fRElTQ09OTkVDVAkJU01DX1JNSV9DQUxMKDB4MDIwNSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fQ09NUExFVEUJCVNNQ19STUlfQ0FMTCgweDAyMDYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0tFWV9QVVJHRQkJU01DX1JNSV9DQUxMKDB4MDIwNykKJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfTUVNX0RPTkFURQkJCVNNQ19STUlfQ0FMTCgweDAyMDgpCiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX01FTV9SRUNMQUlNCQkJU01DX1JNSV9DQUxMKDB4MDIwOSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfQ0FOQ0VMCQkJU01DX1JNSV9DQUxMKDB4MDIwYSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfRkVBVFVSRVMJCQlTTUNfUk1JX0NBTEwoMHgwMjBiKQomIzQzOyNkZWZpbmUgU01DX1JNSV9WU01NVV9DTURfR0VUCQkJU01DX1JNSV9DQUxMKDB4MDIwYykKJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0NPTVBMRVRFCQlTTUNfUk1JX0NBTEwoMHgwMjBkKQomIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9JTkZPCQkJU01DX1JNSV9DQUxMKDB4MDIwZSkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9BQklfTUFKT1JfVkVSU0lPTgkyCiYjNDM7I2RlZmluZSBSTUlfQUJJX01JTk9SX1ZFUlNJT04JMAomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUih2ZXJzaW9uKSAoKHZlcnNpb24pICZndDsmZ3Q7IDE2KQomIzQzOyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OX0dFVF9NSU5PUih2ZXJzaW9uKSAoKHZlcnNpb24pICZhbXA7IDB4RkZGRikKJiM0MzsjZGVmaW5lIFJNSV9BQklfVkVSU0lPTihtYWpvciwgbWlub3IpICAgICAgKCgobWFqb3IpICZsdDsmbHQ7IDE2KSB8IChtaW5vcikpCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVU19NQVNLCQkoMHhGRlVMKQomIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9JTkRFWF9NQVNLCQkoMHhGRlVMICZsdDsmbHQ7IDgpCiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX01FTVJFUV9NQVNLCQkoMHgzVUwgJmx0OyZsdDsgOCkKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLCSgweDFVTCAmbHQ7Jmx0OyAxMCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fU1RBVFVTKHJldCkJCUZJRUxEX0dFVChSTUlfUkVUVVJOX1NUQVRVU19NQVNLLCByZXQpCiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX0lOREVYKHJldCkJCUZJRUxEX0dFVChSTUlfUkVUVVJOX0lOREVYX01BU0ssIHJldCkKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRKHJldCkJCUZJRUxEX0dFVChSTUlfUkVUVVJOX01FTVJFUV9NQVNLLCByZXQpCiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX0NBTl9DQU5DRUwocmV0KQlGSUVMRF9HRVQoUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMX01BU0ssIHJldCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9TVUNDRVNTCQkJMAomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0lOUFVUCQkJMQomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JFQUxNCQkJMgomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JFQwkJCTMKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9SVFQJCQk0CiYjNDM7I2RlZmluZSBSTUlfRVJST1JfTk9UX1NVUFBPUlRFRAkJNQomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0RFVklDRQkJNgomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JUVF9BVVgJCTcKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9QU01NVV9TVAkJOAomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0RQVAkJCTkKJiM0MzsjZGVmaW5lIFJNSV9CVVNZCQkJMTAKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9HTE9CQUwJCTExCiYjNDM7I2RlZmluZSBSTUlfRVJST1JfVFJBQ0tJTkcJCTEyCiYjNDM7I2RlZmluZSBSTUlfSU5DT01QTEVURQkJCTEzCiYjNDM7I2RlZmluZSBSTUlfQkxPQ0tFRAkJCTE0CiYjNDM7I2RlZmluZSBSTUlfRVJST1JfR1BUCQkJMTUKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9HUkFOVUxFCQkxNgomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkcJCTAKJiM0MzsjZGVmaW5lIFJNSV9DT05USU5VRV9TVE9QCQkxCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX1JFUV9OT05FCQkwCiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX1JFUV9ET05BVEUJCTEKJiM0MzsjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU0JCTIKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfU0laRV9NQVNLCQkzVUwKJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfQ09VTlRfTUFTSwkJR0VOTUFTSygxNSwgMikKJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfQ09OVElHX01BU0sJCUJJVCgxNikKJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfU1RBVEVfTUFTSwkJQklUKDE3KQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TSVpFKHJlcSkJCUZJRUxEX0dFVChSTUlfRE9OQVRFX1NJWkVfTUFTSywgcmVxKQomIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVChyZXEpCQlGSUVMRF9HRVQoUk1JX0RPTkFURV9DT1VOVF9NQVNLLCByZXEpCiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJRyhyZXEpCQlGSUVMRF9HRVQoUk1JX0RPTkFURV9DT05USUdfTUFTSywgcmVxKQomIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURShyZXEpCQlGSUVMRF9HRVQoUk1JX0RPTkFURV9TVEFURV9NQVNLLCByZXEpCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX0RFTEVHQVRFRAkJMAomIzQzOyNkZWZpbmUgUk1JX09QX01FTV9VTkRFTEVHQVRFRAkJMQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0FERFJfVFlQRV9OT05FCQkwCiYjNDM7I2RlZmluZSBSTUlfQUREUl9UWVBFX1NJTkdMRQkJMQomIzQzOyNkZWZpbmUgUk1JX0FERFJfVFlQRV9MSVNUCQkyCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TSVpFX01BU0sJR0VOTUFTSygxLCAwKQomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTSwlHRU5NQVNLKFBBR0VfU0hJRlQgLSAxLCAyKQomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLCShQQUdFX01BU0sgJmFtcDsgR0VOTUFTSyg1MSwgMCkpCiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLCUJJVCg2MykKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NJWkUoYXIpCQkoRklFTERfR0VUKFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTSywgXAomIzQzOwkJCQkJCSAgIChhcikpKQomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlQoYXIpCShGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTSywgXAomIzQzOwkJCQkJCSAgIChhcikpKQomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQUREUihhcikJCSgoYXIpICZhbXA7IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSykKJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NUQVRFKGFyKQkoRklFTERfR0VUKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFwKJiM0MzsJCQkJCQkgICAoYXIpKSkKJiM0MzsKJiM0MztlbnVtIHJtaV9yaXBhcyB7CiYjNDM7CVJNSV9FTVBUWSA9IDAsCiYjNDM7CVJNSV9SQU0gPSAxLAomIzQzOwlSTUlfREVTVFJPWUVEID0gMiwKJiM0MzsJUk1JX0RFViA9IDMsCiYjNDM7fTsKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9OT19NRUFTVVJFX0NPTlRFTlQJMAomIzQzOyNkZWZpbmUgUk1JX01FQVNVUkVfQ09OVEVOVAkxCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1MyU1oJCUdFTk1BU0soNywgMCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTFBBMgkJQklUKDgpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1NWRQkJQklUKDkpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1NWRV9WTAkJR0VOTUFTSygxMywgMTApCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX05VTV9CUFMJCUdFTk1BU0soMTksIDE0KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9OVU1fV1BTCQlHRU5NQVNLKDI1LCAyMCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUE1VCQlCSVQoMjYpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1BNVV9OVU1fQ1RSUwlHRU5NQVNLKDMxLCAyNykKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNEtCCUJJVCgwKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl8xNktCCUJJVCgxKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl82NEtCCUJJVCgyKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8yNTYJQklUKDMpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzM4NAlCSVQoNCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfNTEyCUJJVCg1KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9NQVhfUkVDU19PUkRFUglHRU5NQVNLKDksIDYpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1oJCUdFTk1BU0soMTMsIDEwKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9QUFMJCUdFTk1BU0soMTYsIDE0KQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9EQQkJQklUKDApCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0RBX0NPSAkJQklUKDEpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1ZTTU1VCQlCSVQoMikKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQVRTCQlCSVQoMykKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfTUFYX1ZERVZTX09SREVSCUdFTk1BU0soNywgNCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVkRFVl9LUk9VCUJJVCg4KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9OT05fVEVFX1NUUkVBTQlCSVQoOSkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfUDJQCQlCSVQoMTApCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0NNRU1fQ1hMCQlCSVQoMTEpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX01BWF9DTUVNCQlHRU5NQVNLKDE5LCAxMikKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQ01FTV9UU0VfUkVRCUJJVCgyMCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfTUFYX05VTV9BVVhfUExBTkVTCUdFTk1BU0soMywgMCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfUlRUX1BMQU5FCQlHRU5NQVNLKDUsIDQpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9TMkFQX0lORElSRUNUCUJJVCg2KQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfNF9NRUNfQ09VTlQJCUdFTk1BU0soNjMsIDApCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0NPTlZFTlRJT05BTAkJMAomIzQzOyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9ERVZfTkNPSAkJMQomIzQzOyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9ERVZfQ09ICQkyCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfUkVTRVJWRUQJCQkwCiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfTk9ORQkJCTEKJiM0MzsjZGVmaW5lIFJNSV9UUkFDS0lOR19GSU5FCQkJMgomIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX0NPQVJTRQkJCTMKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9HUkFOVUxFX1NJWkVfNEtCCTAKJiM0MzsjZGVmaW5lIFJNSV9HUkFOVUxFX1NJWkVfMTZLQgkxCiYjNDM7I2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzY0S0IJMgomIzQzOwomIzQzOy8qCiYjNDM7ICogTm90ZSBtYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc21hbGxlciB0aGFuIHU2NCBidXQgYWxsIGZpZWxkcyBoYXZlIHU2NAomIzQzOyAqIGFsaWdubWVudCwgc28gdXNlIHU2NCB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQuCiYjNDM7ICovCiYjNDM7c3RydWN0IHJtbV9jb25maWcgewomIzQzOwl1bmlvbiB7IC8qIDB4MCAqLwomIzQzOwkJc3RydWN0IHsKJiM0MzsJCQl1NjQgdHJhY2tpbmdfcmVnaW9uX3NpemU7CiYjNDM7CQkJdTY0IHJtaV9ncmFudWxlX3NpemU7CiYjNDM7CQl9OwomIzQzOwkJdTggc2l6ZXJbU1pfNEtdOwomIzQzOwl9OwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJtbV9jb25maWcpID09IFNaXzRLKTsKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0xQQTIJCUJJVCgwKQomIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfU1ZFCQlCSVQoMSkKJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX1BNVQkJQklUKDIpCiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19EQQkJCUJJVCgzKQomIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfTEZBX1BPTElDWQkJR0VOTUFTSyg2LCA1KQomIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfTUVDX1BPTElDWQkJR0VOTUFTSyg4LCA3KQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0hBU0hfU0hBXzI1NgkJCTAKJiM0MzsjZGVmaW5lIFJNSV9IQVNIX1NIQV81MTIJCQkxCiYjNDM7I2RlZmluZSBSTUlfSEFTSF9TSEFfMzg0CQkJMgomIzQzOwomIzQzO3N0cnVjdCByZWFsbV9wYXJhbXMgewomIzQzOwl1bmlvbiB7IC8qIDB4MCAqLwomIzQzOwkJc3RydWN0IHsKJiM0MzsJCQl1NjQgZmxhZ3MwOwomIzQzOwkJCXU2NCBzMnN6OwomIzQzOwkJCXU2NCBzdmVfdmw7CiYjNDM7CQkJdTY0IG51bV9icHM7CiYjNDM7CQkJdTY0IG51bV93cHM7CiYjNDM7CQkJdTY0IHBtdV9udW1fY3RyczsKJiM0MzsJCQl1NjQgaGFzaF9hbGdvOwomIzQzOwkJCXU2NCBudW1fYXV4X3BsYW5lczsKJiM0MzsJCX07CiYjNDM7CQl1OCBwYWRkaW5nMFsweDQwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHg0MDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTggcnB2WzY0XTsKJiM0MzsJCQl1NjQgYXRzX3BsYW5lOwomIzQzOwkJfTsKJiM0MzsJCXU4IHBhZGRpbmcxWzB4NDAwXTsKJiM0MzsJfTsKJiM0MzsJdW5pb24geyAvKiAweDgwMCAqLwomIzQzOwkJc3RydWN0IHsKJiM0MzsJCQl1NjQgcGFkZGluZzsKJiM0MzsJCQl1NjQgcnR0X2Jhc2U7CiYjNDM7CQkJczY0IHJ0dF9sZXZlbF9zdGFydDsKJiM0MzsJCQl1NjQgcnR0X251bV9zdGFydDsKJiM0MzsJCQl1NjQgZmxhZ3MxOwomIzQzOwkJCXU2NCBhdXhfcnR0X2Jhc2VbM107CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzJbMHg4MDBdOwomIzQzOwl9OwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlYWxtX3BhcmFtcykgPT0gU1pfNEspOwomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIG51bWJlciBvZiBHUFJzIChzdGFydGluZyBmcm9tIFgwKSB0aGF0IGFyZQomIzQzOyAqIGNvbmZpZ3VyZWQgYnkgdGhlIGhvc3Qgd2hlbiBhIFJFQyBpcyBjcmVhdGVkLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgUkVDX0NSRUFURV9OUl9HUFJTCQk4CiYjNDM7CiYjNDM7I2RlZmluZSBSRUNfUEFSQU1TX0ZMQUdfUlVOTkFCTEUJQklUX1VMTCgwKQomIzQzOwomIzQzO3N0cnVjdCByZWNfcGFyYW1zIHsKJiM0MzsJdW5pb24geyAvKiAweDAgKi8KJiM0MzsJCXU2NCBmbGFnczsKJiM0MzsJCXU4IHBhZGRpbmcwWzB4MTAwXTsKJiM0MzsJfTsKJiM0MzsJdW5pb24geyAvKiAweDEwMCAqLwomIzQzOwkJdTY0IG1waWRyOwomIzQzOwkJdTggcGFkZGluZzFbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4MjAwICovCiYjNDM7CQl1NjQgcGM7CiYjNDM7CQl1OCBwYWRkaW5nMlsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHgzMDAgKi8KJiM0MzsJCXU2NCBncHJzW1JFQ19DUkVBVEVfTlJfR1BSU107CiYjNDM7CQl1OCBwYWRkaW5nM1sweGQwMF07CiYjNDM7CX07CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3BhcmFtcykgPT0gU1pfNEspOwomIzQzOwomIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfRU1VTEFURURfTU1JTwlCSVQoMCkKJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0lOSkVDVF9TRUEJQklUKDEpCiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGSQkJQklUKDIpCiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGRQkJQklUKDMpCiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19SSVBBU19SRVNQT05TRQlCSVQoNCkKJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1MyQVBfUkVTUE9OU0UJQklUKDUpCiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19ERVZfTUVNX1JFU1BPTlNFCUJJVCg2KQomIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfRk9SQ0VfUDAJCUJJVCg3KQomIzQzOwomIzQzOyNkZWZpbmUgUkVDX1JVTl9HUFJTCQkJMzEKJiM0MzsjZGVmaW5lIFJFQ19NQVhfR0lDX05VTV9MUlMJCTE2CiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfUEVSTUlUVEVEX0dJQ1YzX0hDUl9CSVRTCShJQ0hfSENSX0VMMl9VSUUgfAkJXAomIzQzOwkJCQkJIElDSF9IQ1JfRUwyX0xSRU5QSUUgfAkJXAomIzQzOwkJCQkJIElDSF9IQ1JfRUwyX05QSUUgfAkJXAomIzQzOwkJCQkJIElDSF9IQ1JfRUwyX1ZHcnAwRUlFIHwJCVwKJiM0MzsJCQkJCSBJQ0hfSENSX0VMMl9WR3JwMERJRSB8CQlcCiYjNDM7CQkJCQkgSUNIX0hDUl9FTDJfVkdycDFFSUUgfAkJXAomIzQzOwkJCQkJIElDSF9IQ1JfRUwyX1ZHcnAxRElFIHwJCVwKJiM0MzsJCQkJCSBJQ0hfSENSX0VMMl9URElSKQomIzQzOwomIzQzO3N0cnVjdCByZWNfZW50ZXIgewomIzQzOwl1bmlvbiB7IC8qIDB4MDAwICovCiYjNDM7CQl1NjQgZmxhZ3M7CiYjNDM7CQl1OCBwYWRkaW5nMFsweDIwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHgyMDAgKi8KJiM0MzsJCXU2NCBncHJzW1JFQ19SVU5fR1BSU107CiYjNDM7CQl1OCBwYWRkaW5nMVsweDEwMF07CiYjNDM7CX07CiYjNDM7CXU4IHBhZGRpbmczWzB4NTAwXTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfZW50ZXIpID09IFNaXzJLKTsKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9FWElUX1NZTkMJCQkweDAwCiYjNDM7I2RlZmluZSBSTUlfRVhJVF9JUlEJCQkweDAxCiYjNDM7I2RlZmluZSBSTUlfRVhJVF9GSVEJCQkweDAyCiYjNDM7I2RlZmluZSBSTUlfRVhJVF9QU0NJCQkJMHgwMwomIzQzOyNkZWZpbmUgUk1JX0VYSVRfUklQQVNfQ0hBTkdFCQkweDA0CiYjNDM7I2RlZmluZSBSTUlfRVhJVF9IT1NUX0NBTEwJCTB4MDUKJiM0MzsjZGVmaW5lIFJNSV9FWElUX1NFUlJPUgkJCTB4MDYKJiM0MzsjZGVmaW5lIFJNSV9FWElUX1MyQVBfQ0hBTkdFCQkweDA3CiYjNDM7I2RlZmluZSBSTUlfRVhJVF9WREVWX1ZBTElEQVRFX01BUFBJTkcJMHgwOAomIzQzOyNkZWZpbmUgUk1JX0VYSVRfVlNNTVVfQ09NTUFORAkJMHgwYQomIzQzOyNkZWZpbmUgUk1JX0VYSVRfVkRFVl9QMlBfQklORElORwkweDBiCiYjNDM7CiYjNDM7c3RydWN0IHJlY19leGl0IHsKJiM0MzsJdW5pb24geyAvKiAweDAwMCAqLwomIzQzOwkJdTggZXhpdF9yZWFzb247CiYjNDM7CQl1OCBwYWRkaW5nMFsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHgxMDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTY0IGVzcjsKJiM0MzsJCQl1NjQgZmFyOwomIzQzOwkJCXU2NCBocGZhcjsKJiM0MzsJCQl1NjQgcnR0X3RyZWU7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzFbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4MjAwICovCiYjNDM7CQl1NjQgZ3Byc1tSRUNfUlVOX0dQUlNdOwomIzQzOwkJdTggcGFkZGluZzJbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4MzAwICovCiYjNDM7CQl1OCBwYWRkaW5nM1sweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHg0MDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTY0IGNudHBfY3RsOwomIzQzOwkJCXU2NCBjbnRwX2N2YWw7CiYjNDM7CQkJdTY0IGNudHZfY3RsOwomIzQzOwkJCXU2NCBjbnR2X2N2YWw7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzRbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4NTAwICovCiYjNDM7CQlzdHJ1Y3QgewomIzQzOwkJCXU2NCByaXBhc19iYXNlOwomIzQzOwkJCXU2NCByaXBhc190b3A7CiYjNDM7CQkJdTggcmlwYXNfdmFsdWU7CiYjNDM7CQkJdTggcGFkZGluZzhbMTVdOwomIzQzOwkJCXU2NCBzMmFwX2Jhc2U7CiYjNDM7CQkJdTY0IHMyYXBfdG9wOwomIzQzOwkJCXU2NCB2ZGV2X2lkXzE7CiYjNDM7CQkJdTY0IHZkZXZfaWRfMjsKJiM0MzsJCQl1NjQgZGV2X21lbV9iYXNlOwomIzQzOwkJCXU2NCBkZXZfbWVtX3RvcDsKJiM0MzsJCQl1NjQgZGV2X21lbV9wYTsKJiM0MzsJCX07CiYjNDM7CQl1OCBwYWRkaW5nNVsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHg2MDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTE2IGltbTsKJiM0MzsJCQl1MTYgcGFkZGluZzk7CiYjNDM7CQkJdTY0IHBsYW5lOwomIzQzOwkJfTsKJiM0MzsJCXU4IHBhZGRpbmc2WzB4MTAwXTsKJiM0MzsJfTsKJiM0MzsJdW5pb24geyAvKiAweDcwMCAqLwomIzQzOwkJc3RydWN0IHsKJiM0MzsJCQl1OCBwbXVfb3ZmX3N0YXR1czsKJiM0MzsJCQl1OCBwYWRkaW5nMTBbMTVdOwomIzQzOwkJCXU2NCB2c21tdTsKJiM0MzsJCX07CiYjNDM7CQl1OCBwYWRkaW5nN1sweDEwMF07CiYjNDM7CX07CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2V4aXQpID09IFNaXzJLKTsKJiM0MzsKJiM0MztzdHJ1Y3QgcmVjX3J1biB7CiYjNDM7CXN0cnVjdCByZWNfZW50ZXIgZW50ZXI7CiYjNDM7CXN0cnVjdCByZWNfZXhpdCBleGl0OwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19ydW4pID09IFNaXzRLKTsKJiM0MzsKJiM0MzsvKiBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi8KJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19PQUREUl9UWVBFCUdFTk1BU0soMSwgMCkKJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UCUdFTk1BU0soMTUsIDIpCiYjNDM7I2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfTUVNQVRUUglHRU5NQVNLKDE4LCAxNikKJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQCQlHRU5NQVNLKDIyLCAxOSkKJiM0MzsKJiM0MzsvKiBSTUlfUlRUX0RBVEFfTUFQX0ZMQUdTIGRlZmluaXRpb25zICovCiYjNDM7I2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX09BRERSX1RZUEUJR0VOTUFTSygxLCAwKQomIzQzOyNkZWZpbmUgUk1JX1JUVF9QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UCUdFTk1BU0soMTUsIDIpCiYjNDM7CiYjNDM7LyogUzJBUCBEaXJlY3QgRW5jb2RpbmdzLCB1c2VkIGluIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQICovCiYjNDM7I2RlZmluZSBSTUlfUzJBUF9ESVJFQ1RfV1JJVEUJCQlCSVQoMCkKJiM0MzsjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9SRUFECQkJQklUKDEpCiYjNDM7CiYjNDM7I2VuZGlmIC8qIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IXyAqLwo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAyMToyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNTgyNwoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDkwNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFJlYWNoYWJpbGl0eSBvZiBSTU0vUk1JIENvZGUgaW4gYSBWaXJ0dWFsaXplZCBFbnZpcm9ubWVudCoqCgpPa2F5LCBzbyB3ZSYjMzk7dmUgZ290IHRoaXMgcGF0Y2ggYWRkaW5nIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvciAoUk1NKSBzdXBwb3J0IGZvciBBUk02NC4gSXQgc2VlbXMgcHJldHR5IHNlbGYtY29udGFpbmVkLCBhZGRpbmcgdGhlIG5lY2Vzc2FyeSBoZWFkZXIgZmlsZXMgYW5kIGRyaXZlciBjb2RlOiBgYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oYCwgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnYCwgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZWAsIGBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmNgLCBgaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaGAsIGFuZCBgaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmhgLiAgSXQgaW50cm9kdWNlcyBgQ09ORklHX0FSTV9STU1gLCB3aGljaCBpcyBnb29kLCBhbmQgaXTigJlzIGRlcGVuZGVudCBvbiBgQVJDSF9TVVBQT1JUU19STU1gLiBJdCBwcm92aWRlcyBob3N0LXNpZGUgUk1JIHN1cHBvcnQsIHdoaWNoIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgS1ZNIGZvciB0aGluZ3MgbGlrZSBkZXRlY3RpbmcgYSBjb21wYXRpYmxlIFJNTSwgY29uZmlndXJpbmcgaXQsIG1hbmFnaW5nIGRlbGVnYXRlZCBtZW1vcnksIGFuZCBlbmFibGluZyBSZWFsbSBndWVzdHMuCgpNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gYXNzZXNzIGl0cyByZWFjaGFiaWxpdHkgd2l0aGluIGEgdmlydHVhbGl6ZWQgc2V0dGluZywgcGFydGljdWxhcmx5IFFFTVUuIFRoZSBjb2RlIGRvZXMgYSBjaGVjayBmb3IgUk1FIChSZWFsbSBNYW5hZ2VtZW50IEV4dGVuc2lvbikgc3VwcG9ydCBpbiB0aGUgQ1BVIHVzaW5nIHRoZSBgSURfQUE2NFBGUjBfRUwxYCByZWdpc3Rlci4gVGhpcyBpcyBrZXksIGFzIFJNSSBpcyBjb250aW5nZW50IG9uIFJNRS4gSWYgUk1FIGlzbiYjMzk7dCBwcmVzZW50LCB0aGUgaW5pdGlhbGl6YXRpb24gZmFpbHMuIFFFTVUgZG9lcyBzdXBwb3J0IFJNRSBlbXVsYXRpb24gaW4gaXRzIGB2aXJ0YCBtYWNoaW5lIHR5cGUsIGJ1dCBpdCBuZWVkcyBzcGVjaWZpYyBzZXR1cCB3aGljaCBwcm9iYWJseSBpbmNsdWRlcyBURi1BIGFuZCBSTU0uCgpTeXprYWxsZXIgaXMgYSBjb25jZXJuLCBhcyBpdCBvZnRlbiBydW5zIHdpdGggZGVmYXVsdCBRRU1VIENQVXMsIHN1Y2ggYXMgYG1heGAgb3IgYGNvcnRleC1hNTdgLiBJIG5lZWQgdG8gdmVyaWZ5IHdoZXRoZXIgdGhlIGRlZmF1bHQgUUVNVSBDUFVzIGFyZSBjb25maWd1cmVkIHdpdGggUk1FIHN1cHBvcnQuICBUaGUgY29kZSBpdHNlbGYsIHNwZWNpZmljYWxseSBgYXJtNjRfaW5pdF9ybWlgLCBpcyBhIGBzdWJzeXNfaW5pdGNhbGxgLiBJdCBjaGVja3MgZm9yIHRoZSBgSURfQUE2NFBGUjBfRUwxX1JNRV9TSElGVGAgYml0LiBJZiBSTUUgaXNuJiMzOTt0IHByZXNlbnQsIHRoZSBpbml0aWFsaXphdGlvbiB3aWxsIHJldHVybiBgLUVOWElPYC4gSWYgUk1FIGlzIHByZXNlbnQsIGl0IGRvZXMgU01DIGNhbGxzIHRvIFJNTS4gSWYgUk1NIGlzIG5vdCBwcmVzZW50LCB0aGUgU01DIGNhbGxzIHJldHVybiBgU01DQ0NfUkVUX05PVF9TVVBQT1JURURgLiAgU28gaXQmIzM5O3MgaGFyZHdhcmUtIGFuZCBmaXJtd2FyZS1kZXBlbmRlbnQuIEhvd2V2ZXIsIHN5emthbGxlciBtaWdodCBiZSBhYmxlIHRvIGZ1enogdGhlIFNNQyBjYWxscyBpZiB0aGVyZSYjMzk7cyBhIHdheSB0byBtb2NrIHRoZW0uCgpUaGUgcHJvYmxlbSBzdGF0ZW1lbnQgbWVudGlvbnMgdW5yZWFjaGFibGUgY29kZSBwYXRocyBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwgZXZlbiB3aXRoIGVtdWxhdGVkIGhhcmR3YXJlLiBTbyB0aGUgcXVlc3Rpb24gaXM6IGlzIFJNRSBzdXBwb3J0ZWQgaW4gUUVNVT8gWWVzLCBRRU1VIGhhcyBSTUUgZW11bGF0aW9uLiBUaGUgcGF0Y2ggaXRzZWxmIGp1c3QgYWRkcyB0aGUgUk1JIGxpYnJhcnkgZnVuY3Rpb25zIGFuZCB0aGUgaW5pdGlhbGl6YXRpb24uIFRoZXJlIGFyZSBubyBzeXNjYWxscyBvciBpb2N0bHMgZXhwb3NlZCBkaXJlY3RseSB0byB1c2VyLXNwYWNlIGluICp0aGlzKiBwYXRjaC4gVGhlc2UgYXJlIGV4cG9ydGVkIHVzaW5nIGBFWFBPUlRfU1lNQk9MX0dQTGAgKGUuZy4sIGBybWlfZGVsZWdhdGVfcmFuZ2VgLCBgcm1pX3VuZGVsZWdhdGVfcmFuZ2VgLCBldGMuKS4KClRoZXNlIGZ1bmN0aW9ucyBhcmUgcmVhbGx5IG1lYW50IGZvciBLVk0uIFRoZSBwYXRjaCBkZXNjcmlwdGlvbiBjb25maXJtcyB0aGlzOiAmIzM0O1RoaXMgb3B0aW9uIGJ1aWxkcyB0aGUgaG9zdC1zaWRlIFJNSSBzdXBwb3J0IHVzZWQgYnkgS1ZNLi4uJiMzNDsuIENydWNpYWxseSwgdGhlICpLVk0qIHN1cHBvcnQgaXRzZWxmIGlzbiYjMzk7dCAqaW4qIHRoaXMgcGF0Y2guIFRoZSBwYXRjaCBvbmx5ICphZGRzKiB0aGUgYnVpbGRpbmcgYmxvY2tzIGZvciBLVk0gdG8gdXNlIGxhdGVyLiBTbyB3aXRob3V0IEtWTSB1c2luZyB0aGVtLCB0aGVzZSBleHBvcnRlZCBmdW5jdGlvbnMgYXJlIGRlYWQgY29kZS4gR2l2ZW4gdGhhdCB0aGUgY2hhbmdlcyBhcmUgQUxSRUFEWSBjb21taXR0ZWQgYXMgSEVBRCwgSSBzaG91bGQgY2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIGZvbGxvdy11cCBwYXRjaCB0aGF0IGFkZHMgdGhlIEtWTSBjb2RlLiBJIG11c3Qgc2VhcmNoIGZvciB3aGVyZSBLVk0gdXNlcyB0aGVzZSBmdW5jdGlvbnMgaW4gdGhlIGN1cnJlbnQgdHJlZS4gVGhlIHByb21wdCBzYXlzIHRoZSBjb2RlIGlzIGFscmVhZHkgaW4gSEVBRCwgc28gbGV0IG1lIHNlYXJjaCBmb3IgYHJtaV9kZWxlZ2F0ZV9yYW5nZWAgb3IgYHJtaV9zcm9fZXhlY3V0ZWAgaW4gdGhlIHRyZWUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMjE6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cm1pX2RlbGVnYXRlX3JhbmdlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYz0yOD1FWFBPUlRfU1lNQk9MX0dQTChybWlfZmVhdF9yZWcpO1xuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTI5LVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjMwOmludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cyxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy0zMS1cdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbi0tXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtNTItfVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjUzOkVYUE9SVF9TWU1CT0xfR1BMKHJtaV9kZWxlZ2F0ZV9yYW5nZSk7XG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtNTQtXG4tLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jPTE2Nj1zdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuLS1cbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy0yMDgtXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6MjA5Olx0XHRpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIHNpemUsIFx1MDAyNmRlbGVnYXRlZF9waHlzKSkge1xuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTIxMC1cdFx0XHRpZiAoIXJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIGRlbGVnYXRlZF9waHlzIC0gcGh5cykpXG4tLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jPTI0OT1zdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuLS1cbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy0yOTMtXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6Mjk0Olx0XHRcdGlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgdW5pdF9zaXplX2J5dGVzLFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTI5NS1cdFx0XHRcdFx0ICAgICAgIFx1MDAyNmRlbGVnYXRlZF9waHlzKSkge1xuLS1cbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmg9MzA9dW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWcodW5zaWduZWQgbG9uZyBpZCk7XG5pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oLTMxLVxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaDozMjppbnQgcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmgtMzMtXHRcdCAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpO1xuLS1cbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmg9Mzc9c3RhdGljIGlubGluZSBpbnQgcm1pX2RlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmgtMzgte1xuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaDozOTpcdHJldHVybiBybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFLCBOVUxMKTtcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmgtNDAtfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDIxOjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4MjE3CgkJCQkJCQlvdXRwdXQ6IDE5CgkJCQkJCQl0aG91Z2h0czogNDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqSW52ZXN0aWdhdGluZyBSTUkgRnVuY3Rpb24gVXNhZ2UqKgoKT2theSwgc28gS1ZNIGlzbiYjMzk7dCBhY3RpdmVseSB1c2luZyB0aGlzIHBhcnRpY3VsYXIgZnVuY3Rpb24uIFRoYXQmIzM5O3MgZ29vZCB0byBrbm93LCBidXQgZG9lc24mIzM5O3QgcnVsZSBvdXQgaXRzIG92ZXJhbGwgc2lnbmlmaWNhbmNlLiBJIHNob3VsZCBicm9hZGVuIHRoZSBzZWFyY2guIEkgbmVlZCB0byBtYWtlIHN1cmUgSSYjMzk7bSBub3QgbWlzc2luZyBzb21ldGhpbmcgc3VidGx5IGNvbm5lY3RlZC4gTGV0JiMzOTtzIHNlZSBpZiBLVk0gbWlnaHQgYmUgaW5kaXJlY3RseSBsZXZlcmFnaW5nIGFueSBvZiB0aGVzZSBgcm1pX2AgZnVuY3Rpb25zLiBQZXJoYXBzIHNvbWV0aGluZyBsaWtlIGBybWlfcmVhbG1fY3JlYXRlYCBvciBhIHJlbGF0ZWQgZnVuY3Rpb24gY291bGQgYmUgdGhlIGtleS4gSSBuZWVkIHRvIGVuc3VyZSBhIGNvbXByZWhlbnNpdmUgb3ZlcnZpZXcgb2YgaG93IGl0IGlzIHVzZWQsIG9yIG5vdCB1c2VkLiBJIG5lZWQgdG8gZG8gYSB0aG9yb3VnaCBjaGVjayBvZiB0aGUgY29kZSBiYXNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDIxOjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3JtaV9yZWFsbV9jcmVhdGUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7YXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTEzNj1zdGF0aWMgaW5saW5lIGludCBybWlfcmVhbG1fYWN0aXZhdGUodW5zaWduZWQgbG9uZyByZClcbi0tXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMTQ1LS8qKlxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oOjE0NjogKiBybWlfcmVhbG1fY3JlYXRlKCkgLSBDcmVhdGUgYSByZWFsbVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTE0Ny0gKiBAcmQ6IFBBIG9mIHRoZSBSRFxuLS1cbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC0xNTQtICovXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg6MTU1OnN0YXRpYyBpbmxpbmUgaW50IHJtaV9yZWFsbV9jcmVhdGUodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBwYXJhbXMsXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMTU2LVx0XHRcdFx0ICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAyMTozMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyODYzNwoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDQzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd24sIGdpdmVuIG15IGV4cGVydGlzZToKCioqS1ZNIEludGVncmF0aW9uIENvbmNlcm5zKioKClJpZ2h0LCBzbyBJIHNlZSB0aGlzIHBhdGNoLCBhbmQgaXQgbG9va3MgbGlrZSBpdCYjMzk7cyBpbnRyb2R1Y2luZyB0aGUgUmVtb3RlIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIGxpYnJhcnkgYW5kIGl0cyBpbml0aWFsaXphdGlvbiwgYnV0IGl0JiMzOTtzIG5vdCBpbW1lZGlhdGVseSBjbGVhciBob3cgS1ZNIGlzIGxldmVyYWdpbmcgaXQgaW4gdGhlIGN1cnJlbnQgc291cmNlIHRyZWUuIFRoYXQmIzM5O3MgYSBiaXQgb2YgYSByZWQgZmxhZzsgeW91IGRvbiYjMzk7dCB3YW50IHRvIGp1c3QgYWRkIGNvZGUgdGhhdCYjMzk7cyBub3QgYWN0aXZlbHkgYmVpbmcgdXNlZCwgaXQgYWRkcyB0byB0aGUgY29kZWJhc2UgYmxvYXQgYW5kIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMgaWYgaXQmIzM5O3Mgbm90IGJlaW5nIHVzZWQuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCAmIzM0O09rYXksIGlzIHRoaXMgcHJlbWF0dXJlIG9wdGltaXphdGlvbiwgb3IgaXMgdGhlcmUgYSBwbGFuIGluIHBsYWNlPyYjMzQ7CgpUaGUgbmV4dCBsb2dpY2FsIHN0ZXAgaXMgdG8gZGl2ZSBpbiBhbmQgbG9vayBmb3IgY2FsbGVycyBvZiBgcm1pX3Nyb19leGVjdXRlYC4gVGhhdCYjMzk7cyB3aGVyZSBJIG5lZWQgdG8gc3RhcnQgZGlnZ2luZyB0byBzZWUgKndoeSogdGhpcyBoYXMgYmVlbiBhZGRlZC4gQXJlIHRoZXJlIGV4aXN0aW5nIG1vZHVsZXMsIGRyaXZlcnMsIG9yIGh5cGVydmlzb3IgY29tcG9uZW50cyBhbHJlYWR5IHNsYXRlZCB0byB1c2UgaXQgaW4gZnV0dXJlIGNvbW1pdHMsIG9yIGRvZXMgdGhpcyBwYXRjaCByZXByZXNlbnQgYW4gdW5pbnRlZ3JhdGVkIHBpZWNlIG9mIHRoZSBwdXp6bGUgdGhhdCBuZWVkcyBmdXJ0aGVyIGRldmVsb3BtZW50PyBVbmRlcnN0YW5kaW5nICp3aGVyZSogdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQsIGFuZCBob3cgaXQmIzM5O3MgYmVpbmcgdXNlZCwgaXMgZ29pbmcgdG8gaW5mb3JtIG15IGFzc2Vzc21lbnQgb2YgdGhlIHBhdGNoJiMzOTtzIHB1cnBvc2UgYW5kIGl0cyByZWFkaW5lc3MuIExldCYjMzk7cyBzZWUgaWYgd2UgY2FuIGZpbmQgc29tZSB1c2FnZSEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAyMTozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtybWlfc3JvX2V4ZWN1dGUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7YXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTI1PXN0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGF0YV9tYXBfaW5pdCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGRhdGEsXG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTMyLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oOjMzOlx0cmV0dXJuIHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC0zNC19XG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTQ3PXN0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGF0YV9tYXAodW5zaWduZWQgbG9uZyByZCxcbi0tXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtNTgtXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg6NTk6XHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtNjAtXG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTgyPXN0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGF0YV91bm1hcCh1bnNpZ25lZCBsb25nIHJkLFxuLS1cbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC05NS1cbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaDo5NjpcdHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC05Ny1cbi0tXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg9MjY3PXN0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcnR0LFxuLS1cbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC0yNzMtXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg6Mjc0Olx0cmV0dXJuIHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC0yNzUtfVxuLS1cbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaD0yOTE9c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTI5OS1cdH07XG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg6MzAwOlx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC0zMDEtXG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTMyMj1zdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2ZvbGQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBpcGEsXG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTMyNy1cdH07XG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg6MzI4Olx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC0zMjktXG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTM0Nz1zdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2luaXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBiYXNlLFxuLS1cbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC0zNTItXHR9O1xuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oOjM1MzpcdGludCByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMzU0LVxuLS1cbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaD0zNzQ9c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF91bnByb3RfbWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTM4My1cdH07XG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg6Mzg0Olx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC0zODUtXG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTQwNT1zdGF0aWMgaW5saW5lIGludCBybWlfcnR0X3NldF9yaXBhcyh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJlYyxcbi0tXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtNDExLVx0fTtcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaDo0MTI6XHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTQxMy1cbi0tXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg9NDM1PXN0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfdW5wcm90X3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTQ0Ni1cdH07XG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg6NDQ3Olx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC00NDgtXG4tLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jPTQ3OD1FWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX21lbXhmZXJfZXhlY3V0ZSk7XG4tLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTQ4MC0vKiBGb3IgUk1JIGNvbW1hbmRzIHRoYXQgYXJlIHN0YXRlZnVsIGJ1dCBub3QgbWVtb3J5LXRyYW5zZmVycmluZyAqL1xuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjQ4MTp1bnNpZ25lZCBsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTQ4Mi17XG4tLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTUwNy19XG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6NTA4OkVYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fZXhlY3V0ZSk7XG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtNTA5LVxuLS1cbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmg9NTA9dm9pZCBybWlfc3JvX2ZyZWUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyk7XG5pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oOjUxOnVuc2lnbmVkIGxvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpO1xuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaC01Mi1cbi0tXG5pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oPTE2ND1zdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXG4tLVxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaC0xNzAtXHR9O1xuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaDoxNzE6XHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaC0xNzItXG4tLVxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaD0xOTA9c3RhdGljIGlubGluZSBpbnQgcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXG4tLVxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaC0xOTYtXHR9O1xuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaDoxOTc6XHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaC0xOTgtXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMjE6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzA3MDEKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiA0NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIHNlZSB3aGF0JiMzOTtzIGdvaW5nIG9uIGhlcmUuCgoqKktWTSBJbnF1aXJ5OiBJbml0aWFsIENvbmZ1c2lvbiBhbmQgRm9jdXNlZCBJbnZlc3RpZ2F0aW9uKioKCkhtbSwgc28gaXQgc2VlbXMgS1ZNIGlzbiYjMzk7dCBhY3RpdmVseSAqaW4gdXNlKiBqdXN0IHlldC4gVGhhdOKAmXMgYSBiaXQgb2RkLiBCdXQgd2FpdCwgYGFybTY0X2luaXRfcm1pYCBpcyBnZXR0aW5nIGNhbGxlZCBkdXJpbmcgdGhlIGJvb3QgcHJvY2Vzcy4gT2theSwgdGhhdCBzcGFya3MgbXkgaW50ZXJlc3QuIFRoaXMgc3VnZ2VzdHMgc29tZXRoaW5nIGlzIGhhcHBlbmluZyB1bmRlciB0aGUgaG9vZC4gVGltZSB0byBkaWcgaW50byBgYXJtNjRfaW5pdF9ybWlgIGFuZCB1bmRlcnN0YW5kIHByZWNpc2VseSB3aGF0IHJvbGUgaXQgcGxheXMuIExldCYjMzk7cyBzZWUgd2hhdCB3ZSBjYW4gZmluZC4gSSYjMzk7bSBrZWVuIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgaXMgYmVpbmcgaW5pdGlhbGl6ZWQsIGV2ZW4gaWYgS1ZNIGl0c2VsZiBpc24mIzM5O3QgeWV0IHZpc2libHkgYWN0aXZlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAyMTozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDthcm02NF9pbml0X3JtaSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM9Njg3PWJvb2wgaXNfcm1pX2F2YWlsYWJsZSh2b2lkKVxuLS1cbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy02OTEtXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6NjkyOnN0YXRpYyBpbnQgX19pbml0IGFybTY0X2luaXRfcm1pKHZvaWQpXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtNjkzLXtcbi0tXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtNzE5LS8qXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6NzIwOiAqIE5vdGUgYXJtNjRfaW5pdF9ybWkoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUga3ZtX2luaXRfcm1pKCkgb3RoZXJ3aXNlIEtWTVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTcyMS0gKiB3aWxsIG5vdCBzdXBwb3J0IHJlYWxtIGd1ZXN0cy4gc3Vic3lzX2luaXRjYWxsKCkgaXMgY2FsbGVkIGJlZm9yZVxuLS1cbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy03MjMtICovXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6NzI0OnN1YnN5c19pbml0Y2FsbChhcm02NF9pbml0X3JtaSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDIxOjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMxMTc2CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogODMwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKlJNSSBJbml0aWFsaXphdGlvbiBhbmQgUmVhY2hhYmlsaXR5IEFuYWx5c2lzKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGBhcm02NF9pbml0X3JtaWAgZnVuY3Rpb24sIGFuZCBpdCYjMzk7cyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkOiBpdCBjYWxscyBhIHNlcmllcyBvZiBgcm1pXypgIGZ1bmN0aW9ucyBmb3IgaW5pdGlhbGl6YXRpb24gZHVyaW5nIGJvb3QuIFNlZW1zIGxpa2UgdGhpcyBpbnZvbHZlcyBTZWN1cmUgTW9uaXRvciBDYWxsIChTTUMpIGludGVyYWN0aW9ucy4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIGNhbiB0aGlzIGJlIGZ1enplZD8gU3l6a2FsbGVyIGlzIGEgZmFudGFzdGljIHRvb2wgZm9yIFNNQyBmdXp6aW5nLCBidXQgaXQgdXN1YWxseSByZWxpZXMgb24gZWl0aGVyIGludGVyY2VwdGluZyB0aGUgY2FsbHMgb3IgZnV6emluZyBhIGh5cGVydmlzb3IuIEhlcmUsIExpbnV4ICppcyogdGhlIGhvc3QsIGNhbGxpbmcgaW50byB0aGUgUk1NIChSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3IpLCB3aGljaCBpcyBmaXJtd2FyZS4gU3l6a2FsbGVyIGRvZXNuJiMzOTt0IHR5cGljYWxseSB0YXJnZXQgZmlybXdhcmUgZGlyZWN0bHkgdW5sZXNzIHRoZXJlJiMzOTtzIGEgbW9jayBkcml2ZXIgaW4gcGxhY2UuCgpIb3dldmVyLCBJIHJlYWxpemUgdGhpcyBpcyBlYXJseSBib290IGNvZGUuIElmIEtWTSBpc24mIzM5O3QgdXNpbmcgaXQgeWV0ICh3aGljaCBJIHN1c3BlY3QgaXQgaXNuJiMzOTt0LCBnaXZlbiB0aGlzIGlzIGEgbmV3IHBhdGNoKSwgdGhlICpvbmx5KiBwbGFjZSB0aGlzIGNvZGUgY2FuIGJlIHJlYWNoZWQgaXMgdGhlIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlLiBBIHF1aWNrIGNoZWNrIG9mIHRoZSBjb2RlIGNvbmZpcm1zIHRoaXM6IGlmIFJNRSBpc24mIzM5O3Qgc3VwcG9ydGVkLCBpdCByZXR1cm5zIGAtRU5YSU9gLiBPbiBhIHN0YW5kYXJkIHN5emthbGxlciBWTSwgdGhpcyBpcyB0aGUgZXhwZWN0ZWQgb3V0Y29tZSwgc2luY2UgUk1FIGlzIG5vdCBlbmFibGVkIGluIHRoZSBkZWZhdWx0IFFFTVUgc2V0dXAuCgpTbyB0aGUgcXVlc3Rpb24gaXMsIGNhbiB3ZSBhY3R1YWxseSAqcmVhY2gqIHRoZSByZXN0IG9mIHRoZSBjb2RlPyBJdCBoaW5nZXMgb24gdGhlIENQVSBzdXBwb3J0aW5nIFJNRS4gU3l6a2FsbGVyIHVzdWFsbHkgcnVucyB3aXRoIGBxZW11LXN5c3RlbS1hYXJjaDY0IC1tYWNoaW5lIHZpcnQgLWNwdSBtYXhgLiBEb2VzIGAtY3B1IG1heGAgZXZlbiAqaGF2ZSogUk1FIGVuYWJsZWQ/IEl0IGxvb2tzIGxpa2Ugbm8sIGl0IHJlcXVpcmVzIGAtbWFjaGluZSB2aXJ0LHgtcm1lPW9uYCBhbmQgYXBwcm9wcmlhdGUgZmlybXdhcmUgKFRGLUEgYW5kIFJNTSkuIFdpdGhvdXQgdGhlIGZpcm13YXJlLCB0aGUgU01DIGNhbGxzIHdpbGwganVzdCByZXR1cm4gYFNNQ0NDX1JFVF9OT1RfU1VQUE9SVEVEYC4KCkV2ZW4gaWYgS1ZNICp3YXMqIHVzaW5nIGl0LCBLVk0gd291bGQgb25seSB1c2UgaXQgaWYgS1ZNIGl0c2VsZiB3YXMgY29uZmlndXJlZCB0byBzdXBwb3J0IFJlYWxtcywgd2hpY2ggdGhpcyBwYXRjaCBpcyBub3QgZG9pbmcuIExvb2tpbmcgYXQgdGhlIGNvZGUgY29uZmlybXMgdGhpcyBpcyBqdXN0IGluaXRpYWxpemF0aW9uLCBhbmQgd2lsbCBsaWtlbHkgZXhpdCBpbW1lZGlhdGVseS4KClRoZSBwYXRjaCBJJiMzOTttIGxvb2tpbmcgYXQgKmFkZHMqIGEgbGlicmFyeSBmb3IgS1ZNIHRvIHVzZSwgYW5kIGEgaW5pdGNhbGwgdGhhdCBLVk0gZGVwZW5kcyBvbi4gSXQgbG9va3MgbGlrZSBpdCYjMzk7cyBidWlsZGluZyBpbmZyYXN0cnVjdHVyZSwgbm90IGNvbnN1bWluZyBpdCB5ZXQuCgpTbywgdGhlIG9ubHkgY29kZSB0aGF0JiMzOTtzIHJlYWNoYWJsZSBpcyBgYXJtNjRfaW5pdF9ybWlgLCBhbmQgKnRoYXQqIGltbWVkaWF0ZWx5IGJhaWxzIG91dC4gVGhpcyBzZWVtcyB0byBhbGlnbiB3aXRoIHRoZSBwcm9tcHQmIzM5O3MgaW5zdHJ1Y3Rpb246ICYjMzQ7UmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWlucyBjb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUmIzM0Oy4KCkJ1dCB3YWl04oCmIGlzIGl0ICppbXBvc3NpYmxlKj8gSWYgd2UgcGFzcyBgLW1hY2hpbmUgdmlydCx4LXJtZT1vbmAgdG8gUUVNVSwgY291bGQgS1ZNICpvciogS1ZNIHVuaXQgdGVzdHMgcmVhY2ggaXQ/IEJ1dCB0aGlzIHBhdGNoIGRvZXNuJiMzOTt0IGFkZCBLVk0gc3VwcG9ydDsgaXQgYWRkcyB0aGUgYnVpbGRpbmcgYmxvY2tzLgoKTGV0IG1lIGRvdWJsZS1jaGVjay4gSSYjMzk7dmUgYWxyZWFkeSBncmVwcGVkIGZvciBgcm1pX2RlbGVnYXRlX3JhbmdlYCBhbmQgYHJtaV9zcm9fZXhlY3V0ZWAgYW5kIGZvdW5kIG5vIGNhbGxlcnMgb3V0c2lkZSB0aGUgbmV3bHkgYWRkZWQgZmlsZXMuIExldCYjMzk7cyBtYWtlIGFic29sdXRlbHkgc3VyZSBhbmQgZG91YmxlIGNoZWNrIGBmcmVlX2RlbGVnYXRlZF9wYWdlYCB0byBiZSBleHRyYSBzdXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAyMTozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmcmVlX2RlbGVnYXRlZF9wYWdlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYz0xMjk9c3RhdGljIHZvaWQgcm1pX29wX21lbV9yZWNsYWltKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbi0tXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtMTQwLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjE0MTppbnQgZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzX2FkZHJfdCBwaHlzKVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTE0Mi17XG4tLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTE1MS19XG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6MTUyOkVYUE9SVF9TWU1CT0xfR1BMKGZyZWVfZGVsZWdhdGVkX3BhZ2UpO1xuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTE1My1cbi0tXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM9MTY2PXN0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4tLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTIzOS1cdFx0XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6MjQwOlx0XHRcdFx0ZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzICYjNDM7IGkpO1xuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTI0MS1cdFx0XHRlbHNlXG4tLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jPTI0OT1zdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuLS1cbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy0zNDYtXHRcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjM0NzpcdFx0XHRcdGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyAmIzQzOyBpKTtcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy0zNDgtXHRcdFx0ZWxzZVxuLS1cbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmg9MzQ9aW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7XG5pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oOjM1OmludCBmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMpO1xuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaC0zNi1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMjE6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzMyMzgKCQkJCQkJCW91dHB1dDogMTQyCgkJCQkJCQl0aG91Z2h0czogNTcwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIHRoZSBSTUkgQ29kZSBmb3IgRnV6emluZyBQb3RlbnRpYWwqKgoKT2theSwgc28gSSYjMzk7dmUgbG9va2VkIHRocm91Z2ggdGhlIGNvZGUsIHNwZWNpZmljYWxseSB0aGUgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuY2AgZmlsZS4gVGhlIGluaXRpYWwgYXNzZXNzbWVudCBpcyBjbGVhcjogdGhlcmUgYXJlIG5vIGVudHJ5IHBvaW50cyBmb3IgZXh0ZXJuYWwgY2FsbGVycyBvdXRzaWRlIG9mIHRoaXMgc3BlY2lmaWMgZmlsZS4gVGhpcyBpbW1lZGlhdGVseSBzdWdnZXN0cyB0aGF0IEtWTSBzdXBwb3J0LCB3aGljaCBpcyB3aGF0IEkmIzM5O20gcHJpbWFyaWx5IGludGVyZXN0ZWQgaW4sIGlzICpub3QqIHByZXNlbnQgaGVyZS4KCk15IGZvY3VzIG5hcnJvd3MgdG8gdGhlIGBhcm02NF9pbml0X3JtaSgpYCBmdW5jdGlvbi4gSXQmIzM5O3MgdGhlIG9ubHkgY29kZSB0aGF0IGFwcGVhcnMgdG8gZXhlY3V0ZS4gTGV0JiMzOTtzIHNlZSBpZiB0aGlzIGlzIGZ1enphYmxlLiBJdCYjMzk7cyBjYWxsZWQgb25jZSBhdCBib290LiBJdCBjaGVja3MgaWYgUk1FIGlzIHN1cHBvcnRlZCBieSByZWFkaW5nIGEgQ1BVIHJlZ2lzdGVyLCBhbmQgaWYgbm90IGl0IHJldHVybnMgYW4gZXJyb3IuIElmIFJNRSBpcyBzdXBwb3J0ZWQsIGl0IGNhbGxzIGBTTUNfUk1JX1ZFUlNJT05gLiBJZiB0aGF0IGFsc28gZmFpbHMsIGl0IGdpdmVzIGFuIGVycm9yLiBJZiB0aGF0IHN1Y2NlZWRzIGl0IHJlYWRzIGZlYXR1cmVzLCBjb25maWd1cmVzIFJNTSwgYW5kIGluaXRpYWxpemVzIG1ldGFkYXRhLgoKVGhlIGNoYWxsZW5nZSBoZXJlIGlzIG9idmlvdXM6IGl0JiMzOTtzIGEgKm9uZS10aW1lKiBib290IGluaXRpYWxpemF0aW9uLiBJdCBleHBlY3RzIHNwZWNpZmljIGhhcmR3YXJlIGFuZCBmaXJtd2FyZSDigJMgUk1NLiBTdGFuZGFyZCBTeXprYWxsZXIgZW52aXJvbm1lbnRzLCB3aGljaCBpcyBteSBwcmltYXJ5IGZ1enppbmcgdG9vbCwgZG9uJiMzOTt0IHR5cGljYWxseSBoYXZlIHRoaXMuIEkgY2FuJiMzOTt0IHRyaWdnZXIgdGhpcyBjb2RlIHJlcGVhdGVkbHkgZnJvbSB1c2VyLXNwYWNlLCBub3IgZG9lcyBpdCBzZWVtIHRvIGV4cG9zZSBhbnkgdXNlci1zcGFjZSBpbnRlcmZhY2UsIGxpa2UgYSBzeXNjYWxsLCBpb2N0bCwgb3Igc3lzZnMgZW50cnkuIFN5emthbGxlciB3b3JrcyBieSBleGVjdXRpbmcgc3lzY2FsbHMsIHNvIHRoaXMgcHJlc2VudHMgYSBmdW5kYW1lbnRhbCBwcm9ibGVtLgoKV2FpdCwgaXMgdGhlcmUgKmFueSogZGV2aWNlIGV4cG9zZWQ/IE5vcGUuIEFsbCBJIHNlZSBpcyBgYXJtNjRfcm1pX2lzX2F2YWlsYWJsZSA9IHRydWVgIGJlaW5nIHNldCwgYWxvbmcgd2l0aCBzb21lIHN5bWJvbCBleHBvcnRzLiBUaGlzIGlzIGNvbXBsZXRlbHkgdXNlbGVzcyBmb3IgZnV6emluZy4gU3l6a2FsbGVyIGNhbiYjMzk7dCB0b3VjaCBhbnkgb2YgdGhpcy4gS1ZNIHN1cHBvcnQgaXMgbWlzc2luZy4KCkxldCYjMzk7cyBkb3VibGUtY2hlY2sgdGhlIEtjb25maWcuIFRoZSBwYXRjaCBhZGRzIGBDT05GSUdfQVJNX1JNTWAsIHdoaWNoIGRlZmF1bHRzIHRvICYjMzQ7eSYjMzQ7IGFuZCBkZXBlbmRzIG9uIGBBUkNIX1NVUFBPUlRTX1JNTWAuCgpTaW5jZSBLVk0gaXMgKm5vdCogcHJlc2VudCwgYW5kIEtWTSBpcyB0aGUgaW50ZW5kZWQgY29uc3VtZXIsIGFuZCBLVk0gaXNuJiMzOTt0IHVzaW5nIHRoaXMgbGlicmFyeSB5ZXQsIHRoaXMgaXMgcHVyZWx5IGRlYWQgY29kZS4gSXQmIzM5O3MgbGlicmFyeSBmdW5jdGlvbnMgYW5kIGEgYm9vdC10aW1lIGNoZWNrIHRoYXQmIzM5O2xsIGZhaWwgaW4gb3VyIHN0YW5kYXJkIGVudmlyb25tZW50cy4gSXQmIzM5O3Mgbm90IHdvcnRoIHRoZSBlZmZvcnQgdG8gZnV6eiBpdC4KCk9rYXksIGxldCYjMzk7cyB2ZXJpZnkgaWYgS1ZNIHVzZXMgdGhpcyB0aHJvdWdoIGEgZGlmZmVyZW50IHJvdXRlLiBXYXMgS1ZNIG1lcmdlZCwgYnV0IHRoaXMgcGF0Y2ggd2FzIG1pc3Npbmc/IE5vcGUsIEtWTSYjMzk7cyBSTUUgc3VwcG9ydCBpcyBhIGxhcmdlIHNlcmllcywgYW5kIHRoaXMgaXMgb25lIG9mIHRoZSBmaXJzdCBwYXRjaGVzLgoKVGhlcmVmb3JlLCBteSBjb25jbHVzaW9uIGlzIHRoYXQgdGhlIGNvZGUgaXMgbm90IHdvcnRoIGZ1enppbmcuIEkmIzM5O2xsIHJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgYmVjYXVzZSBLVk0gc3VwcG9ydCBpcyBub3QgeWV0IHByZXNlbnQuIFRoZSBhZGRlZCBSTUkgbGlicmFyeSBmdW5jdGlvbnMgYXJlIHVucmVhY2hhYmxlIGZyb20gdXNlci1zcGFjZSwgYW5kIHRoZSBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gcmVsaWVzIG9uIHNwZWNpZmljIGZpcm13YXJlIChSTU0pIG5vdCBwcmVzZW50IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMjE6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGhvc3Qtc2lkZSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBsaWJyYXJ5IGZ1bmN0aW9ucyBhbmQgYm9vdC10aW1lIGluaXRpYWxpemF0aW9uIGZvciBLVk0gdG8gdXNlLiBIb3dldmVyLCBLVk0gc3VwcG9ydCBmb3IgUmVhbG1zIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGlzIHBhdGNoLCBtYWtpbmcgdGhlIGV4cG9ydGVkIGxpYnJhcnkgZnVuY3Rpb25zIHVucmVhY2hhYmxlIGZyb20gdXNlci1zcGFjZS4gRnVydGhlcm1vcmUsIHRoZSBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gcmVxdWlyZXMgc3BlY2lmaWMgaGFyZHdhcmUvZmlybXdhcmUgKFJNTSkgc3VwcG9ydCB0aGF0IGlzIG5vdCBwcmVzZW50IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgYW5kIGl0IHdpbGwgc2ltcGx5IGJhaWwgb3V0IGVhcmx5LiBUaGVyZSBhcmUgbm8gc3lzY2FsbHMsIGlvY3Rscywgb3Igb3RoZXIgdXNlci1zcGFjZSBpbnRlcmZhY2VzIGludHJvZHVjZWQgdGhhdCBzeXprYWxsZXIgY291bGQgZnV6ei4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgaG9zdC1zaWRlIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIGxpYnJhcnkgZnVuY3Rpb25zIGFuZCBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gZm9yIEtWTSB0byB1c2UuIEhvd2V2ZXIsIEtWTSBzdXBwb3J0IGZvciBSZWFsbXMgaXMgbm90IGluY2x1ZGVkIGluIHRoaXMgcGF0Y2gsIG1ha2luZyB0aGUgZXhwb3J0ZWQgbGlicmFyeSBmdW5jdGlvbnMgdW5yZWFjaGFibGUgZnJvbSB1c2VyLXNwYWNlLiBGdXJ0aGVybW9yZSwgdGhlIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiByZXF1aXJlcyBzcGVjaWZpYyBoYXJkd2FyZS9maXJtd2FyZSAoUk1NKSBzdXBwb3J0IHRoYXQgaXMgbm90IHByZXNlbnQgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLCBhbmQgaXQgd2lsbCBzaW1wbHkgYmFpbCBvdXQgZWFybHkuIFRoZXJlIGFyZSBubyBzeXNjYWxscywgaW9jdGxzLCBvciBvdGhlciB1c2VyLXNwYWNlIGludGVyZmFjZXMgaW50cm9kdWNlZCB0aGF0IHN5emthbGxlciBjb3VsZCBmdXp6LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDIxOjI5OjU0LjU0MzEyNTU4OVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU2NzA0Njk0OTYxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIGhvc3Qtc2lkZSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBsaWJyYXJ5IGZ1bmN0aW9ucyBhbmQgYm9vdC10aW1lIGluaXRpYWxpemF0aW9uIGZvciBLVk0gdG8gdXNlLiBIb3dldmVyLCBLVk0gc3VwcG9ydCBmb3IgUmVhbG1zIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGlzIHBhdGNoLCBtYWtpbmcgdGhlIGV4cG9ydGVkIGxpYnJhcnkgZnVuY3Rpb25zIHVucmVhY2hhYmxlIGZyb20gdXNlci1zcGFjZS4gRnVydGhlcm1vcmUsIHRoZSBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gcmVxdWlyZXMgc3BlY2lmaWMgaGFyZHdhcmUvZmlybXdhcmUgKFJNTSkgc3VwcG9ydCB0aGF0IGlzIG5vdCBwcmVzZW50IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgYW5kIGl0IHdpbGwgc2ltcGx5IGJhaWwgb3V0IGVhcmx5LiBUaGVyZSBhcmUgbm8gc3lzY2FsbHMsIGlvY3Rscywgb3Igb3RoZXIgdXNlci1zcGFjZSBpbnRlcmZhY2VzIGludHJvZHVjZWQgdGhhdCBzeXprYWxsZXIgY291bGQgZnV6ei5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDIxOjI5OjU0LjU0MzEzNTQ3OVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODY0MTM2MTc2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgOWNhMzQ3NDQ1YzZjYWNjOWJhMGM4MDgxMTZmYmNkOGRjMDc5MDExOVxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgV2VkIEp1bCAxNSAyMToyOTo1MiAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L0tjb25maWcgYi9hcmNoL2FybTY0L0tjb25maWdcXG5pbmRleCBiM2FmZTA2ODg5MTliZC4uMGYxOTU2ZWRmMTMwN2IgMTAwNjQ0XFxuLS0tIGEvYXJjaC9hcm02NC9LY29uZmlnXFxuKysrIGIvYXJjaC9hcm02NC9LY29uZmlnXFxuQEAgLTM4LDYgKzM4LDcgQEAgY29uZmlnIEFSTTY0XFxuIFxcdHNlbGVjdCBBUkNIX0hBU19NRU1CQVJSSUVSX1NZTkNfQ09SRVxcbiBcXHRzZWxlY3QgQVJDSF9IQVNfTUVNX0VOQ1JZUFRcXG4gXFx0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNFQUxfU1lTVEVNX01BUFBJTkdTXFxuK1xcdHNlbGVjdCBBUkNIX1NVUFBPUlRTX1JNTVxcbiBcXHRzZWxlY3QgQVJDSF9IQVNfTk1JX1NBRkVfVEhJU19DUFVfT1BTXFxuIFxcdHNlbGVjdCBBUkNIX0hBU19OT05fT1ZFUkxBUFBJTkdfQUREUkVTU19TUEFDRVxcbiBcXHRzZWxlY3QgQVJDSF9IQVNfTk9OTEVBRl9QTURfWU9VTkcgaWYgQVJNNjRfSEFGVFxcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmhcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5mMTNlY2RiNDBkZWQ0MVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmhcXG5AQCAtMCwwICsxLDQ1OSBAQFxcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xcbisvKlxcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLlxcbisgKi9cXG4rXFxuKyNpZm5kZWYgX19BU01fUk1JX0NNRFNfSFxcbisjZGVmaW5lIF9fQVNNX1JNSV9DTURTX0hcXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9hcm0tcm1pLWNtZHMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2FybS1zbWNjYy1ybWkuaFxcdTAwM2VcXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X2RhdGFfbWFwX2luaXQoKSAtIENyZWF0ZSBhIHByb3RlY3RlZCBtYXBwaW5nIHdpdGggZGF0YSBjb250ZW50c1xcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAZGF0YTogUEEgb2YgdGhlIHRhcmdldCBncmFudWxlXFxuKyAqIEBpcGE6IElQQSBhdCB3aGljaCB0aGUgZ3JhbnVsZSB3aWxsIGJlIG1hcHBlZCBpbiB0aGUgZ3Vlc3RcXG4rICogQHNyYzogUEEgb2YgdGhlIHNvdXJjZSBncmFudWxlXFxuKyAqIEBmbGFnczogUk1JX01FQVNVUkVfQ09OVEVOVCBpZiB0aGUgY29udGVudHMgc2hvdWxkIGJlIG1lYXN1cmVkXFxuKyAqXFxuKyAqIENyZWF0ZSBhIG1hcHBpbmcgZnJvbSBQcm90ZWN0ZWQgSVBBIHNwYWNlIHRvIGNvbnZlbnRpb25hbCBtZW1vcnksIGNvcHlpbmdcXG4rICogY29udGVudHMgZnJvbSBhIE5vbi1zZWN1cmUgR3JhbnVsZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyLlxcbisgKlxcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9kYXRhX21hcF9pbml0KHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgZGF0YSxcXG4rXFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBpcGEsIHVuc2lnbmVkIGxvbmcgc3JjLFxcbitcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGZsYWdzKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfREFUQV9NQVBfSU5JVCwgcmQsIGRhdGEsIGlwYSwgc3JjLCBmbGFnc1xcbitcXHR9O1xcbitcXG4rXFx0cmV0dXJuIHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X2RhdGFfbWFwKCkgLSBDcmVhdGUgbWFwcGluZ3MgaW4gcHJvdGVjdGVkIElQQSB3aXRoIHVua25vd24gY29udGVudHNcXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQGJhc2U6IEJhc2Ugb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXFxuKyAqIEBmbGFnczogRmxhZ3NcXG4rICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxcbisgKiBAb3V0X3RvcDogVG9wIGFkZHJlc3Mgb2YgcmFuZ2Ugd2hpY2ggd2FzIHByb2Nlc3NlZC5cXG4rICpcXG4rICogUmV0dXJuIFJNSSByZXR1cm4gY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9kYXRhX21hcCh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIGJhc2UsXFxuK1xcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIGZsYWdzLFxcbitcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxcbitcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfREFUQV9NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxcbitcXHR9O1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0cmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChvdXRfdG9wKVxcbitcXHRcXHQqb3V0X3RvcCA9IHJlZ3MuYTE7XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3J0dF9kYXRhX3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3MgdG8gY29udmVudGlvbmFsIG1lbW9yeVxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCBSZWFsbVxcbisgKiBAYmFzZTogQmFzZSBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxcbisgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcXG4rICogQGZsYWdzOiBGbGFnc1xcbisgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXFxuKyAqIEBvdXRfdG9wOiBSZXR1cm5zIHRvcCBJUEEgb2YgcmFuZ2Ugd2hpY2ggaGFzIGJlZW4gdW5tYXBwZWRcXG4rICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2VcXG4rICogQG91dF9jb3VudDogTnVtYmVyIG9mIGVudHJpZXMgaW4gb3V0cHV0IGFkZHJlc3MgbGlzdFxcbisgKlxcbisgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIGNvbnZlbnRpb24gbWVtb3J5IHdpdGggYSB0YXJnZXQgUHJvdGVjdGVkIElQQSByYW5nZS5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGF0YV91bm1hcCh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSxcXG4rXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIHRvcCxcXG4rXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLFxcbitcXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgb2FkZHIsXFxuK1xcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCxcXG4rXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nICpvdXRfcmFuZ2UsXFxuK1xcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyAqb3V0X2NvdW50KVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfREFUQV9VTk1BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXFxuK1xcdH07XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0aWYgKG91dF90b3ApXFxuK1xcdFxcdCpvdXRfdG9wID0gcmVncy5hMTtcXG4rXFx0aWYgKG91dF9yYW5nZSlcXG4rXFx0XFx0Km91dF9yYW5nZSA9IHJlZ3MuYTI7XFxuK1xcdGlmIChvdXRfY291bnQpXFxuK1xcdFxcdCpvdXRfY291bnQgPSByZWdzLmEzO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9wc2NpX2NvbXBsZXRlKCkgLSBDb21wbGV0ZSBwZW5kaW5nIFBTQ0kgY29tbWFuZFxcbisgKiBAY2FsbGluZ19yZWM6IFBBIG9mIHRoZSBjYWxsaW5nIFJFQ1xcbisgKiBAc3RhdHVzOiBTdGF0dXMgb2YgdGhlIFBTQ0kgcmVxdWVzdFxcbisgKlxcbisgKiBDb21wbGV0ZXMgYSBwZW5kaW5nIFBTQ0kgY29tbWFuZC5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9wc2NpX2NvbXBsZXRlKHVuc2lnbmVkIGxvbmcgY2FsbGluZ19yZWMsXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIHN0YXR1cylcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XFxuK1xcbitcXHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1BTQ0lfQ09NUExFVEUsIGNhbGxpbmdfcmVjLCBzdGF0dXMsIFxcdTAwMjZyZXMpO1xcbitcXG4rXFx0cmV0dXJuIHJlcy5hMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9yZWFsbV9hY3RpdmF0ZSgpIC0gQWN0aXZlIGEgcmVhbG1cXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICpcXG4rICogTWFyayBhIHJlYWxtIGFzIEFjdGl2ZSBzaWduYWxsaW5nIHRoYXQgY3JlYXRpb24gaXMgY29tcGxldGUgYW5kIGFsbG93aW5nXFxuKyAqIGV4ZWN1dGlvbiBvZiB0aGUgcmVhbG0uXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfcmVhbG1fYWN0aXZhdGUodW5zaWduZWQgbG9uZyByZClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XFxuK1xcbitcXHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1JFQUxNX0FDVElWQVRFLCByZCwgXFx1MDAyNnJlcyk7XFxuK1xcbitcXHRyZXR1cm4gcmVzLmEwO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3JlYWxtX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgcmVhbG1cXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQHBhcmFtczogUEEgb2YgcmVhbG0gcGFyYW1ldGVyc1xcbisgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxcbisgKlxcbisgKiBDcmVhdGUgYSBuZXcgcmVhbG0gdXNpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfcmVhbG1fY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcGFyYW1zLFxcbitcXHRcXHRcXHRcXHQgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxcbit7XFxuK1xcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcXG4rXFx0XFx0XFx0XFx0ICAgU01DX1JNSV9SRUFMTV9DUkVBVEUsIHJkLCBwYXJhbXMpO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3JlYWxtX3Rlcm1pbmF0ZSgpIC0gVGVybWluYXRlIGEgcmVhbG1cXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcXG4rICpcXG4rICogVGVybWluYXRlcyBhIHJlYWxtLCBtb3ZpbmcgaXQgaW50byBhIFpPTUJJRSBzdGF0ZVxcbisgKlxcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX3Rlcm1pbmF0ZSh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxcbit7XFxuK1xcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcXG4rXFx0XFx0XFx0XFx0ICAgU01DX1JNSV9SRUFMTV9URVJNSU5BVEUsIHJkKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9yZWFsbV9kZXN0cm95KCkgLSBEZXN0cm95IGEgcmVhbG1cXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcXG4rICpcXG4rICogRGVzdHJveXMgYSByZWFsbSwgYWxsIG9iamVjdHMgYmVsb25naW5nIHRvIHRoZSByZWFsbSBtdXN0IGJlIGRlc3Ryb3llZCBmaXJzdC5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9yZWFsbV9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXFxuK1xcdFxcdFxcdFxcdCAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxcbit7XFxuK1xcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcXG4rXFx0XFx0XFx0XFx0ICAgU01DX1JNSV9SRUFMTV9ERVNUUk9ZLCByZCk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcmVjX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgUkVDXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXFxuKyAqIEBwYXJhbXM6IFBBIG9mIFJFQyBwYXJhbWV0ZXJzXFxuKyAqIEBzcm86IEFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXFxuKyAqXFxuKyAqIENyZWF0ZSBhIFJFQyB1c2luZyB0aGUgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdCByZWNfcGFyYW1zIHBvaW50ZWRcXG4rICogdG8gYnkgQHBhcmFtcy5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9yZWNfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsXFxuK1xcdFxcdFxcdFxcdCB1bnNpZ25lZCBsb25nIHJlYyxcXG4rXFx0XFx0XFx0XFx0IHVuc2lnbmVkIGxvbmcgcGFyYW1zLFxcbitcXHRcXHRcXHRcXHQgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0KnNybyA9IChzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSl7LnJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUkVDX0NSRUFURSwgcmQsIHJlYywgcGFyYW1zXFxuK1xcdH19O1xcbitcXHRyZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzcm8sIEdGUF9LRVJORUwpO1xcbitcXHRybWlfc3JvX2ZyZWUoc3JvKTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcmVjX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSBSRUNcXG4rICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUNcXG4rICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcXG4rICpcXG4rICogRGVzdHJveXMgYSBSRUMuIFRoZSBSRUMgbXVzdCBub3QgYmUgcnVubmluZy5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9yZWNfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJlYyxcXG4rXFx0XFx0XFx0XFx0ICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxcbit7XFxuK1xcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwgU01DX1JNSV9SRUNfREVTVFJPWSwgcmVjKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9yZWNfZW50ZXIoKSAtIEVudGVyIGEgUkVDXFxuKyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXFxuKyAqIEBydW5fcHRyOiBQQSBvZiBSZWNSdW4gc3RydWN0dXJlXFxuKyAqXFxuKyAqIFN0YXJ0cyAob3IgY29udGludWVzKSBleGVjdXRpb24gd2l0aGluIGEgUkVDLlxcbisgKlxcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3JlY19lbnRlcih1bnNpZ25lZCBsb25nIHJlYywgdW5zaWduZWQgbG9uZyBydW5fcHRyKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcXG4rXFxuK1xcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUkVDX0VOVEVSLCByZWMsIHJ1bl9wdHIsIFxcdTAwMjZyZXMpO1xcbitcXG4rXFx0cmV0dXJuIHJlcy5hMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfY3JlYXRlKCkgLSBDcmVhdGVzIGFuIFJUVFxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAcnR0OiBQQSBvZiB0aGUgdGFyZ2V0IFJUVFxcbisgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcXG4rICogQGxldmVsOiBEZXB0aCBvZiB0aGUgUlRUIHdpdGhpbiB0aGUgdHJlZVxcbisgKlxcbisgKiBDcmVhdGVzIGFuIFJUVCAoUmVhbG0gVHJhbnNsYXRpb24gVGFibGUpIGF0IHRoZSBzcGVjaWZpZWQgbGV2ZWwgZm9yIHRoZVxcbisgKiB0cmFuc2xhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGFkZHJlc3Mgd2l0aGluIHRoZSByZWFsbS5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcnR0LFxcbitcXHRcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBpcGEsIGxvbmcgbGV2ZWwpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9DUkVBVEUsIHJkLCBydHQsIGlwYSwgbGV2ZWxcXG4rXFx0fTtcXG4rXFxuK1xcdHJldHVybiBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3J0dF9kZXN0cm95KCkgLSBEZXN0cm95IGFuIFJUVFxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCByZWFsbVxcbisgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcXG4rICogQGxldmVsOiBSVFQgbGV2ZWxcXG4rICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZFxcbisgKiBAb3V0X3RvcDogUG9pbnRlciB0byB3cml0ZSB0aGUgdG9wIElQQSBvZiBub24tbGl2ZSBSVFQgZW50cmllcywgZnJvbSBlbnRyeVxcbisgKiBhdCB3aGljaCB0aGUgUlRUIHdhbGsgdGVybWluYXRlZC5cXG4rICpcXG4rICogRGVzdHJveXMgYW4gUlRULiBUaGUgUlRUIG11c3QgYmUgbm9uLWxpdmUsIGkuZS4gbm9uZSBvZiB0aGUgZW50cmllcyBpbiB0aGVcXG4rICogdGFibGUgYXJlIGluIEFTU0lHTkVEIG9yIFRBQkxFIHN0YXRlLlxcbisgKlxcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZS5cXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgaXBhLFxcbitcXHRcXHRcXHRcXHQgIGxvbmcgbGV2ZWwsXFxuK1xcdFxcdFxcdFxcdCAgdW5zaWduZWQgbG9uZyAqb3V0X3J0dCxcXG4rXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfREVTVFJPWSwgcmQsIGlwYSwgbGV2ZWxcXG4rXFx0fTtcXG4rXFx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAob3V0X3J0dClcXG4rXFx0XFx0Km91dF9ydHQgPSByZWdzLmExO1xcbitcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmEyO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfZm9sZCgpIC0gRm9sZCBhbiBSVFRcXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUXFxuKyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWVcXG4rICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZFxcbisgKlxcbisgKiBGb2xkcyBhbiBSVFQuIElmIGFsbCBlbnRyaWVzIHdpdGggdGhlIFJUVCBhcmUgJ2hvbW9nZW5lb3VzJyB0aGUgUlRUIGNhbiBiZVxcbisgKiBmb2xkZWQgaW50byB0aGUgcGFyZW50IGFuZCB0aGUgUlRUIGRlc3Ryb3llZC5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZm9sZCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGlwYSxcXG4rXFx0XFx0XFx0ICAgICAgIGxvbmcgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgKm91dF9ydHQpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9GT0xELCByZCwgaXBhLCBsZXZlbFxcbitcXHR9O1xcbitcXHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChvdXRfcnR0KVxcbitcXHRcXHQqb3V0X3J0dCA9IHJlZ3MuYTE7XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3J0dF9pbml0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIG5ldyByZWFsbVxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAYmFzZTogQmFzZSBvZiB0YXJnZXQgSVBBIHJlZ2lvblxcbisgKiBAdG9wOiBUb3Agb2YgdGFyZ2V0IElQQSByZWdpb25cXG4rICogQG91dF90b3A6IFRvcCBJUEEgb2YgcmFuZ2Ugd2hvc2UgUklQQVMgd2FzIG1vZGlmaWVkXFxuKyAqXFxuKyAqIFNldHMgdGhlIFJJUEFTIG9mIGEgdGFyZ2V0IElQQSByYW5nZSB0byBSQU0sIGZvciBhIHJlYWxtIGluIHRoZSBORVcgc3RhdGUuXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2luaXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBiYXNlLFxcbitcXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgdG9wLCB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfSU5JVF9SSVBBUywgcmQsIGJhc2UsIHRvcFxcbitcXHR9O1xcbitcXHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChvdXRfdG9wKVxcbitcXHRcXHQqb3V0X3RvcCA9IHJlZ3MuYTE7XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3J0dF91bnByb3RfbWFwKCkgLSBNYXAgdW5wcm90ZWN0ZWQgZ3JhbnVsZXMgaW50byBhIHJlYWxtXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBiYXNlOiBCYXNlIElQQSBvZiB0aGUgbWFwcGluZ1xcbisgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcXG4rICogQGZsYWdzOiBGbGFnc1xcbisgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXFxuKyAqIEBvdXRfdG9wOiBUb3AgSVBBIG9mIHJhbmdlIHdoaWNoIGhhcyBiZWVuIG1hcHBlZFxcbisgKlxcbisgKiBDcmVhdGUgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X3VucHJvdF9tYXAodW5zaWduZWQgbG9uZyByZCxcXG4rXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIGJhc2UsXFxuK1xcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyB0b3AsXFxuK1xcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcXG4rXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxcbitcXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9VTlBST1RfTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcXG4rXFx0fTtcXG4rXFx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfc2V0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIGFuIHJ1bm5pbmcgcmVhbG1cXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQHJlYzogUEEgb2YgdGhlIFJFQyBtYWtpbmcgdGhlIHJlcXVlc3RcXG4rICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb25cXG4rICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uXFxuKyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRvcCBJUEEgb2YgcmFuZ2Ugd2hvc2UgUklQQVMgd2FzIG1vZGlmaWVkXFxuKyAqXFxuKyAqIENvbXBsZXRlcyBhIHJlcXVlc3QgbWFkZSBieSB0aGUgcmVhbG0gdG8gY2hhbmdlIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEFcXG4rICogcmFuZ2UuXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X3NldF9yaXBhcyh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJlYyxcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyB0b3AsXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfU0VUX1JJUEFTLCByZCwgcmVjLCBiYXNlLCB0b3BcXG4rXFx0fTtcXG4rXFx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfdW5wcm90X3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3Mgd2l0aGluIGFuIHVucHJvdGVjdGVkIElQQSByYW5nZVxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmdcXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXFxuKyAqIEBmbGFnczogRmxhZ3NcXG4rICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxcbisgKiBAb3V0X3RvcDogVG9wIElQQSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxcbisgKiBAb3V0X3JhbmdlOiBPdXRwdXQgYWRkcmVzcyByYW5nZVxcbisgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XFxuKyAqXFxuKyAqIFJlbW92ZXMgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X3VucHJvdF91bm1hcCh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxcbitcXHRcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyB0b3AsXFxuK1xcdFxcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLFxcbitcXHRcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcXG4rXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3AsXFxuK1xcdFxcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nICpvdXRfcmFuZ2UsXFxuK1xcdFxcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nICpvdXRfY291bnQpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9VTlBST1RfVU5NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxcbitcXHR9O1xcbitcXHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChvdXRfdG9wKVxcbitcXHRcXHQqb3V0X3RvcCA9IHJlZ3MuYTE7XFxuK1xcdGlmIChvdXRfcmFuZ2UpXFxuK1xcdFxcdCpvdXRfcmFuZ2UgPSByZWdzLmEyO1xcbitcXHRpZiAob3V0X2NvdW50KVxcbitcXHRcXHQqb3V0X2NvdW50ID0gcmVncy5hMztcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKyNlbmRpZiAvKiBfX0FTTV9STUlfQ01EU19IICovXFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY1xcbmluZGV4IDlhMjJkZjBjNTEyMGYzLi40YWU2M2M4OWNkYTk3ZCAxMDA2NDRcXG4tLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNcXG4rKysgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNcXG5AQCAtMjkzLDYgKzI5Myw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRpc2FyM1tdID0ge1xcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0cGZyMFtdID0ge1xcbiBcXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0NTVjNfU0hJRlQsIDQsIDApLFxcbiBcXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0NTVjJfU0hJRlQsIDQsIDApLFxcbitcXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX1JNRV9TSElGVCwgNCwgMCksXFxuIFxcdEFSTTY0X0ZUUl9CSVRTKEZUUl9WSVNJQkxFLCBGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0RJVF9TSElGVCwgNCwgMCksXFxuIFxcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQU1VX1NISUZULCA0LCAwKSxcXG4gXFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9NUEFNX1NISUZULCA0LCAwKSxcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXFxuaW5kZXggMTJkYzcwMjU0ODQyY2UuLjU1NTQyODc5ZmJiOGFiIDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ1xcbisrKyBiL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ1xcbkBAIC0zMDEsNSArMzAxLDYgQEAgc291cmNlIFxcXCJkcml2ZXJzL2Zpcm13YXJlL3NhbXN1bmcvS2NvbmZpZ1xcXCJcXG4gc291cmNlIFxcXCJkcml2ZXJzL2Zpcm13YXJlL3NtY2NjL0tjb25maWdcXFwiXFxuIHNvdXJjZSBcXFwiZHJpdmVycy9maXJtd2FyZS90ZWdyYS9LY29uZmlnXFxcIlxcbiBzb3VyY2UgXFxcImRyaXZlcnMvZmlybXdhcmUveGlsaW54L0tjb25maWdcXFwiXFxuK3NvdXJjZSBcXFwiZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWdcXFwiXFxuIFxcbiBlbmRtZW51XFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXFxuaW5kZXggNGRkZWMyODIwYzk2ZmEuLjA3ZThjYTE3ODliNDllIDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGVcXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXFxuQEAgLTM4LDMgKzM4LDQgQEAgb2JqLXlcXHRcXHRcXHRcXHQrPSBzYW1zdW5nL1xcbiBvYmoteVxcdFxcdFxcdFxcdCs9IHNtY2NjL1xcbiBvYmoteVxcdFxcdFxcdFxcdCs9IHRlZ3JhL1xcbiBvYmoteVxcdFxcdFxcdFxcdCs9IHhpbGlueC9cXG4rb2JqLXlcXHRcXHRcXHRcXHQrPSBhcm1fcm1tL1xcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uZDIyNGE3MmNjYTkwODlcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWdcXG5AQCAtMCwwICsxLDIyIEBAXFxuK1xcbitjb25maWcgQVJDSF9TVVBQT1JUU19STU1cXG4rXFx0Ym9vbFxcbitcXG4rY29uZmlnIEFSTV9STU1cXG4rXFx0Ym9vbCBcXFwiUmVhbG0gTWFuYWdlbWVudCBNb25pdG9yIChSTU0pIFN1cHBvcnRcXFwiXFxuK1xcdGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19STU1cXG4rXFx0ZGVmYXVsdCB5XFxuK1xcdGhlbHBcXG4rXFx0ICBTdXBwb3J0IHRoZSBSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3IgKFJNTSkgb24gQXJtIHN5c3RlbXMgdGhhdFxcbitcXHQgIGltcGxlbWVudCB0aGUgUmVhbG0gTWFuYWdlbWVudCBFeHRlbnNpb24gKFJNRSksIGFzIGRlZmluZWQgYnkgdGhlXFxuK1xcdCAgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZS5cXG4rXFxuK1xcdCAgVGhlIFJNTSBydW5zIGluIHRoZSBSZWFsbSB3b3JsZCBhbmQgcHJvdmlkZXMgdGhlIFJlYWxtIE1hbmFnZW1lbnRcXG4rXFx0ICBJbnRlcmZhY2UgKFJNSSkgdXNlZCBieSBhIE5vcm1hbCBXb3JsZCBob3N0IHRvIGNyZWF0ZSwgbWFuYWdlIGFuZCBydW5cXG4rXFx0ICBwcm90ZWN0ZWQgdmlydHVhbCBtYWNoaW5lcyBjYWxsZWQgUmVhbG1zLiBUaGlzIG9wdGlvbiBidWlsZHMgdGhlXFxuK1xcdCAgaG9zdC1zaWRlIFJNSSBzdXBwb3J0IHVzZWQgYnkgS1ZNIHRvIGRldGVjdCBhIGNvbXBhdGlibGUgUk1NLFxcbitcXHQgIGNvbmZpZ3VyZSBpdCwgbWFuYWdlIGRlbGVnYXRlZCBtZW1vcnkgYW5kIGVuYWJsZSBSZWFsbSBndWVzdHMuXFxuK1xcbitcXHQgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiBkb2VzIG5vdCBieSBpdHNlbGYgbWFrZSBSZWFsbSBndWVzdHMgYXZhaWxhYmxlOlxcbitcXHQgIHRoZSBzeXN0ZW0gbXVzdCBhbHNvIHByb3ZpZGUgUk1FLWNhcGFibGUgaGFyZHdhcmUgYW5kIGZpcm13YXJlIHdpdGggYVxcbitcXHQgIGNvbXBhdGlibGUgUk1NIGltcGxlbWVudGF0aW9uLlxcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGUgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi41MWFlZjVjYzA0YjAyY1xcbi0tLSAvZGV2L251bGxcXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcXG5AQCAtMCwwICsxLDIgQEBcXG4rXFxuK29iai0kKENPTkZJR19BUk1fUk1NKVxcdD0gcm1pLm9cXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uZDBjMDgzYmRmMjUxZjRcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jXFxuQEAgLTAsMCArMSw3MjQgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLypcXG4rICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC5cXG4rICovXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvY3B1ZmVhdHVyZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtYmxvY2suaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2FybS1ybWktY21kcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcHJvY2Vzc29yLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbGFiLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjYXNtL21lbW9yeS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYXNtL3BndGFibGUtaHdkZWYuaFxcdTAwM2VcXG4rXFxuK3N0YXRpYyBib29sIGFybTY0X3JtaV9pc19hdmFpbGFibGU7XFxuK1xcbisvKiBDdXJyZW50bHkgb25seSB0aGUgZmlyc3QgMiByZWdpc3RlcnMgYXJlIHVzZWQgYnkgTGludXggKi9cXG4rI2RlZmluZSBSTUlfRkVBVF9SRUdfQ09VTlRcXHQyXFxuK3N0YXRpYyBfX3JvX2FmdGVyX2luaXQgdW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWdfY2FjaGVbUk1JX0ZFQVRfUkVHX0NPVU5UXTtcXG4rXFxuK3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaWQpXFxuK3tcXG4rXFx0aWYgKFdBUk5fT04oaWQgXFx1MDAzZT0gUk1JX0ZFQVRfUkVHX0NPVU5UKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRyZXR1cm4gcm1pX2ZlYXRfcmVnX2NhY2hlW2lkXTtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChybWlfZmVhdF9yZWcpO1xcbitcXG4raW50IHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLFxcbitcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLFxcbitcXHRcXHQgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgcmV0ID0gMDtcXG4rXFx0dW5zaWduZWQgbG9uZyB0b3AgPSBwaHlzICsgc2l6ZTtcXG4rXFx0dW5zaWduZWQgbG9uZyBvdXRfdG9wO1xcbitcXG4rXFx0d2hpbGUgKHBoeXMgXFx1MDAzYyB0b3ApIHtcXG4rXFx0XFx0cmV0ID0gcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUocGh5cywgdG9wLCBcXHUwMDI2b3V0X3RvcCk7XFxuK1xcdFxcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpXFxuK1xcdFxcdFxcdHBoeXMgPSBvdXRfdG9wO1xcbitcXHRcXHRlbHNlIGlmIChyZXQgPT0gUk1JX0JVU1kgfHwgcmV0ID09IFJNSV9CTE9DS0VEKVxcbitcXHRcXHRcXHRjcHVfcmVsYXgoKTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXG4rXFx0aWYgKG91dF9waHlzKVxcbitcXHRcXHQqb3V0X3BoeXMgPSBwaHlzO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChybWlfZGVsZWdhdGVfcmFuZ2UpO1xcbitcXG4raW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsXFxuK1xcdFxcdFxcdCB1bnNpZ25lZCBsb25nIHNpemUpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyByZXQgPSAwO1xcbitcXHR1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgKyBzaXplO1xcbitcXHR1bnNpZ25lZCBsb25nIG91dF90b3A7XFxuK1xcbitcXHR3aGlsZSAocGh5cyBcXHUwMDNjIHRvcCkge1xcbitcXHRcXHRyZXQgPSBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHBoeXMsIHRvcCwgXFx1MDAyNm91dF90b3ApO1xcbitcXHRcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTKVxcbitcXHRcXHRcXHRwaHlzID0gb3V0X3RvcDtcXG4rXFx0XFx0ZWxzZSBpZiAocmV0ID09IFJNSV9CVVNZIHx8IHJldCA9PSBSTUlfQkxPQ0tFRClcXG4rXFx0XFx0XFx0Y3B1X3JlbGF4KCk7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX3VuZGVsZWdhdGVfcmFuZ2UpO1xcbitcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9uYXRlX3JlcV90b19zaXplKHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplID0gUk1JX0RPTkFURV9TSVpFKGRvbmF0ZXJlcSk7XFxuK1xcbitcXHRyZXR1cm4gQklUKEFSTTY0X0hXX1BHVEFCTEVfTEVWRUxfU0hJRlQoMyAtIHVuaXRfc2l6ZSkpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBybWlfc21jY2NfaW52b2tlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3NfaW4sXFxuK1xcdFxcdFxcdCAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVnc19vdXQpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gKnJlZ3NfaW47XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3RhdHVzO1xcbitcXG4rXFx0d2hpbGUgKDEpIHtcXG4rXFx0XFx0YXJtX3NtY2NjXzFfMl9pbnZva2UoXFx1MDAyNnJlZ3MsIHJlZ3Nfb3V0KTtcXG4rXFx0XFx0c3RhdHVzID0gUk1JX1JFVFVSTl9TVEFUVVMocmVnc19vdXQtXFx1MDAzZWEwKTtcXG4rXFx0XFx0aWYgKHN0YXR1cyAhPSBSTUlfQlVTWSBcXHUwMDI2XFx1MDAyNiBzdGF0dXMgIT0gUk1JX0JMT0NLRUQpXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjcHVfcmVsYXgoKTtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBybWlfb3BfY29udGludWUodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLCB1bnNpZ25lZCBsb25nIGZsYWdzLFxcbitcXHRcXHRcXHQgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX09QX0NPTlRJTlVFLCBzcm9faGFuZGxlLCBmbGFnc1xcbitcXHR9O1xcbitcXG4rXFx0cm1pX3NtY2NjX2ludm9rZShcXHUwMDI2cmVncywgb3V0X3JlZ3MpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBybWlfb3BfY2FuY2VsKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncylcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfT1BfQ0FOQ0VMLCBzcm9faGFuZGxlXFxuK1xcdH07XFxuK1xcbitcXHRybWlfc21jY2NfaW52b2tlKFxcdTAwMjZyZWdzLCBvdXRfcmVncyk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHJtaV9vcF9tZW1fZG9uYXRlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsXFxuK1xcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9jb3VudCwgdW5zaWduZWQgbG9uZyBmbGFncyxcXG4rXFx0XFx0XFx0ICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX09QX01FTV9ET05BVEUsIHNyb19oYW5kbGUsIGxpc3RfYWRkciwgbGlzdF9jb3VudCwgZmxhZ3NcXG4rXFx0fTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UoXFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgcm1pX29wX21lbV9yZWNsYWltKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9hZGRyLFxcbitcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2NvdW50LFxcbitcXHRcXHRcXHQgICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnRcXG4rXFx0fTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UoXFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcXG4rfVxcbitcXG4raW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcXG4re1xcbitcXHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5cykpKSB7XFxuK1xcdFxcdC8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovXFxuK1xcdFxcdHJldHVybiAtRUJVU1k7XFxuK1xcdH1cXG4rXFxuK1xcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQocGh5cykpO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwoZnJlZV9kZWxlZ2F0ZWRfcGFnZSk7XFxuK1xcbitzdGF0aWMgaW50IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuK1xcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgY291bnQpXFxuK3tcXG4rXFx0aWYgKFdBUk5fT05fT05DRShzcm8tXFx1MDAzZWFkZHJfY291bnQgXFx1MDAzZSBSTUlfTUFYX0FERFJfTElTVCkpXFxuK1xcdFxcdHJldHVybiAtRU9WRVJGTE9XO1xcbitcXG4rXFx0aWYgKGNvdW50IFxcdTAwM2UgUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tXFx1MDAzZWFkZHJfY291bnQpXFxuK1xcdFxcdHJldHVybiAtRU5PU1BDO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuK1xcdFxcdFxcdFxcdCB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXFxuK1xcdFxcdFxcdFxcdCB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSxcXG4rXFx0XFx0XFx0XFx0IHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLFxcbitcXHRcXHRcXHRcXHQgZ2ZwX3QgZ2ZwKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplID0gUk1JX0RPTkFURV9TSVpFKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplX2J5dGVzID0gZG9uYXRlX3JlcV90b19zaXplKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3RhdGUgPSBSTUlfRE9OQVRFX1NUQVRFKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc2l6ZSA9IHVuaXRfc2l6ZV9ieXRlcyAqIGNvdW50O1xcbitcXHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XFxuK1xcdGludCByZXQ7XFxuK1xcdHZvaWQgKnZpcnQ7XFxuK1xcdHBoeXNfYWRkcl90IHBoeXM7XFxuK1xcbitcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIHNyby1cXHUwMDNlYWRkcl9jb3VudDsgaSsrKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXFx1MDAzZWFkZHJfbGlzdFtpXTtcXG4rXFxuK1xcdFxcdGlmIChSTUlfQUREUl9SQU5HRV9TSVpFKGVudHJ5KSA9PSB1bml0X3NpemUgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KSA9PSBjb3VudCBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpID09IHN0YXRlIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICBJU19BTElHTkVEKFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpLCBzaXplKSkge1xcbitcXHRcXHRcXHRzcm8tXFx1MDAzZWFkZHJfY291bnQtLTtcXG4rXFx0XFx0XFx0c3dhcChzcm8tXFx1MDAzZWFkZHJfbGlzdFtzcm8tXFx1MDAzZWFkZHJfY291bnRdLFxcbitcXHRcXHRcXHQgICAgIHNyby1cXHUwMDNlYWRkcl9saXN0W2ldKTtcXG4rXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgMSk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHR2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3Qoc2l6ZSwgZ2ZwKTtcXG4rXFx0aWYgKCF2aXJ0KVxcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFx0cGh5cyA9IHZpcnRfdG9fcGh5cyh2aXJ0KTtcXG4rXFxuK1xcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCkge1xcbitcXHRcXHRwaHlzX2FkZHJfdCBkZWxlZ2F0ZWRfcGh5cztcXG4rXFxuK1xcdFxcdGlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgc2l6ZSwgXFx1MDAyNmRlbGVnYXRlZF9waHlzKSkge1xcbitcXHRcXHRcXHRpZiAoIXJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIGRlbGVnYXRlZF9waHlzIC0gcGh5cykpXFxuK1xcdFxcdFxcdFxcdGZyZWVfcGFnZXNfZXhhY3QodmlydCwgc2l6ZSk7XFxuK1xcdFxcdFxcdHJldHVybiAtRU5YSU87XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0YWRkcl9yYW5nZSA9IHBoeXMgXFx1MDAyNiBSTUlfQUREUl9SQU5HRV9BRERSX01BU0s7XFxuK1xcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TSVpFX01BU0ssIFxcdTAwMjZhZGRyX3JhbmdlLCB1bml0X3NpemUpO1xcbitcXHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTSywgXFx1MDAyNmFkZHJfcmFuZ2UsIGNvdW50KTtcXG4rXFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFxcdTAwMjZhZGRyX3JhbmdlLCBzdGF0ZSk7XFxuK1xcbitcXHRzcm8tXFx1MDAzZWFkZHJfbGlzdFtzcm8tXFx1MDAzZWFkZHJfY291bnRdID0gYWRkcl9yYW5nZTtcXG4rXFxuK291dDpcXG4rXFx0cm1pX29wX21lbV9kb25hdGUoc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICB2aXJ0X3RvX3BoeXMoXFx1MDAyNnNyby1cXHUwMDNlYWRkcl9saXN0W3Nyby1cXHUwMDNlYWRkcl9jb3VudF0pLCAxLFxcbitcXHRcXHRcXHQgIDAsIG91dF9yZWdzKTtcXG4rXFxuK1xcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9ncmFudWxlcyA9IG91dF9yZWdzLVxcdTAwM2VhMTtcXG4rXFx0dW5zaWduZWQgbG9uZyBkb25hdGVkX3NpemUgPSBkb25hdGVkX2dyYW51bGVzIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQ7XFxuK1xcbitcXHRpZiAoZG9uYXRlZF9ncmFudWxlcyA9PSAwKSB7XFxuK1xcdFxcdC8qIE5vIHBhZ2VzIHVzZWQgYnkgdGhlIFJNTSAqL1xcbitcXHRcXHRzcm8tXFx1MDAzZWFkZHJfY291bnQrKztcXG4rXFx0fSBlbHNlIGlmIChkb25hdGVkX3NpemUgXFx1MDAzYyBzaXplKSB7XFxuK1xcdFxcdHBoeXMgPSBzcm8tXFx1MDAzZWFkZHJfbGlzdFtzcm8tXFx1MDAzZWFkZHJfY291bnRdIFxcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xcbitcXG4rXFx0XFx0LyogTm90IGFsbCBncmFudWxlcyB1c2VkIGJ5IHRoZSBSTU0sIGZyZWUgdGhlIHJlbWFpbmluZyBwYWdlcyAqL1xcbitcXHRcXHRmb3IgKGxvbmcgaSA9IGRvbmF0ZWRfc2l6ZTsgaSBcXHUwMDNjIHNpemU7IGkgKz0gUEFHRV9TSVpFKSB7XFxuK1xcdFxcdFxcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRClcXG4rXFx0XFx0XFx0XFx0ZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzICsgaSk7XFxuK1xcdFxcdFxcdGVsc2VcXG4rXFx0XFx0XFx0XFx0X19mcmVlX3BhZ2UocGh5c190b19wYWdlKHBoeXMgKyBpKSk7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfbm9uY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSxcXG4rXFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLFxcbitcXHRcXHRcXHRcXHQgICAgZ2ZwX3QgZ2ZwKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplID0gUk1JX0RPTkFURV9TSVpFKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplX2J5dGVzID0gZG9uYXRlX3JlcV90b19zaXplKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3RhdGUgPSBSTUlfRE9OQVRFX1NUQVRFKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZm91bmQgPSAwO1xcbitcXHR1bnNpZ25lZCBsb25nIGFkZHJfbGlzdF9zdGFydCA9IHNyby1cXHUwMDNlYWRkcl9jb3VudDtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2MgYWRkcl9saXN0X3N0YXJ0IFxcdTAwMjZcXHUwMDI2IGZvdW5kIFxcdTAwM2MgY291bnQ7IGkrKykge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLVxcdTAwM2VhZGRyX2xpc3RbaV07XFxuK1xcbitcXHRcXHRpZiAoUk1JX0FERFJfUkFOR0VfU0laRShlbnRyeSkgPT0gdW5pdF9zaXplIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICBSTUlfQUREUl9SQU5HRV9DT1VOVChlbnRyeSkgPT0gMSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpID09IHN0YXRlKSB7XFxuK1xcdFxcdFxcdGFkZHJfbGlzdF9zdGFydC0tO1xcbitcXHRcXHRcXHRzd2FwKHNyby1cXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydF0sXFxuK1xcdFxcdFxcdCAgICAgc3JvLVxcdTAwM2VhZGRyX2xpc3RbaV0pO1xcbitcXHRcXHRcXHRmb3VuZCsrO1xcbitcXHRcXHRcXHRpLS07XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gcm1pX3Nyb19lbnN1cmVfY2FwYWNpdHkoc3JvLCBjb3VudCAtIGZvdW5kKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHdoaWxlIChmb3VuZCBcXHUwMDNjIGNvdW50KSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgYWRkcl9yYW5nZTtcXG4rXFx0XFx0dm9pZCAqdmlydCA9IGFsbG9jX3BhZ2VzX2V4YWN0KHVuaXRfc2l6ZV9ieXRlcywgZ2ZwKTtcXG4rXFx0XFx0cGh5c19hZGRyX3QgcGh5cztcXG4rXFxuK1xcdFxcdGlmICghdmlydClcXG4rXFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcbitcXHRcXHRwaHlzID0gdmlydF90b19waHlzKHZpcnQpO1xcbitcXG4rXFx0XFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7XFxuK1xcdFxcdFxcdHBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzO1xcbitcXG4rXFx0XFx0XFx0aWYgKHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCB1bml0X3NpemVfYnl0ZXMsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBcXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XFxuK1xcdFxcdFxcdFxcdGlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSlcXG4rXFx0XFx0XFx0XFx0XFx0ZnJlZV9wYWdlc19leGFjdCh2aXJ0LCB1bml0X3NpemVfYnl0ZXMpO1xcbitcXHRcXHRcXHRcXHRyZXR1cm4gLUVOWElPO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGFkZHJfcmFuZ2UgPSBwaHlzIFxcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xcbitcXHRcXHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCBcXHUwMDI2YWRkcl9yYW5nZSwgdW5pdF9zaXplKTtcXG4rXFx0XFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIFxcdTAwMjZhZGRyX3JhbmdlLCAxKTtcXG4rXFx0XFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFxcdTAwMjZhZGRyX3JhbmdlLCBzdGF0ZSk7XFxuK1xcbitcXHRcXHRzcm8tXFx1MDAzZWFkZHJfbGlzdFtzcm8tXFx1MDAzZWFkZHJfY291bnQrK10gPSBhZGRyX3JhbmdlO1xcbitcXHRcXHRmb3VuZCsrO1xcbitcXHR9XFxuK1xcbitcXHRybWlfb3BfbWVtX2RvbmF0ZShzcm9faGFuZGxlLFxcbitcXHRcXHRcXHQgIHZpcnRfdG9fcGh5cyhcXHUwMDI2c3JvLVxcdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSksXFxuK1xcdFxcdFxcdCAgZm91bmQsIDAsIG91dF9yZWdzKTtcXG4rXFxuK1xcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9ncmFudWxlcyA9IG91dF9yZWdzLVxcdTAwM2VhMTtcXG4rXFx0dW5zaWduZWQgbG9uZyBncmFudWxlc19wZXJfdW5pdCA9IHVuaXRfc2l6ZV9ieXRlcyBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbitcXHR1bnNpZ25lZCBsb25nIGNvbnN1bWVkX3VuaXRzO1xcbitcXG4rXFx0LypcXG4rXFx0ICogVGhlIFJNTSBzaG91bGRuJ3QgcmVwb3J0IG1vcmUgZ3JhbnVsZXMgdGhhbiB3ZSBwcm92aWRlZCwgYnV0IGNsYW1wXFxuK1xcdCAqIGp1c3QgaW4gY2FzZS5cXG4rXFx0ICovXFxuK1xcdGlmIChXQVJOX09OX09OQ0UoZG9uYXRlZF9ncmFudWxlcyBcXHUwMDNlIGZvdW5kICogZ3JhbnVsZXNfcGVyX3VuaXQpKVxcbitcXHRcXHRkb25hdGVkX2dyYW51bGVzID0gZm91bmQgKiBncmFudWxlc19wZXJfdW5pdDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSBSTU0gcmVwb3J0cyB0aGUgY29uc3VtZWQgbWVtb3J5IGluIHRlcm1zIG9mIGdyYW51bGVzLCBidXQgd2VcXG4rXFx0ICogdHJhY2sgaW4gdGhlIGFkZHJlc3MgbGlzdHMgaW4gdW5pdC1zaXplZCByYW5nZXMuIFNvIGRpdmlkZSB0byBnZXRcXG4rXFx0ICogdGhlIG51bWJlciBvZiAoY29tcGxldGUpIGNvbnN1bWVkIHVuaXRzLlxcbitcXHQgKi9cXG4rXFx0Y29uc3VtZWRfdW5pdHMgPSBkb25hdGVkX2dyYW51bGVzIC8gZ3JhbnVsZXNfcGVyX3VuaXQ7XFxuK1xcdGlmIChkb25hdGVkX2dyYW51bGVzICUgZ3JhbnVsZXNfcGVyX3VuaXQpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogQSB1bml0IGhhcyBiZWVuIHBhcnRpYWxseSBjb25zdW1lZCwgdGhlIHN0YXJ0IGlzIG93bmVkIGJ5XFxuK1xcdFxcdCAqIHRoZSBSTU0sIHRoZSB0YWlsIGlzIG93bmVkIGJ5IHRoZSBob3N0XFxuK1xcdFxcdCAqL1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGVudHJ5ID1cXG4rXFx0XFx0XFx0c3JvLVxcdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0ICsgY29uc3VtZWRfdW5pdHNdO1xcbitcXHRcXHRwaHlzX2FkZHJfdCBwaHlzID0gUk1JX0FERFJfUkFOR0VfQUREUihlbnRyeSk7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplID1cXG4rXFx0XFx0XFx0KGRvbmF0ZWRfZ3JhbnVsZXMgJSBncmFudWxlc19wZXJfdW5pdCkgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVDtcXG4rXFxuK1xcdFxcdC8qIEZyZWUgdGhlIHRhaWwgYmFjayAqL1xcbitcXHRcXHRmb3IgKHVuc2lnbmVkIGxvbmcgaSA9IGRvbmF0ZWRfc2l6ZTsgaSBcXHUwMDNjIHVuaXRfc2l6ZV9ieXRlcztcXG4rXFx0XFx0ICAgICBpICs9IFBBR0VfU0laRSkge1xcbitcXHRcXHRcXHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpXFxuK1xcdFxcdFxcdFxcdGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyArIGkpO1xcbitcXHRcXHRcXHRlbHNlXFxuK1xcdFxcdFxcdFxcdF9fZnJlZV9wYWdlKHBoeXNfdG9fcGFnZShwaHlzICsgaSkpO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBUaGlzIHVuaXQgaXMgbm93IGZ1bGx5ICdjb25zdW1lZCcgKGVpdGhlciBoZWxkIGJ5IHRoZSBSTU0gb3JcXG4rXFx0XFx0ICogZnJlZWQpXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRjb25zdW1lZF91bml0cysrO1xcbitcXHR9XFxuK1xcbitcXHQvKiBLZWVwIGp1c3QgdGhlIHVuaXRzIHRoZSBSTU0gZGlkbid0IHVzZSBpbiBhZGRyX2xpc3QgKi9cXG4rXFx0Zm9yICh1bnNpZ25lZCBsb25nIGkgPSBjb25zdW1lZF91bml0czsgaSBcXHUwMDNjIGZvdW5kOyBpKyspXFxuK1xcdFxcdHNyby1cXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCArIGkgLSBjb25zdW1lZF91bml0c10gPVxcbitcXHRcXHRcXHRzcm8tXFx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgKyBpXTtcXG4rXFxuK1xcdHNyby1cXHUwMDNlYWRkcl9jb3VudCAtPSBjb25zdW1lZF91bml0cztcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuK1xcdFxcdFxcdCAgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxcbitcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxcbitcXHRcXHRcXHQgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MsXFxuK1xcdFxcdFxcdCAgZ2ZwX3QgZ2ZwKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XFxuK1xcbitcXHRpZiAoV0FSTl9PTl9PTkNFKCFjb3VudCkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0aWYgKFJNSV9ET05BVEVfQ09OVElHKGRvbmF0ZXJlcSkpIHtcXG4rXFx0XFx0cmV0dXJuIHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzcm8sIHNyb19oYW5kbGUsIGRvbmF0ZXJlcSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICByZWdzLCBnZnApO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRyZXR1cm4gcm1pX3Nyb19kb25hdGVfbm9uY29udGlnKHNybywgc3JvX2hhbmRsZSwgZG9uYXRlcmVxLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRyZWdzLCBnZnApO1xcbitcXHR9XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcm1pX3Nyb19yZWNsYWltKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuK1xcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBjYXBhY2l0eTtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgMSk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJtaV9zcm9fZnJlZShzcm8pO1xcbitcXG4rXFx0Y2FwYWNpdHkgPSBSTUlfTUFYX0FERFJfTElTVCAtIHNyby1cXHUwMDNlYWRkcl9jb3VudDtcXG4rXFxuK1xcdHJtaV9vcF9tZW1fcmVjbGFpbShzcm9faGFuZGxlLFxcbitcXHRcXHRcXHQgICB2aXJ0X3RvX3BoeXMoXFx1MDAyNnNyby1cXHUwMDNlYWRkcl9saXN0W3Nyby1cXHUwMDNlYWRkcl9jb3VudF0pLFxcbitcXHRcXHRcXHQgICBjYXBhY2l0eSwgb3V0X3JlZ3MpO1xcbitcXG4rXFx0aWYgKFdBUk5fT05fT05DRShvdXRfcmVncy1cXHUwMDNlYTEgXFx1MDAzZSBjYXBhY2l0eSkpXFxuK1xcdFxcdG91dF9yZWdzLVxcdTAwM2VhMSA9IGNhcGFjaXR5O1xcbitcXG4rXFx0c3JvLVxcdTAwM2VhZGRyX2NvdW50ICs9IG91dF9yZWdzLVxcdTAwM2VhMTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbit2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxcbit7XFxuK1xcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2Mgc3JvLVxcdTAwM2VhZGRyX2NvdW50OyBpKyspIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9IHNyby1cXHUwMDNlYWRkcl9saXN0W2ldO1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGFkZHIgPSBSTUlfQUREUl9SQU5HRV9BRERSKGVudHJ5KTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfQUREUl9SQU5HRV9TSVpFKGVudHJ5KTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBzaXplID0gZG9uYXRlX3JlcV90b19zaXplKHVuaXRfc2l6ZSkgKiBjb3VudDtcXG4rXFxuK1xcdFxcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCkge1xcbitcXHRcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3JhbmdlKGFkZHIsIHNpemUpKSkge1xcbitcXHRcXHRcXHRcXHQvKiBMZWFrIHRoZSBwYWdlcyAqL1xcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcdFxcdGZyZWVfcGFnZXNfZXhhY3QocGh5c190b192aXJ0KGFkZHIpLCBzaXplKTtcXG4rXFx0fVxcbitcXG4rXFx0c3JvLVxcdTAwM2VhZGRyX2NvdW50ID0gMDtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX2ZyZWUpO1xcbitcXG4rdW5zaWduZWQgbG9uZyBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLCBnZnBfdCBnZnApXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBzcm9faGFuZGxlO1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzID0gXFx1MDAyNnNyby1cXHUwMDNlcmVncztcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UocmVncywgcmVncyk7XFxuK1xcbitcXHRzcm9faGFuZGxlID0gcmVncy1cXHUwMDNlYTE7XFxuK1xcbitcXHR3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cXHUwMDNlYTApID09IFJNSV9JTkNPTVBMRVRFKSB7XFxuK1xcdFxcdGJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLVxcdTAwM2VhMCk7XFxuK1xcdFxcdGludCByZXQgPSAwO1xcbitcXG4rXFx0XFx0c3dpdGNoIChSTUlfUkVUVVJOX01FTVJFUShyZWdzLVxcdTAwM2VhMCkpIHtcXG4rXFx0XFx0Y2FzZSBSTUlfT1BfTUVNX1JFUV9OT05FOlxcbitcXHRcXHRcXHRybWlfb3BfY29udGludWUoc3JvX2hhbmRsZSwgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkcsXFxuK1xcdFxcdFxcdFxcdFxcdHJlZ3MpO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSBSTUlfT1BfTUVNX1JFUV9ET05BVEU6XFxuK1xcdFxcdFxcdHJldCA9IHJtaV9zcm9fZG9uYXRlKHNybywgc3JvX2hhbmRsZSwgcmVncy1cXHUwMDNlYTIsIHJlZ3MsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgZ2ZwKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgUk1JX09QX01FTV9SRVFfUkVDTEFJTTpcXG4rXFx0XFx0XFx0cmV0ID0gcm1pX3Nyb19yZWNsYWltKHNybywgc3JvX2hhbmRsZSwgcmVncyk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRkZWZhdWx0OlxcbitcXHRcXHRcXHRyZXQgPSBXQVJOX09OX09OQ0UoMSk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRpZiAocmV0KSB7XFxuK1xcdFxcdFxcdGlmIChjYW5fY2FuY2VsKVxcbitcXHRcXHRcXHRcXHRybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpO1xcbitcXG4rXFx0XFx0XFx0aWYgKFdBUk5fT05fT05DRShSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVxcdTAwM2VhMCkgIT0gUk1JX0lOQ09NUExFVEUpKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiByZWdzLVxcdTAwM2VhMDtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX21lbXhmZXJfZXhlY3V0ZSk7XFxuK1xcbisvKiBGb3IgUk1JIGNvbW1hbmRzIHRoYXQgYXJlIHN0YXRlZnVsIGJ1dCBub3QgbWVtb3J5LXRyYW5zZmVycmluZyAqL1xcbit1bnNpZ25lZCBsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UocmVncywgcmVncyk7XFxuK1xcbitcXHRzcm9faGFuZGxlID0gcmVncy1cXHUwMDNlYTE7XFxuK1xcbitcXHR3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cXHUwMDNlYTApID09IFJNSV9JTkNPTVBMRVRFKSB7XFxuK1xcdFxcdGJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLVxcdTAwM2VhMCk7XFxuK1xcbitcXHRcXHRzd2l0Y2ggKFJNSV9SRVRVUk5fTUVNUkVRKHJlZ3MtXFx1MDAzZWEwKSkge1xcbitcXHRcXHRjYXNlIFJNSV9PUF9NRU1fUkVRX05PTkU6XFxuK1xcdFxcdFxcdHJtaV9vcF9jb250aW51ZShzcm9faGFuZGxlLCBSTUlfQ09OVElOVUVfS0VFUF9HT0lORyxcXG4rXFx0XFx0XFx0XFx0XFx0cmVncyk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRkZWZhdWx0OlxcbitcXHRcXHRcXHRXQVJOX09OX09OQ0UoMSk7XFxuK1xcdFxcdFxcdGlmICghY2FuX2NhbmNlbClcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIHJlZ3MtXFx1MDAzZWEwO1xcbitcXG4rXFx0XFx0XFx0cm1pX29wX2NhbmNlbChzcm9faGFuZGxlLCByZWdzKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gcmVncy1cXHUwMDNlYTA7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19leGVjdXRlKTtcXG4rXFxuK3N0YXRpYyBpbnQgcm1pX2NoZWNrX3ZlcnNpb24odm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XFxuK1xcdHVuc2lnbmVkIHNob3J0IHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3I7XFxuK1xcdHVuc2lnbmVkIGxvbmcgaG9zdF92ZXJzaW9uID0gUk1JX0FCSV9WRVJTSU9OKFJNSV9BQklfTUFKT1JfVkVSU0lPTixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pO1xcbitcXHR1bnNpZ25lZCBsb25nIGFhNjRwZnIwID0gcmVhZF9zYW5pdGlzZWRfZnRyX3JlZyhTWVNfSURfQUE2NFBGUjBfRUwxKTtcXG4rXFxuK1xcdC8qIElmIFJNRSBpc24ndCBzdXBwb3J0ZWQsIHRoZW4gUk1JIGNhbid0IGJlICovXFxuK1xcdGlmIChjcHVpZF9mZWF0dXJlX2V4dHJhY3RfdW5zaWduZWRfZmllbGQoYWE2NHBmcjAsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQpID09IDApXFxuK1xcdFxcdHJldHVybiAtRU5YSU87XFxuK1xcbitcXHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1ZFUlNJT04sIGhvc3RfdmVyc2lvbiwgXFx1MDAyNnJlcyk7XFxuK1xcbitcXHRpZiAocmVzLmEwID09IFNNQ0NDX1JFVF9OT1RfU1VQUE9SVEVEKVxcbitcXHRcXHRyZXR1cm4gLUVOWElPO1xcbitcXG4rXFx0dmVyc2lvbl9tYWpvciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IocmVzLmExKTtcXG4rXFx0dmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmExKTtcXG4rXFxuK1xcdGlmIChyZXMuYTAgIT0gUk1JX1NVQ0NFU1MpIHtcXG4rXFx0XFx0dW5zaWduZWQgc2hvcnQgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3I7XFxuK1xcbitcXHRcXHRoaWdoX3ZlcnNpb25fbWFqb3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHJlcy5hMik7XFxuK1xcdFxcdGhpZ2hfdmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmEyKTtcXG4rXFxuK1xcdFxcdHByX2VycihcXFwiVW5zdXBwb3J0ZWQgUk1JIEFCSSAodiVkLiVkIC0gdiVkLiVkKSB3ZSB3YW50IHYlZC4lZFxcXFxuXFxcIixcXG4rXFx0XFx0ICAgICAgIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IsXFxuK1xcdFxcdCAgICAgICBoaWdoX3ZlcnNpb25fbWFqb3IsIGhpZ2hfdmVyc2lvbl9taW5vcixcXG4rXFx0XFx0ICAgICAgIFJNSV9BQklfTUFKT1JfVkVSU0lPTixcXG4rXFx0XFx0ICAgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7XFxuK1xcdFxcdHJldHVybiAtRU5YSU87XFxuK1xcdH1cXG4rXFxuK1xcdHByX2luZm8oXFxcIlJNSSBBQkkgdmVyc2lvbiAlZC4lZFxcXFxuXFxcIiwgdmVyc2lvbl9tYWpvciwgdmVyc2lvbl9taW5vcik7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBybWlfcmVhZF9mZWF0dXJlcyh2b2lkKVxcbit7XFxuK1xcdC8qXFxuK1xcdCAqIFNpbmNlIHdlJ3ZlIG5lZ290aWF0ZWQgYSBjb21wYXRpYmxlIHZlcnNpb24gdGhlc2UgZmVhdHVyZSByZWdpc3RlcnNcXG4rXFx0ICogc2hvdWxkIGFsd2F5cyBiZSBhdmFpbGFibGVcXG4rXFx0ICovXFxuK1xcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2MgUk1JX0ZFQVRfUkVHX0NPVU5UOyBpKyspIHtcXG4rXFx0XFx0aWYgKFdBUk5fT04ocm1pX2ZlYXR1cmVzKGksIFxcdTAwMjZybWlfZmVhdF9yZWdfY2FjaGVbaV0pKSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9jb25maWd1cmUodm9pZClcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIHJldDtcXG4rXFx0c3RydWN0IHJtbV9jb25maWcgKmNvbmZpZyBfX2ZyZWUoZnJlZV9wYWdlKSA9IChzdHJ1Y3Qgcm1tX2NvbmZpZyAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcXG4rXFx0c3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyBfX2ZyZWUoa2ZyZWUpID0gKHN0cnVjdCBybWlfc3JvX3N0YXRlICopa21hbGxvY19vYmooKnNybyk7XFxuK1xcbitcXHRpZiAoIWNvbmZpZyB8fCAhc3JvKVxcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdHN3aXRjaCAoUEFHRV9TSVpFKSB7XFxuK1xcdGNhc2UgU1pfNEs6XFxuK1xcdFxcdGNvbmZpZy1cXHUwMDNlcm1pX2dyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNEtCO1xcbitcXHRcXHRicmVhaztcXG4rXFx0Y2FzZSBTWl8xNks6XFxuK1xcdFxcdGNvbmZpZy1cXHUwMDNlcm1pX2dyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfMTZLQjtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgU1pfNjRLOlxcbitcXHRcXHRjb25maWctXFx1MDAzZXJtaV9ncmFudWxlX3NpemUgPSBSTUlfR1JBTlVMRV9TSVpFXzY0S0I7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRkZWZhdWx0OlxcbitcXHRcXHRCVUlMRF9CVUcoKTtcXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogRm9yIG5vdyB3ZSBzZXQgdGhlIHRyYWNraW5nX3JlZ2lvbl9zaXplIHRvIDAgd2hpY2ggaXMgdGhlIG9ubHkgb3B0aW9uXFxuK1xcdCAqIGZvciA0S0IgUEFHRV9TSVpFICgxR0IgZm9yIDRLQiBQQUdFX1NJWkUsIDMyTUIvNTEyTUIgZm9yIDE2S0IvNjRLQikuXFxuK1xcdCAqIFRPRE86IFN1cHBvcnQgb3RoZXIgdHJhY2tpbmcgc2l6ZXMgdmlhIEtjb25maWcgb3B0aW9uIGZvciBvdGhlclxcbitcXHQgKiBQQUdFX1NJWkVTXFxuK1xcdCAqL1xcbitcXHRjb25maWctXFx1MDAzZXRyYWNraW5nX3JlZ2lvbl9zaXplID0gMDtcXG4rXFxuK1xcdHJldCA9IHJtaV9ybW1fY29uZmlnX3NldCh2aXJ0X3RvX3BoeXMoY29uZmlnKSk7XFxuK1xcdGlmIChyZXQpIHtcXG4rXFx0XFx0cHJfZXJyKFxcXCJSTU0gY29uZmlnIHNldCBmYWlsZWRcXFxcblxcXCIpO1xcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gcm1pX3JtbV9hY3RpdmF0ZShzcm8pO1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdHByX2VycihcXFwiUk1NIGFjdGl2YXRlIGZhaWxlZFxcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiAtRU5YSU87XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKlxcbisgKiBNYWtlIHN1cmUgdGhlIGFyZWEgaXMgdHJhY2tlZCBieSBSTU0gYXQgRklORSBncmFudWxhcml0eS5cXG4rICogV2UgZG8gbm90IHN1cHBvcnQgY2hhbmdpbmcgdGhlIHRyYWNraW5nIHlldC5cXG4rICovXFxuK3N0YXRpYyBpbnQgcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcXG4re1xcbitcXHR3aGlsZSAoc3RhcnQgXFx1MDAzYyBlbmQpIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyByZXQsIGNhdGVnb3J5LCBzdGF0ZSwgbmV4dDtcXG4rXFxuK1xcdFxcdHJldCA9IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldChzdGFydCwgZW5kLCBcXHUwMDI2Y2F0ZWdvcnksIFxcdTAwMjZzdGF0ZSwgXFx1MDAyNm5leHQpO1xcbitcXHRcXHRpZiAocmV0ICE9IFJNSV9TVUNDRVNTIHx8XFxuK1xcdFxcdCAgICBzdGF0ZSAhPSBSTUlfVFJBQ0tJTkdfRklORSB8fFxcbitcXHRcXHQgICAgY2F0ZWdvcnkgIT0gUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUwpIHtcXG4rXFx0XFx0XFx0LyogVE9ETzogU2V0IGdyYW51bGUgdHJhY2tpbmcgaW4gdGhpcyBjYXNlICovXFxuK1xcdFxcdFxcdHByX2VycihcXFwiR3JhbnVsZSB0cmFja2luZyBmb3IgcmVnaW9uIGlzbid0IGZpbmUvY29udmVudGlvbmFsOiAlbGx4XFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICAgICAgc3RhcnQpO1xcbitcXHRcXHRcXHRyZXR1cm4gLUVOT0RFVjtcXG4rXFx0XFx0fVxcbitcXHRcXHRzdGFydCA9IG5leHQ7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9jcmVhdGVfZ3B0cyhwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKVxcbit7XFxuK1xcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm87XFxuK1xcdHVuc2lnbmVkIGxvbmcgbDBncHRfc3o7XFxuK1xcbitcXHRzcm8gPSBrbWFsbG9jX29iaigqc3JvLCBHRlBfS0VSTkVMKTtcXG4rXFx0aWYgKCFzcm8pXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4rXFx0bDBncHRfc3ogPSAxVUwgXFx1MDAzY1xcdTAwM2MgKDMwICsgRklFTERfR0VUKFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfTDBHUFRTWixcXG4rXFx0XFx0XFx0XFx0XFx0ICBybWlfZmVhdF9yZWcoMSkpKTtcXG4rXFx0c3RhcnQgPSBBTElHTl9ET1dOKHN0YXJ0LCBsMGdwdF9zeik7XFxuK1xcdGVuZCA9IEFMSUdOKGVuZCwgbDBncHRfc3opO1xcbitcXG4rXFx0d2hpbGUgKHN0YXJ0IFxcdTAwM2MgZW5kKSB7XFxuK1xcdFxcdGludCByZXQgPSBybWlfZ3B0X2wxX2NyZWF0ZShzdGFydCwgc3JvLCBHRlBfS0VSTkVMKTtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIE1ha2Ugc3VyZSB0aGUgTDEgR1BUIHRhYmxlcyBhcmUgY3JlYXRlZCBmb3IgdGhlIHJlZ2lvbi5cXG4rXFx0XFx0ICogUk1JX0VSUk9SX0dQVCBpbmRpY2F0ZXMgdGhlIEwxIHRhYmxlIGFscmVhZHkgZXhpc3RzLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKHJldCAhPSBSTUlfU1VDQ0VTUyBcXHUwMDI2XFx1MDAyNiBSTUlfUkVUVVJOX1NUQVRVUyhyZXQpICE9IFJNSV9FUlJPUl9HUFQpIHtcXG4rXFx0XFx0XFx0cHJfZXJyKFxcXCJHUFQgTGV2ZWwxIHRhYmxlIG1pc3NpbmcgZm9yICVsbHhcXFxcblxcXCIsIHN0YXJ0KTtcXG4rXFx0XFx0XFx0a2ZyZWUoc3JvKTtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcdFxcdH1cXG4rXFx0XFx0c3RhcnQgKz0gbDBncHRfc3o7XFxuK1xcdH1cXG4rXFxuK1xcdGtmcmVlKHNybyk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9pbml0X21ldGFkYXRhKHZvaWQpXFxuK3tcXG4rXFx0cGh5c19hZGRyX3Qgc3RhcnQsIGVuZDtcXG4rXFx0Y29uc3Qgc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcjtcXG4rXFxuK1xcdGZvcl9lYWNoX21lbV9yZWdpb24ocikge1xcbitcXHRcXHRpbnQgcmV0O1xcbitcXG4rXFx0XFx0c3RhcnQgPSBtZW1ibG9ja19yZWdpb25fbWVtb3J5X2Jhc2VfcGZuKHIpIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQ7XFxuK1xcdFxcdGVuZCA9IG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfZW5kX3BmbihyKSBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUO1xcbitcXHRcXHRyZXQgPSBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhzdGFydCwgZW5kKTtcXG4rXFx0XFx0aWYgKHJldClcXG4rXFx0XFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0XFx0cmV0ID0gcm1pX2NyZWF0ZV9ncHRzKHN0YXJ0LCBlbmQpO1xcbitcXHRcXHRpZiAocmV0KVxcbitcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rYm9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIGFybTY0X3JtaV9pc19hdmFpbGFibGU7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgX19pbml0IGFybTY0X2luaXRfcm1pKHZvaWQpXFxuK3tcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdC8qIENvbnRpbnVlIHdpdGhvdXQgcmVhbG0gc3VwcG9ydCBpZiB3ZSBjYW4ndCBhZ3JlZSBvbiBhIHZlcnNpb24gKi9cXG4rXFx0cmV0ID0gcm1pX2NoZWNrX3ZlcnNpb24oKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldCA9IHJtaV9yZWFkX2ZlYXR1cmVzKCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBybWlfY29uZmlndXJlKCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBybWlfaW5pdF9tZXRhZGF0YSgpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0YXJtNjRfcm1pX2lzX2F2YWlsYWJsZSA9IHRydWU7XFxuK1xcdHByX2luZm8oXFxcIlJNSSBjb25maWd1cmVkXFxcIik7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLypcXG4rICogTm90ZSBhcm02NF9pbml0X3JtaSgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBrdm1faW5pdF9ybWkoKSBvdGhlcndpc2UgS1ZNXFxuKyAqIHdpbGwgbm90IHN1cHBvcnQgcmVhbG0gZ3Vlc3RzLiBzdWJzeXNfaW5pdGNhbGwoKSBpcyBjYWxsZWQgYmVmb3JlXFxuKyAqIG1vZHVsZV9pbml0KCkgKHVzZWQgZm9yIEtWTSkgc28gdGhpcyBpcyBPSy5cXG4rICovXFxuK3N1YnN5c19pbml0Y2FsbChhcm02NF9pbml0X3JtaSk7XFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmggYi9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMTM4OTgzYWI0ZTNjMjJcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaFxcbkBAIC0wLDAgKzEsMjA1IEBAXFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXFxuKy8qXFxuKyAqIENvcHlyaWdodCAoQykgMjAyNiBBUk0gTHRkLlxcbisgKi9cXG4rXFxuKyNpZm5kZWYgX19MSU5VWF9BUk1fUk1JX0NNRFNfSF9cXG4rI2RlZmluZSBfX0xJTlVYX0FSTV9STUlfQ01EU19IX1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2FybS1zbWNjYy1ybWkuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2J1Zy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvdHlwZXMuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2Nhc20vcGFnZS5oXFx1MDAzZVxcbitcXG4rc3RydWN0IHJ0dF9lbnRyeSB7XFxuK1xcdHVuc2lnbmVkIGxvbmcgd2Fsa19sZXZlbDtcXG4rXFx0dW5zaWduZWQgbG9uZyBkZXNjO1xcbitcXHRpbnQgc3RhdGU7XFxuK1xcdGludCByaXBhcztcXG4rfTtcXG4rXFxuKyNkZWZpbmUgUk1JX01BWF9BRERSX0xJU1RcXHQyNTZcXG4rXFxuK3N0cnVjdCBybWlfc3JvX3N0YXRlIHtcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzO1xcbitcXHR1bnNpZ25lZCBsb25nIGFkZHJfY291bnQ7XFxuK1xcdHVuc2lnbmVkIGxvbmcgYWRkcl9saXN0W1JNSV9NQVhfQUREUl9MSVNUXTtcXG4rfTtcXG4rXFxuK3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaWQpO1xcbitcXG4raW50IHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUsXFxuK1xcdFxcdCAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpO1xcbitpbnQgcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplKTtcXG4raW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cyk7XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfZGVsZWdhdGVfcGFnZShwaHlzX2FkZHJfdCBwaHlzKVxcbit7XFxuK1xcdHJldHVybiBybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFLCBOVUxMKTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3VuZGVsZWdhdGVfcGFnZShwaHlzX2FkZHJfdCBwaHlzKVxcbit7XFxuK1xcdHJldHVybiBybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBQQUdFX1NJWkUpO1xcbit9XFxuK1xcbitib29sIGlzX3JtaV9hdmFpbGFibGUodm9pZCk7XFxuK1xcbit1bnNpZ25lZCBsb25nIHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sIGdmcF90IGdmcCk7XFxuK3ZvaWQgcm1pX3Nyb19mcmVlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pO1xcbit1bnNpZ25lZCBsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKTtcXG4rXFxuKyNkZWZpbmUgcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIGdmcCwgLi4uKSAoe1xcdFxcdFxcdFxcdFxcXFxcXG4rXFx0c3RydWN0IHJtaV9zcm9fc3RhdGUgKl9fc3JvID0gKHNybyk7XFx0XFx0XFx0XFx0XFxcXFxcbitcXHQqX19zcm8gPSAoc3RydWN0IHJtaV9zcm9fc3RhdGUpeyAucmVncyA9IHtfX1ZBX0FSR1NfX30gfTtcXHRcXFxcXFxuK1xcdGludCBfX3JldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKF9fc3JvLCBnZnApO1xcdFxcdFxcXFxcXG4rXFx0cm1pX3Nyb19mcmVlKF9fc3JvKTtcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuK1xcdF9fcmV0O1xcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4rfSlcXG4rXFxuKy8qKlxcbisgKiBybWlfcm1tX2NvbmZpZ19zZXQoKSAtIENvbmZpZ3VyZSB0aGUgUk1NXFxuKyAqIEBjZmdfcHRyOiBQQSBvZiBhIHN0cnVjdCBybW1fY29uZmlnXFxuKyAqXFxuKyAqIFNldHMgY29uZmlndXJhdGlvbiBvcHRpb25zIG9uIHRoZSBSTU0uXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfcm1tX2NvbmZpZ19zZXQodW5zaWduZWQgbG9uZyBjZmdfcHRyKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcXG4rXFxuK1xcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUk1NX0NPTkZJR19TRVQsIGNmZ19wdHIsIFxcdTAwMjZyZXMpO1xcbitcXG4rXFx0cmV0dXJuIHJlcy5hMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ybW1fYWN0aXZhdGUoKSAtIEFjdGl2YXRlIHRoZSBSTU1cXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ybW1fYWN0aXZhdGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUk1NX0FDVElWQVRFKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ncmFudWxlX3RyYWNraW5nX2dldCgpIC0gR2V0IGNvbmZpZ3VyYXRpb24gb2YgYSBHcmFudWxlIHRyYWNraW5nIHJlZ2lvblxcbisgKiBAc3RhcnQ6IEJhc2UgUEEgb2YgdGhlIHRyYWNraW5nIHJlZ2lvblxcbisgKiBAZW5kOiBFbmQgb2YgdGhlIFBBIHJlZ2lvblxcbisgKiBAb3V0X2NhdGVnb3J5OiBNZW1vcnkgY2F0ZWdvcnlcXG4rICogQG91dF9zdGF0ZTogVHJhY2tpbmcgcmVnaW9uIHN0YXRlXFxuKyAqIEBvdXRfdG9wOiBUb3Agb2YgdGhlIG1lbW9yeSByZWdpb25cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldCh1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbitcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIGVuZCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X2NhdGVnb3J5LFxcbitcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nICpvdXRfc3RhdGUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xcbitcXG4rXFx0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX0dFVCwgc3RhcnQsIGVuZCwgXFx1MDAyNnJlcyk7XFxuK1xcbitcXHRpZiAob3V0X2NhdGVnb3J5KVxcbitcXHRcXHQqb3V0X2NhdGVnb3J5ID0gcmVzLmExO1xcbitcXHRpZiAob3V0X3N0YXRlKVxcbitcXHRcXHQqb3V0X3N0YXRlID0gcmVzLmEyO1xcbitcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZXMuYTM7XFxuK1xcbitcXHRyZXR1cm4gcmVzLmEwO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX2dwdF9sMV9jcmVhdGUoKSAtIENyZWF0ZSBhIExldmVsIDEgR1BUXFxuKyAqIEBhZGRyOiBCYXNlIG9mIHBoeXNpY2FsIGFkZHJlc3MgcmVnaW9uIGRlc2NyaWJlZCBieSB0aGUgTDFHUFRcXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcXG4rICogQGdmcDogQWxsb2NhdGlvbiBmbGFncyBmb3IgU1JPIG1lbW9yeSBkb25hdGlvbiByZXF1ZXN0c1xcbisgKlxcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX2dwdF9sMV9jcmVhdGUodW5zaWduZWQgbG9uZyBhZGRyLFxcbitcXHRcXHRcXHRcXHQgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyxcXG4rXFx0XFx0XFx0XFx0ICAgIGdmcF90IGdmcClcXG4re1xcbitcXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIGdmcCwgU01DX1JNSV9HUFRfTDFfQ1JFQVRFLCBhZGRyKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9mZWF0dXJlcygpIC0gUmVhZCBmZWF0dXJlIHJlZ2lzdGVyXFxuKyAqIEBpbmRleDogRmVhdHVyZSByZWdpc3RlciBpbmRleFxcbisgKiBAb3V0OiBGZWF0dXJlIHJlZ2lzdGVyIHZhbHVlIGlzIHdyaXR0ZW4gdG8gdGhpcyBwb2ludGVyXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfZmVhdHVyZXModW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyAqb3V0KVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcXG4rXFxuK1xcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfRkVBVFVSRVMsIGluZGV4LCBcXHUwMDI2cmVzKTtcXG4rXFxuK1xcdGlmIChvdXQpXFxuK1xcdFxcdCpvdXQgPSByZXMuYTE7XFxuK1xcdHJldHVybiByZXMuYTA7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSgpIC0gRGVsZWdhdGUgZ3JhbnVsZXNcXG4rICogQGJhc2U6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG9mIHRoZSByYW5nZVxcbisgKiBAdG9wOiBQQSBvZiB0aGUgZmlyc3QgZ3JhbnVsZSBhZnRlciB0aGUgcmFuZ2VcXG4rICogQG91dF90b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG5vdCBkZWxlZ2F0ZWRcXG4rICpcXG4rICogRGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlIGZvciB1c2UgYnkgdGhlIHJlYWxtIHdvcmxkLiBJZiB0aGUgZW50aXJlIHJhbmdlXFxuKyAqIHdhcyBkZWxlZ2F0ZWQgdGhlbiBAb3V0X3RvcCA9PSBAdG9wLCBvdGhlcndpc2UgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcXG4rICogYWdhaW4gd2l0aCBAYmFzZSA9PSBAb3V0X3RvcC5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIHRvcCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFLCBiYXNlLCB0b3BcXG4rXFx0fTtcXG4rXFx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ncmFudWxlX3JhbmdlX3VuZGVsZWdhdGUoKSAtIFVuZGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlc1xcbisgKiBAYmFzZTogQmFzZSBQQSBvZiB0aGUgdGFyZ2V0IHJhbmdlXFxuKyAqIEB0b3A6IFRvcCBQQSBvZiB0aGUgdGFyZ2V0IHJhbmdlXFxuKyAqIEBvdXRfdG9wOiBSZXR1cm5zIHRoZSB0b3AgUEEgb2YgcmFuZ2Ugd2hvc2Ugc3RhdGUgaXMgdW5kZWxlZ2F0ZWRcXG4rICpcXG4rICogVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzIHRvIGFsbG93IHVzZSBieSB0aGUgbm9ybWFsIHdvcmxkLiBXaWxsIGZhaWwgaWZcXG4rICogdGhlIGdyYW51bGVzIGFyZSBpbiB1c2UuXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfR1JBTlVMRV9SQU5HRV9VTkRFTEVHQVRFLCBiYXNlLCB0b3BcXG4rXFx0fTtcXG4rXFx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rI2VuZGlmXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oIGIvaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmhcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5jOTY1ZTg4Njc1MThmM1xcbi0tLSAvZGV2L251bGxcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaFxcbkBAIC0wLDAgKzEsNDk5IEBAXFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXFxuKy8qXFxuKyAqIENvcHlyaWdodCAoQykgMjAyMy0yMDI2IEFSTSBMdGQuXFxuKyAqXFxuKyAqIFRoZSB2YWx1ZXMgYW5kIHN0cnVjdHVyZXMgaW4gdGhpcyBmaWxlIGFyZSBmcm9tIHRoZSBSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3JcXG4rICogc3BlY2lmaWNhdGlvbiAoREVOMDEzNykgdmVyc2lvbiAyLjAtYmV0MjpcXG4rICogaHR0cHM6Ly9kZXZlbG9wZXIuYXJtLmNvbS9kb2N1bWVudGF0aW9uL2RlbjAxMzcvMi0wYmV0Mi9cXG4rICovXFxuK1xcbisjaWZuZGVmIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IX1xcbisjZGVmaW5lIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IX1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2FybS1zbWNjYy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYml0ZmllbGQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JpdHMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2J1aWxkX2J1Zy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc2l6ZXMuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2Nhc20vcGFnZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYXNtL3N5c3JlZy5oXFx1MDAzZVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX0NBTEwoZnVuYylcXHRcXHRcXHRcXHRcXFxcXFxuK1xcdEFSTV9TTUNDQ19DQUxMX1ZBTChBUk1fU01DQ0NfRkFTVF9DQUxMLFxcdFxcdFxcXFxcXG4rXFx0XFx0XFx0ICAgQVJNX1NNQ0NDX1NNQ182NCxcXHRcXHRcXFxcXFxuK1xcdFxcdFxcdCAgIEFSTV9TTUNDQ19PV05FUl9TVEFOREFSRCxcXHRcXFxcXFxuK1xcdFxcdFxcdCAgIChmdW5jKSlcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9WRVJTSU9OXFx0XFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1MClcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9NQVBfSU5JVFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNTMpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUkVBTE1fQUNUSVZBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTU3KVxcbisjZGVmaW5lIFNNQ19STUlfUkVBTE1fQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1OClcXG4rI2RlZmluZSBTTUNfUk1JX1JFQUxNX0RFU1RST1lcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTU5KVxcbisjZGVmaW5lIFNNQ19STUlfUkVDX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNWEpXFxuKyNkZWZpbmUgU01DX1JNSV9SRUNfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNWIpXFxuKyNkZWZpbmUgU01DX1JNSV9SRUNfRU5URVJcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTVjKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNWQpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNWUpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUlRUX1JFQURfRU5UUllcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTYxKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9ERVZfVkFMSURBVEVcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTYzKVxcbisjZGVmaW5lIFNNQ19STUlfUFNDSV9DT01QTEVURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjQpXFxuKyNkZWZpbmUgU01DX1JNSV9GRUFUVVJFU1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjUpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfRk9MRFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjYpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUlRUX0lOSVRfUklQQVNcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTY4KVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9SSVBBU1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjkpXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9DUkVBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTZhKVxcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNmIpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUk1NX0NPTkZJR19TRVRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTZlKVxcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfSVJRX05PVElGWVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNmYpXFxuKyNkZWZpbmUgU01DX1JNSV9BVFRFU1RfUExBVF9UT0tFTl9SRUZSRVNIXFx0U01DX1JNSV9DQUxMKDB4MDE3MClcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX0FCT1JUXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE3NClcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfQ09NTVVOSUNBVEVcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTc1KVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9DUkVBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTc2KVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE3NylcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfR0VUX1NUQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE3OClcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUkVGUkVTSFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxN2EpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NFVF9QVUJLRVlcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTdiKVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVE9QXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE3YylcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE3ZClcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxN2UpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0ZPTERcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTdmKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfQUJPUlRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTg1KVxcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9DT01NVU5JQ0FURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxODYpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxODcpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0RFU1RST1lcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTg4KVxcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfU1RBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTg5KVxcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9VTkxPQ0tcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMThhKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9TMkFQXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE4YilcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9JTlRFUkZBQ0VfUkVQT1JUXFx0U01DX1JNSV9DQUxMKDB4MDFkMClcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfR0VUX01FQVNVUkVNRU5UU1xcdFxcdFNNQ19STUlfQ0FMTCgweDAxZDEpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0xPQ0tcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWQyKVxcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9TVEFSVFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZDMpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX1AyUF9CSU5EXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkNClcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfUDJQX1VOQklORFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZDUpXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9FVkVOVF9IQU5ETEVcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWQ2KVxcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfQUNUSVZBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWQ3KVxcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfREVBQ1RJVkFURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZDgpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfQ1JFQVRFXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkYilcXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX1NUX0wyX0RFU1RST1lcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWRjKVxcbisjZGVmaW5lIFNNQ19STUlfRFBUX0wwX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZGQpXFxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDBfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZGUpXFxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDFfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkZilcXG4rI2RlZmluZSBTTUNfUk1JX0RQVF9MMV9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlMClcXG4rI2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfR0VUXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlMSlcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX1NFVFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZTMpXFxuKyNkZWZpbmUgU01DX1JNSV9DTUVNX0FERF9QREVWXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlNClcXG4rI2RlZmluZSBTTUNfUk1JX0NNRU1fQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlNSlcXG4rI2RlZmluZSBTTUNfUk1JX0NNRU1fREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZTYpXFxuKyNkZWZpbmUgU01DX1JNSV9DTUVNX1BPUFVMQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlNylcXG4rI2RlZmluZSBTTUNfUk1JX0NNRU1fUkVNT1ZFX1BERVZcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWU4KVxcbisjZGVmaW5lIFNNQ19STUlfQ01FTV9TVEFSVFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZTkpXFxuKyNkZWZpbmUgU01DX1JNSV9DTUVNX1NUT1BcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWVhKVxcbisjZGVmaW5lIFNNQ19STUlfQ01FTV9VTlBPUFVMQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlYilcXG4rI2RlZmluZSBTTUNfUk1JX1JNTV9DT05GSUdfR0VUXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlYylcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfTUVDX1JFRlJFU0hcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWVkKVxcbisjZGVmaW5lIFNNQ19STUlfUk1NX1NUQVRFX0dFVFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZWUpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfRVZFTlRfQ09OU1VNRVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjApXFxuKyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmMSlcXG4rI2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfUkFOR0VfVU5ERUxFR0FURVxcdFNNQ19STUlfQ0FMTCgweDAxZjIpXFxuKyNkZWZpbmUgU01DX1JNSV9HUFRfTDFfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmMylcXG4rI2RlZmluZSBTTUNfUk1JX0dQVF9MMV9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmNClcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX01BUFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjUpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9VTk1BUFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjYpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX01BUFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjcpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1VOTUFQXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmOClcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9NQVBcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWY5KVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FSQ0hfREVWX1VOTUFQXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmYSlcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9VTlBST1RfTUFQXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmYilcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9VTlBST1RfVU5NQVBcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWZjKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX01BUFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZmQpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1BST1RfVU5NQVBcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWZlKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9VTlBST1RfTUFQXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmZilcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX1VOTUFQXFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwMClcXG4rI2RlZmluZSBTTUNfUk1JX1JFQUxNX1RFUk1JTkFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDEpXFxuKyNkZWZpbmUgU01DX1JNSV9STU1fQUNUSVZBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjAyKVxcbisjZGVmaW5lIFNNQ19STUlfT1BfQ09OVElOVUVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjAzKVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fQ09OTkVDVFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDQpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9ESVNDT05ORUNUXFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwNSlcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTVBMRVRFXFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwNilcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0tFWV9QVVJHRVxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDcpXFxuKyNkZWZpbmUgU01DX1JNSV9PUF9NRU1fRE9OQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwOClcXG4rI2RlZmluZSBTTUNfUk1JX09QX01FTV9SRUNMQUlNXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwOSlcXG4rI2RlZmluZSBTTUNfUk1JX09QX0NBTkNFTFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMGEpXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9GRUFUVVJFU1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMGIpXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9DTURfR0VUXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwYylcXG4rI2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NNRF9DT01QTEVURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMGQpXFxuKyNkZWZpbmUgU01DX1JNSV9QU01NVV9JTkZPXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwZSlcXG4rXFxuKyNkZWZpbmUgUk1JX0FCSV9NQUpPUl9WRVJTSU9OXFx0MlxcbisjZGVmaW5lIFJNSV9BQklfTUlOT1JfVkVSU0lPTlxcdDBcXG4rXFxuKyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUih2ZXJzaW9uKSAoKHZlcnNpb24pIFxcdTAwM2VcXHUwMDNlIDE2KVxcbisjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IodmVyc2lvbikgKCh2ZXJzaW9uKSBcXHUwMDI2IDB4RkZGRilcXG4rI2RlZmluZSBSTUlfQUJJX1ZFUlNJT04obWFqb3IsIG1pbm9yKSAgICAgICgoKG1ham9yKSBcXHUwMDNjXFx1MDAzYyAxNikgfCAobWlub3IpKVxcbitcXG4rI2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVU19NQVNLXFx0XFx0KDB4RkZVTClcXG4rI2RlZmluZSBSTUlfUkVUVVJOX0lOREVYX01BU0tcXHRcXHQoMHhGRlVMIFxcdTAwM2NcXHUwMDNjIDgpXFxuKyNkZWZpbmUgUk1JX1JFVFVSTl9NRU1SRVFfTUFTS1xcdFxcdCgweDNVTCBcXHUwMDNjXFx1MDAzYyA4KVxcbisjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLXFx0KDB4MVVMIFxcdTAwM2NcXHUwMDNjIDEwKVxcbitcXG4rI2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVUyhyZXQpXFx0XFx0RklFTERfR0VUKFJNSV9SRVRVUk5fU1RBVFVTX01BU0ssIHJldClcXG4rI2RlZmluZSBSTUlfUkVUVVJOX0lOREVYKHJldClcXHRcXHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9JTkRFWF9NQVNLLCByZXQpXFxuKyNkZWZpbmUgUk1JX1JFVFVSTl9NRU1SRVEocmV0KVxcdFxcdEZJRUxEX0dFVChSTUlfUkVUVVJOX01FTVJFUV9NQVNLLCByZXQpXFxuKyNkZWZpbmUgUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJldClcXHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMX01BU0ssIHJldClcXG4rXFxuKyNkZWZpbmUgUk1JX1NVQ0NFU1NcXHRcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX0VSUk9SX0lOUFVUXFx0XFx0XFx0MVxcbisjZGVmaW5lIFJNSV9FUlJPUl9SRUFMTVxcdFxcdFxcdDJcXG4rI2RlZmluZSBSTUlfRVJST1JfUkVDXFx0XFx0XFx0M1xcbisjZGVmaW5lIFJNSV9FUlJPUl9SVFRcXHRcXHRcXHQ0XFxuKyNkZWZpbmUgUk1JX0VSUk9SX05PVF9TVVBQT1JURURcXHRcXHQ1XFxuKyNkZWZpbmUgUk1JX0VSUk9SX0RFVklDRVxcdFxcdDZcXG4rI2RlZmluZSBSTUlfRVJST1JfUlRUX0FVWFxcdFxcdDdcXG4rI2RlZmluZSBSTUlfRVJST1JfUFNNTVVfU1RcXHRcXHQ4XFxuKyNkZWZpbmUgUk1JX0VSUk9SX0RQVFxcdFxcdFxcdDlcXG4rI2RlZmluZSBSTUlfQlVTWVxcdFxcdFxcdDEwXFxuKyNkZWZpbmUgUk1JX0VSUk9SX0dMT0JBTFxcdFxcdDExXFxuKyNkZWZpbmUgUk1JX0VSUk9SX1RSQUNLSU5HXFx0XFx0MTJcXG4rI2RlZmluZSBSTUlfSU5DT01QTEVURVxcdFxcdFxcdDEzXFxuKyNkZWZpbmUgUk1JX0JMT0NLRURcXHRcXHRcXHQxNFxcbisjZGVmaW5lIFJNSV9FUlJPUl9HUFRcXHRcXHRcXHQxNVxcbisjZGVmaW5lIFJNSV9FUlJPUl9HUkFOVUxFXFx0XFx0MTZcXG4rXFxuKyNkZWZpbmUgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkdcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX0NPTlRJTlVFX1NUT1BcXHRcXHQxXFxuK1xcbisjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX05PTkVcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX09QX01FTV9SRVFfRE9OQVRFXFx0XFx0MVxcbisjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU1cXHRcXHQyXFxuK1xcbisjZGVmaW5lIFJNSV9ET05BVEVfU0laRV9NQVNLXFx0XFx0M1VMXFxuKyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVF9NQVNLXFx0XFx0R0VOTUFTSygxNSwgMilcXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJR19NQVNLXFx0XFx0QklUKDE2KVxcbisjZGVmaW5lIFJNSV9ET05BVEVfU1RBVEVfTUFTS1xcdFxcdEJJVCgxNylcXG4rXFxuKyNkZWZpbmUgUk1JX0RPTkFURV9TSVpFKHJlcSlcXHRcXHRGSUVMRF9HRVQoUk1JX0RPTkFURV9TSVpFX01BU0ssIHJlcSlcXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPVU5UKHJlcSlcXHRcXHRGSUVMRF9HRVQoUk1JX0RPTkFURV9DT1VOVF9NQVNLLCByZXEpXFxuKyNkZWZpbmUgUk1JX0RPTkFURV9DT05USUcocmVxKVxcdFxcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPTlRJR19NQVNLLCByZXEpXFxuKyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURShyZXEpXFx0XFx0RklFTERfR0VUKFJNSV9ET05BVEVfU1RBVEVfTUFTSywgcmVxKVxcbitcXG4rI2RlZmluZSBSTUlfT1BfTUVNX0RFTEVHQVRFRFxcdFxcdDBcXG4rI2RlZmluZSBSTUlfT1BfTUVNX1VOREVMRUdBVEVEXFx0XFx0MVxcbitcXG4rI2RlZmluZSBSTUlfQUREUl9UWVBFX05PTkVcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9TSU5HTEVcXHRcXHQxXFxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9MSVNUXFx0XFx0MlxcbitcXG4rI2RlZmluZSBSTUlfQUREUl9SQU5HRV9TSVpFX01BU0tcXHRHRU5NQVNLKDEsIDApXFxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTS1xcdEdFTk1BU0soUEFHRV9TSElGVCAtIDEsIDIpXFxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLXFx0KFBBR0VfTUFTSyBcXHUwMDI2IEdFTk1BU0soNTEsIDApKVxcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0tcXHRCSVQoNjMpXFxuK1xcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NJWkUoYXIpXFx0XFx0KEZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9TSVpFX01BU0ssIFxcXFxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgKGFyKSkpXFxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlQoYXIpXFx0KEZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcXFxcXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgIChhcikpKVxcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFIoYXIpXFx0XFx0KChhcikgXFx1MDAyNiBSTUlfQUREUl9SQU5HRV9BRERSX01BU0spXFxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU1RBVEUoYXIpXFx0KEZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcXFxcXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgIChhcikpKVxcbitcXG4rZW51bSBybWlfcmlwYXMge1xcbitcXHRSTUlfRU1QVFkgPSAwLFxcbitcXHRSTUlfUkFNID0gMSxcXG4rXFx0Uk1JX0RFU1RST1lFRCA9IDIsXFxuK1xcdFJNSV9ERVYgPSAzLFxcbit9O1xcbitcXG4rI2RlZmluZSBSTUlfTk9fTUVBU1VSRV9DT05URU5UXFx0MFxcbisjZGVmaW5lIFJNSV9NRUFTVVJFX0NPTlRFTlRcXHQxXFxuK1xcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUzJTWlxcdFxcdEdFTk1BU0soNywgMClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX0xQQTJcXHRcXHRCSVQoOClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1NWRVxcdFxcdEJJVCg5KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFX1ZMXFx0XFx0R0VOTUFTSygxMywgMTApXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9OVU1fQlBTXFx0XFx0R0VOTUFTSygxOSwgMTQpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9OVU1fV1BTXFx0XFx0R0VOTUFTSygyNSwgMjApXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVcXHRcXHRCSVQoMjYpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVfTlVNX0NUUlNcXHRHRU5NQVNLKDMxLCAyNylcXG4rXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl80S0JcXHRCSVQoMClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzE2S0JcXHRCSVQoMSlcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzY0S0JcXHRCSVQoMilcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzI1NlxcdEJJVCgzKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfMzg0XFx0QklUKDQpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV81MTJcXHRCSVQoNSlcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX01BWF9SRUNTX09SREVSXFx0R0VOTUFTSyg5LCA2KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfTDBHUFRTWlxcdFxcdEdFTk1BU0soMTMsIDEwKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUFBTXFx0XFx0R0VOTUFTSygxNiwgMTQpXFxuK1xcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfREFcXHRcXHRCSVQoMClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0RBX0NPSFxcdFxcdEJJVCgxKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVlNNTVVcXHRcXHRCSVQoMilcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0FUU1xcdFxcdEJJVCgzKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfTUFYX1ZERVZTX09SREVSXFx0R0VOTUFTSyg3LCA0KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVkRFVl9LUk9VXFx0QklUKDgpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9OT05fVEVFX1NUUkVBTVxcdEJJVCg5KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfUDJQXFx0XFx0QklUKDEwKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQ01FTV9DWExcXHRcXHRCSVQoMTEpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9NQVhfQ01FTVxcdFxcdEdFTk1BU0soMTksIDEyKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQ01FTV9UU0VfUkVRXFx0QklUKDIwKVxcbitcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX01BWF9OVU1fQVVYX1BMQU5FU1xcdEdFTk1BU0soMywgMClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9QTEFORVxcdFxcdEdFTk1BU0soNSwgNClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9TMkFQX0lORElSRUNUXFx0QklUKDYpXFxuK1xcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzRfTUVDX0NPVU5UXFx0XFx0R0VOTUFTSyg2MywgMClcXG4rXFxuKyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUxcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9ERVZfTkNPSFxcdFxcdDFcXG4rI2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0RFVl9DT0hcXHRcXHQyXFxuK1xcbisjZGVmaW5lIFJNSV9UUkFDS0lOR19SRVNFUlZFRFxcdFxcdFxcdDBcXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfTk9ORVxcdFxcdFxcdDFcXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfRklORVxcdFxcdFxcdDJcXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfQ09BUlNFXFx0XFx0XFx0M1xcbitcXG4rI2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzRLQlxcdDBcXG4rI2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzE2S0JcXHQxXFxuKyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV82NEtCXFx0MlxcbitcXG4rLypcXG4rICogTm90ZSBtYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc21hbGxlciB0aGFuIHU2NCBidXQgYWxsIGZpZWxkcyBoYXZlIHU2NFxcbisgKiBhbGlnbm1lbnQsIHNvIHVzZSB1NjQgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50LlxcbisgKi9cXG4rc3RydWN0IHJtbV9jb25maWcge1xcbitcXHR1bmlvbiB7IC8qIDB4MCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1NjQgdHJhY2tpbmdfcmVnaW9uX3NpemU7XFxuK1xcdFxcdFxcdHU2NCBybWlfZ3JhbnVsZV9zaXplO1xcbitcXHRcXHR9O1xcbitcXHRcXHR1OCBzaXplcltTWl80S107XFxuK1xcdH07XFxuK307XFxuK1xcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3Qgcm1tX2NvbmZpZykgPT0gU1pfNEspO1xcbitcXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19MUEEyXFx0XFx0QklUKDApXFxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfU1ZFXFx0XFx0QklUKDEpXFxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfUE1VXFx0XFx0QklUKDIpXFxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfREFcXHRcXHRcXHRCSVQoMylcXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19MRkFfUE9MSUNZXFx0XFx0R0VOTUFTSyg2LCA1KVxcbisjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX01FQ19QT0xJQ1lcXHRcXHRHRU5NQVNLKDgsIDcpXFxuK1xcbisjZGVmaW5lIFJNSV9IQVNIX1NIQV8yNTZcXHRcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX0hBU0hfU0hBXzUxMlxcdFxcdFxcdDFcXG4rI2RlZmluZSBSTUlfSEFTSF9TSEFfMzg0XFx0XFx0XFx0MlxcbitcXG4rc3RydWN0IHJlYWxtX3BhcmFtcyB7XFxuK1xcdHVuaW9uIHsgLyogMHgwICovXFxuK1xcdFxcdHN0cnVjdCB7XFxuK1xcdFxcdFxcdHU2NCBmbGFnczA7XFxuK1xcdFxcdFxcdHU2NCBzMnN6O1xcbitcXHRcXHRcXHR1NjQgc3ZlX3ZsO1xcbitcXHRcXHRcXHR1NjQgbnVtX2JwcztcXG4rXFx0XFx0XFx0dTY0IG51bV93cHM7XFxuK1xcdFxcdFxcdHU2NCBwbXVfbnVtX2N0cnM7XFxuK1xcdFxcdFxcdHU2NCBoYXNoX2FsZ287XFxuK1xcdFxcdFxcdHU2NCBudW1fYXV4X3BsYW5lcztcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzBbMHg0MDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4NDAwICovXFxuK1xcdFxcdHN0cnVjdCB7XFxuK1xcdFxcdFxcdHU4IHJwdls2NF07XFxuK1xcdFxcdFxcdHU2NCBhdHNfcGxhbmU7XFxuK1xcdFxcdH07XFxuK1xcdFxcdHU4IHBhZGRpbmcxWzB4NDAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDgwMCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1NjQgcGFkZGluZztcXG4rXFx0XFx0XFx0dTY0IHJ0dF9iYXNlO1xcbitcXHRcXHRcXHRzNjQgcnR0X2xldmVsX3N0YXJ0O1xcbitcXHRcXHRcXHR1NjQgcnR0X251bV9zdGFydDtcXG4rXFx0XFx0XFx0dTY0IGZsYWdzMTtcXG4rXFx0XFx0XFx0dTY0IGF1eF9ydHRfYmFzZVszXTtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzJbMHg4MDBdO1xcbitcXHR9O1xcbit9O1xcbitcXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlYWxtX3BhcmFtcykgPT0gU1pfNEspO1xcbitcXG4rLypcXG4rICogVGhlIG51bWJlciBvZiBHUFJzIChzdGFydGluZyBmcm9tIFgwKSB0aGF0IGFyZVxcbisgKiBjb25maWd1cmVkIGJ5IHRoZSBob3N0IHdoZW4gYSBSRUMgaXMgY3JlYXRlZC5cXG4rICovXFxuKyNkZWZpbmUgUkVDX0NSRUFURV9OUl9HUFJTXFx0XFx0OFxcbitcXG4rI2RlZmluZSBSRUNfUEFSQU1TX0ZMQUdfUlVOTkFCTEVcXHRCSVRfVUxMKDApXFxuK1xcbitzdHJ1Y3QgcmVjX3BhcmFtcyB7XFxuK1xcdHVuaW9uIHsgLyogMHgwICovXFxuK1xcdFxcdHU2NCBmbGFncztcXG4rXFx0XFx0dTggcGFkZGluZzBbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MTAwICovXFxuK1xcdFxcdHU2NCBtcGlkcjtcXG4rXFx0XFx0dTggcGFkZGluZzFbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MjAwICovXFxuK1xcdFxcdHU2NCBwYztcXG4rXFx0XFx0dTggcGFkZGluZzJbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MzAwICovXFxuK1xcdFxcdHU2NCBncHJzW1JFQ19DUkVBVEVfTlJfR1BSU107XFxuK1xcdFxcdHU4IHBhZGRpbmczWzB4ZDAwXTtcXG4rXFx0fTtcXG4rfTtcXG4rXFxuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfcGFyYW1zKSA9PSBTWl80Syk7XFxuK1xcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0VNVUxBVEVEX01NSU9cXHRCSVQoMClcXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19JTkpFQ1RfU0VBXFx0QklUKDEpXFxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfVFJBUF9XRklcXHRcXHRCSVQoMilcXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGRVxcdFxcdEJJVCgzKVxcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1JJUEFTX1JFU1BPTlNFXFx0QklUKDQpXFxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfUzJBUF9SRVNQT05TRVxcdEJJVCg1KVxcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0RFVl9NRU1fUkVTUE9OU0VcXHRCSVQoNilcXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19GT1JDRV9QMFxcdFxcdEJJVCg3KVxcbitcXG4rI2RlZmluZSBSRUNfUlVOX0dQUlNcXHRcXHRcXHQzMVxcbisjZGVmaW5lIFJFQ19NQVhfR0lDX05VTV9MUlNcXHRcXHQxNlxcbitcXG4rI2RlZmluZSBSTUlfUEVSTUlUVEVEX0dJQ1YzX0hDUl9CSVRTXFx0KElDSF9IQ1JfRUwyX1VJRSB8XFx0XFx0XFxcXFxcbitcXHRcXHRcXHRcXHRcXHQgSUNIX0hDUl9FTDJfTFJFTlBJRSB8XFx0XFx0XFxcXFxcbitcXHRcXHRcXHRcXHRcXHQgSUNIX0hDUl9FTDJfTlBJRSB8XFx0XFx0XFxcXFxcbitcXHRcXHRcXHRcXHRcXHQgSUNIX0hDUl9FTDJfVkdycDBFSUUgfFxcdFxcdFxcXFxcXG4rXFx0XFx0XFx0XFx0XFx0IElDSF9IQ1JfRUwyX1ZHcnAwRElFIHxcXHRcXHRcXFxcXFxuK1xcdFxcdFxcdFxcdFxcdCBJQ0hfSENSX0VMMl9WR3JwMUVJRSB8XFx0XFx0XFxcXFxcbitcXHRcXHRcXHRcXHRcXHQgSUNIX0hDUl9FTDJfVkdycDFESUUgfFxcdFxcdFxcXFxcXG4rXFx0XFx0XFx0XFx0XFx0IElDSF9IQ1JfRUwyX1RESVIpXFxuK1xcbitzdHJ1Y3QgcmVjX2VudGVyIHtcXG4rXFx0dW5pb24geyAvKiAweDAwMCAqL1xcbitcXHRcXHR1NjQgZmxhZ3M7XFxuK1xcdFxcdHU4IHBhZGRpbmcwWzB4MjAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDIwMCAqL1xcbitcXHRcXHR1NjQgZ3Byc1tSRUNfUlVOX0dQUlNdO1xcbitcXHRcXHR1OCBwYWRkaW5nMVsweDEwMF07XFxuK1xcdH07XFxuK1xcdHU4IHBhZGRpbmczWzB4NTAwXTtcXG4rfTtcXG4rXFxuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfZW50ZXIpID09IFNaXzJLKTtcXG4rXFxuKyNkZWZpbmUgUk1JX0VYSVRfU1lOQ1xcdFxcdFxcdDB4MDBcXG4rI2RlZmluZSBSTUlfRVhJVF9JUlFcXHRcXHRcXHQweDAxXFxuKyNkZWZpbmUgUk1JX0VYSVRfRklRXFx0XFx0XFx0MHgwMlxcbisjZGVmaW5lIFJNSV9FWElUX1BTQ0lcXHRcXHRcXHQweDAzXFxuKyNkZWZpbmUgUk1JX0VYSVRfUklQQVNfQ0hBTkdFXFx0XFx0MHgwNFxcbisjZGVmaW5lIFJNSV9FWElUX0hPU1RfQ0FMTFxcdFxcdDB4MDVcXG4rI2RlZmluZSBSTUlfRVhJVF9TRVJST1JcXHRcXHRcXHQweDA2XFxuKyNkZWZpbmUgUk1JX0VYSVRfUzJBUF9DSEFOR0VcXHRcXHQweDA3XFxuKyNkZWZpbmUgUk1JX0VYSVRfVkRFVl9WQUxJREFURV9NQVBQSU5HXFx0MHgwOFxcbisjZGVmaW5lIFJNSV9FWElUX1ZTTU1VX0NPTU1BTkRcXHRcXHQweDBhXFxuKyNkZWZpbmUgUk1JX0VYSVRfVkRFVl9QMlBfQklORElOR1xcdDB4MGJcXG4rXFxuK3N0cnVjdCByZWNfZXhpdCB7XFxuK1xcdHVuaW9uIHsgLyogMHgwMDAgKi9cXG4rXFx0XFx0dTggZXhpdF9yZWFzb247XFxuK1xcdFxcdHU4IHBhZGRpbmcwWzB4MTAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDEwMCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1NjQgZXNyO1xcbitcXHRcXHRcXHR1NjQgZmFyO1xcbitcXHRcXHRcXHR1NjQgaHBmYXI7XFxuK1xcdFxcdFxcdHU2NCBydHRfdHJlZTtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzFbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MjAwICovXFxuK1xcdFxcdHU2NCBncHJzW1JFQ19SVU5fR1BSU107XFxuK1xcdFxcdHU4IHBhZGRpbmcyWzB4MTAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDMwMCAqL1xcbitcXHRcXHR1OCBwYWRkaW5nM1sweDEwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHg0MDAgKi9cXG4rXFx0XFx0c3RydWN0IHtcXG4rXFx0XFx0XFx0dTY0IGNudHBfY3RsO1xcbitcXHRcXHRcXHR1NjQgY250cF9jdmFsO1xcbitcXHRcXHRcXHR1NjQgY250dl9jdGw7XFxuK1xcdFxcdFxcdHU2NCBjbnR2X2N2YWw7XFxuK1xcdFxcdH07XFxuK1xcdFxcdHU4IHBhZGRpbmc0WzB4MTAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDUwMCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1NjQgcmlwYXNfYmFzZTtcXG4rXFx0XFx0XFx0dTY0IHJpcGFzX3RvcDtcXG4rXFx0XFx0XFx0dTggcmlwYXNfdmFsdWU7XFxuK1xcdFxcdFxcdHU4IHBhZGRpbmc4WzE1XTtcXG4rXFx0XFx0XFx0dTY0IHMyYXBfYmFzZTtcXG4rXFx0XFx0XFx0dTY0IHMyYXBfdG9wO1xcbitcXHRcXHRcXHR1NjQgdmRldl9pZF8xO1xcbitcXHRcXHRcXHR1NjQgdmRldl9pZF8yO1xcbitcXHRcXHRcXHR1NjQgZGV2X21lbV9iYXNlO1xcbitcXHRcXHRcXHR1NjQgZGV2X21lbV90b3A7XFxuK1xcdFxcdFxcdHU2NCBkZXZfbWVtX3BhO1xcbitcXHRcXHR9O1xcbitcXHRcXHR1OCBwYWRkaW5nNVsweDEwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHg2MDAgKi9cXG4rXFx0XFx0c3RydWN0IHtcXG4rXFx0XFx0XFx0dTE2IGltbTtcXG4rXFx0XFx0XFx0dTE2IHBhZGRpbmc5O1xcbitcXHRcXHRcXHR1NjQgcGxhbmU7XFxuK1xcdFxcdH07XFxuK1xcdFxcdHU4IHBhZGRpbmc2WzB4MTAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDcwMCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1OCBwbXVfb3ZmX3N0YXR1cztcXG4rXFx0XFx0XFx0dTggcGFkZGluZzEwWzE1XTtcXG4rXFx0XFx0XFx0dTY0IHZzbW11O1xcbitcXHRcXHR9O1xcbitcXHRcXHR1OCBwYWRkaW5nN1sweDEwMF07XFxuK1xcdH07XFxuK307XFxuK1xcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2V4aXQpID09IFNaXzJLKTtcXG4rXFxuK3N0cnVjdCByZWNfcnVuIHtcXG4rXFx0c3RydWN0IHJlY19lbnRlciBlbnRlcjtcXG4rXFx0c3RydWN0IHJlY19leGl0IGV4aXQ7XFxuK307XFxuK1xcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3J1bikgPT0gU1pfNEspO1xcbitcXG4rLyogUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTIGRlZmluaXRpb25zICovXFxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX09BRERSX1RZUEVcXHRHRU5NQVNLKDEsIDApXFxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX0xJU1RfQ09VTlRcXHRHRU5NQVNLKDE1LCAyKVxcbisjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19NRU1BVFRSXFx0R0VOTUFTSygxOCwgMTYpXFxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX1MyQVBcXHRcXHRHRU5NQVNLKDIyLCAxOSlcXG4rXFxuKy8qIFJNSV9SVFRfREFUQV9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi9cXG4rI2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX09BRERSX1RZUEVcXHRHRU5NQVNLKDEsIDApXFxuKyNkZWZpbmUgUk1JX1JUVF9QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UXFx0R0VOTUFTSygxNSwgMilcXG4rXFxuKy8qIFMyQVAgRGlyZWN0IEVuY29kaW5ncywgdXNlZCBpbiBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfUzJBUCAqL1xcbisjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9XUklURVxcdFxcdFxcdEJJVCgwKVxcbisjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9SRUFEXFx0XFx0XFx0QklUKDEpXFxuK1xcbisjZW5kaWYgLyogX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDIxOjI5OjU1LjQwODI4MjUwNVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTU4Mzk1Mjc4ODUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgaG9zdC1zaWRlIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIGxpYnJhcnkgZnVuY3Rpb25zIGFuZCBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gZm9yIEtWTSB0byB1c2UuIEhvd2V2ZXIsIEtWTSBzdXBwb3J0IGZvciBSZWFsbXMgaXMgbm90IGluY2x1ZGVkIGluIHRoaXMgcGF0Y2gsIG1ha2luZyB0aGUgZXhwb3J0ZWQgbGlicmFyeSBmdW5jdGlvbnMgdW5yZWFjaGFibGUgZnJvbSB1c2VyLXNwYWNlLiBGdXJ0aGVybW9yZSwgdGhlIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiByZXF1aXJlcyBzcGVjaWZpYyBoYXJkd2FyZS9maXJtd2FyZSAoUk1NKSBzdXBwb3J0IHRoYXQgaXMgbm90IHByZXNlbnQgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLCBhbmQgaXQgd2lsbCBzaW1wbHkgYmFpbCBvdXQgZWFybHkuIFRoZXJlIGFyZSBubyBzeXNjYWxscywgaW9jdGxzLCBvciBvdGhlciB1c2VyLXNwYWNlIGludGVyZmFjZXMgaW50cm9kdWNlZCB0aGF0IHN5emthbGxlciBjb3VsZCBmdXp6LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdFxuICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LFxuICAgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA5Y2EzNDc0NDVjNmNhY2M5YmEwYzgwODExNmZiY2Q4ZGMwNzkwMTE5XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFdlZCBKdWwgMTUgMjE6Mjk6NTIgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L0tjb25maWcgYi9hcmNoL2FybTY0L0tjb25maWdcbmluZGV4IGIzYWZlMDY4ODkxOWJkLi4wZjE5NTZlZGYxMzA3YiAxMDA2NDRcbi0tLSBhL2FyY2gvYXJtNjQvS2NvbmZpZ1xuKysrIGIvYXJjaC9hcm02NC9LY29uZmlnXG5AQCAtMzgsNiArMzgsNyBAQCBjb25maWcgQVJNNjRcbiBcdHNlbGVjdCBBUkNIX0hBU19NRU1CQVJSSUVSX1NZTkNfQ09SRVxuIFx0c2VsZWN0IEFSQ0hfSEFTX01FTV9FTkNSWVBUXG4gXHRzZWxlY3QgQVJDSF9TVVBQT1JUU19NU0VBTF9TWVNURU1fTUFQUElOR1NcbitcdHNlbGVjdCBBUkNIX1NVUFBPUlRTX1JNTVxuIFx0c2VsZWN0IEFSQ0hfSEFTX05NSV9TQUZFX1RISVNfQ1BVX09QU1xuIFx0c2VsZWN0IEFSQ0hfSEFTX05PTl9PVkVSTEFQUElOR19BRERSRVNTX1NQQUNFXG4gXHRzZWxlY3QgQVJDSF9IQVNfTk9OTEVBRl9QTURfWU9VTkcgaWYgQVJNNjRfSEFGVFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5mMTNlY2RiNDBkZWQ0MVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oXG5AQCAtMCwwICsxLDQ1OSBAQFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4rLypcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLlxuKyAqL1xuK1xuKyNpZm5kZWYgX19BU01fUk1JX0NNRFNfSFxuKyNkZWZpbmUgX19BU01fUk1JX0NNRFNfSFxuK1xuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2FybS1ybWktY21kcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYXJtLXNtY2NjLXJtaS5oXHUwMDNlXG4rXG4rLyoqXG4rICogcm1pX3J0dF9kYXRhX21hcF9pbml0KCkgLSBDcmVhdGUgYSBwcm90ZWN0ZWQgbWFwcGluZyB3aXRoIGRhdGEgY29udGVudHNcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBkYXRhOiBQQSBvZiB0aGUgdGFyZ2V0IGdyYW51bGVcbisgKiBAaXBhOiBJUEEgYXQgd2hpY2ggdGhlIGdyYW51bGUgd2lsbCBiZSBtYXBwZWQgaW4gdGhlIGd1ZXN0XG4rICogQHNyYzogUEEgb2YgdGhlIHNvdXJjZSBncmFudWxlXG4rICogQGZsYWdzOiBSTUlfTUVBU1VSRV9DT05URU5UIGlmIHRoZSBjb250ZW50cyBzaG91bGQgYmUgbWVhc3VyZWRcbisgKlxuKyAqIENyZWF0ZSBhIG1hcHBpbmcgZnJvbSBQcm90ZWN0ZWQgSVBBIHNwYWNlIHRvIGNvbnZlbnRpb25hbCBtZW1vcnksIGNvcHlpbmdcbisgKiBjb250ZW50cyBmcm9tIGEgTm9uLXNlY3VyZSBHcmFudWxlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIuXG4rICpcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGF0YV9tYXBfaW5pdCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGRhdGEsXG4rXHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgaXBhLCB1bnNpZ25lZCBsb25nIHNyYyxcbitcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBmbGFncylcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVQsIHJkLCBkYXRhLCBpcGEsIHNyYywgZmxhZ3NcbitcdH07XG4rXG4rXHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK31cbitcbisvKipcbisgKiBybWlfcnR0X2RhdGFfbWFwKCkgLSBDcmVhdGUgbWFwcGluZ3MgaW4gcHJvdGVjdGVkIElQQSB3aXRoIHVua25vd24gY29udGVudHNcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQGZsYWdzOiBGbGFnc1xuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbisgKiBAb3V0X3RvcDogVG9wIGFkZHJlc3Mgb2YgcmFuZ2Ugd2hpY2ggd2FzIHByb2Nlc3NlZC5cbisgKlxuKyAqIFJldHVybiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2RhdGFfbWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIHRvcCxcbitcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuK1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0RBVEFfTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcbitcdH07XG4rXHRpbnQgcmV0O1xuK1xuK1x0cmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKG91dF90b3ApXG4rXHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfZGF0YV91bm1hcCgpIC0gUmVtb3ZlIG1hcHBpbmdzIHRvIGNvbnZlbnRpb25hbCBtZW1vcnlcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCBSZWFsbVxuKyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQGZsYWdzOiBGbGFnc1xuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbisgKiBAb3V0X3RvcDogUmV0dXJucyB0b3AgSVBBIG9mIHJhbmdlIHdoaWNoIGhhcyBiZWVuIHVubWFwcGVkXG4rICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2VcbisgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XG4rICpcbisgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIGNvbnZlbnRpb24gbWVtb3J5IHdpdGggYSB0YXJnZXQgUHJvdGVjdGVkIElQQSByYW5nZS5cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9kYXRhX3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSxcbitcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgb2FkZHIsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3AsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9yYW5nZSxcbitcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyAqb3V0X2NvdW50KVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SVFRfREFUQV9VTk1BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4rXHR9O1xuK1x0aW50IHJldDtcbitcbitcdHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChvdXRfdG9wKVxuK1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4rXHRpZiAob3V0X3JhbmdlKVxuK1x0XHQqb3V0X3JhbmdlID0gcmVncy5hMjtcbitcdGlmIChvdXRfY291bnQpXG4rXHRcdCpvdXRfY291bnQgPSByZWdzLmEzO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3BzY2lfY29tcGxldGUoKSAtIENvbXBsZXRlIHBlbmRpbmcgUFNDSSBjb21tYW5kXG4rICogQGNhbGxpbmdfcmVjOiBQQSBvZiB0aGUgY2FsbGluZyBSRUNcbisgKiBAc3RhdHVzOiBTdGF0dXMgb2YgdGhlIFBTQ0kgcmVxdWVzdFxuKyAqXG4rICogQ29tcGxldGVzIGEgcGVuZGluZyBQU0NJIGNvbW1hbmQuXG4rICpcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9wc2NpX2NvbXBsZXRlKHVuc2lnbmVkIGxvbmcgY2FsbGluZ19yZWMsXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBzdGF0dXMpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xuK1xuK1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9QU0NJX0NPTVBMRVRFLCBjYWxsaW5nX3JlYywgc3RhdHVzLCBcdTAwMjZyZXMpO1xuK1xuK1x0cmV0dXJuIHJlcy5hMDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3JlYWxtX2FjdGl2YXRlKCkgLSBBY3RpdmUgYSByZWFsbVxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICpcbisgKiBNYXJrIGEgcmVhbG0gYXMgQWN0aXZlIHNpZ25hbGxpbmcgdGhhdCBjcmVhdGlvbiBpcyBjb21wbGV0ZSBhbmQgYWxsb3dpbmdcbisgKiBleGVjdXRpb24gb2YgdGhlIHJlYWxtLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfcmVhbG1fYWN0aXZhdGUodW5zaWduZWQgbG9uZyByZClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XG4rXG4rXHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1JFQUxNX0FDVElWQVRFLCByZCwgXHUwMDI2cmVzKTtcbitcbitcdHJldHVybiByZXMuYTA7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9yZWFsbV9jcmVhdGUoKSAtIENyZWF0ZSBhIHJlYWxtXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAcGFyYW1zOiBQQSBvZiByZWFsbSBwYXJhbWV0ZXJzXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbisgKlxuKyAqIENyZWF0ZSBhIG5ldyByZWFsbSB1c2luZyB0aGUgZ2l2ZW4gcGFyYW1ldGVycy5cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHBhcmFtcyxcbitcdFx0XHRcdCAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4re1xuK1x0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLFxuK1x0XHRcdFx0ICAgU01DX1JNSV9SRUFMTV9DUkVBVEUsIHJkLCBwYXJhbXMpO1xuK31cbitcbisvKipcbisgKiBybWlfcmVhbG1fdGVybWluYXRlKCkgLSBUZXJtaW5hdGUgYSByZWFsbVxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbisgKlxuKyAqIFRlcm1pbmF0ZXMgYSByZWFsbSwgbW92aW5nIGl0IGludG8gYSBaT01CSUUgc3RhdGVcbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX3Rlcm1pbmF0ZSh1bnNpZ25lZCBsb25nIHJkLFxuK1x0XHRcdFx0ICAgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbit7XG4rXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXG4rXHRcdFx0XHQgICBTTUNfUk1JX1JFQUxNX1RFUk1JTkFURSwgcmQpO1xuK31cbitcbisvKipcbisgKiBybWlfcmVhbG1fZGVzdHJveSgpIC0gRGVzdHJveSBhIHJlYWxtXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuKyAqXG4rICogRGVzdHJveXMgYSByZWFsbSwgYWxsIG9iamVjdHMgYmVsb25naW5nIHRvIHRoZSByZWFsbSBtdXN0IGJlIGRlc3Ryb3llZCBmaXJzdC5cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX2Rlc3Ryb3kodW5zaWduZWQgbG9uZyByZCxcbitcdFx0XHRcdCAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuK3tcbitcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdCAgIFNNQ19STUlfUkVBTE1fREVTVFJPWSwgcmQpO1xuK31cbitcbisvKipcbisgKiBybWlfcmVjX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgUkVDXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQ1xuKyAqIEBwYXJhbXM6IFBBIG9mIFJFQyBwYXJhbWV0ZXJzXG4rICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbisgKlxuKyAqIENyZWF0ZSBhIFJFQyB1c2luZyB0aGUgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdCByZWNfcGFyYW1zIHBvaW50ZWRcbisgKiB0byBieSBAcGFyYW1zLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfcmVjX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLFxuK1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgcmVjLFxuK1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgcGFyYW1zLFxuK1x0XHRcdFx0IHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4re1xuK1x0aW50IHJldDtcbitcbitcdCpzcm8gPSAoc3RydWN0IHJtaV9zcm9fc3RhdGUpey5yZWdzID0ge1xuK1x0XHRTTUNfUk1JX1JFQ19DUkVBVEUsIHJkLCByZWMsIHBhcmFtc1xuK1x0fX07XG4rXHRyZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzcm8sIEdGUF9LRVJORUwpO1xuK1x0cm1pX3Nyb19mcmVlKHNybyk7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfcmVjX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSBSRUNcbisgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQ1xuKyAqIEBzcm86IEFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXG4rICpcbisgKiBEZXN0cm95cyBhIFJFQy4gVGhlIFJFQyBtdXN0IG5vdCBiZSBydW5uaW5nLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfcmVjX2Rlc3Ryb3kodW5zaWduZWQgbG9uZyByZWMsXG4rXHRcdFx0XHQgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4re1xuK1x0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JFQ19ERVNUUk9ZLCByZWMpO1xuK31cbitcbisvKipcbisgKiBybWlfcmVjX2VudGVyKCkgLSBFbnRlciBhIFJFQ1xuKyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXG4rICogQHJ1bl9wdHI6IFBBIG9mIFJlY1J1biBzdHJ1Y3R1cmVcbisgKlxuKyAqIFN0YXJ0cyAob3IgY29udGludWVzKSBleGVjdXRpb24gd2l0aGluIGEgUkVDLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfcmVjX2VudGVyKHVuc2lnbmVkIGxvbmcgcmVjLCB1bnNpZ25lZCBsb25nIHJ1bl9wdHIpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xuK1xuK1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9SRUNfRU5URVIsIHJlYywgcnVuX3B0ciwgXHUwMDI2cmVzKTtcbitcbitcdHJldHVybiByZXMuYTA7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfY3JlYXRlKCkgLSBDcmVhdGVzIGFuIFJUVFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQHJ0dDogUEEgb2YgdGhlIHRhcmdldCBSVFRcbisgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcbisgKiBAbGV2ZWw6IERlcHRoIG9mIHRoZSBSVFQgd2l0aGluIHRoZSB0cmVlXG4rICpcbisgKiBDcmVhdGVzIGFuIFJUVCAoUmVhbG0gVHJhbnNsYXRpb24gVGFibGUpIGF0IHRoZSBzcGVjaWZpZWQgbGV2ZWwgZm9yIHRoZVxuKyAqIHRyYW5zbGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyB3aXRoaW4gdGhlIHJlYWxtLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJ0dCxcbitcdFx0XHRcdCB1bnNpZ25lZCBsb25nIGlwYSwgbG9uZyBsZXZlbClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0NSRUFURSwgcmQsIHJ0dCwgaXBhLCBsZXZlbFxuK1x0fTtcbitcbitcdHJldHVybiBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfZGVzdHJveSgpIC0gRGVzdHJveSBhbiBSVFRcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCByZWFsbVxuKyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVFxuKyAqIEBsZXZlbDogUlRUIGxldmVsXG4rICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZFxuKyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRoZSB0b3AgSVBBIG9mIG5vbi1saXZlIFJUVCBlbnRyaWVzLCBmcm9tIGVudHJ5XG4rICogYXQgd2hpY2ggdGhlIFJUVCB3YWxrIHRlcm1pbmF0ZWQuXG4rICpcbisgKiBEZXN0cm95cyBhbiBSVFQuIFRoZSBSVFQgbXVzdCBiZSBub24tbGl2ZSwgaS5lLiBub25lIG9mIHRoZSBlbnRyaWVzIGluIHRoZVxuKyAqIHRhYmxlIGFyZSBpbiBBU1NJR05FRCBvciBUQUJMRSBzdGF0ZS5cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlLlxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLFxuK1x0XHRcdFx0ICB1bnNpZ25lZCBsb25nIGlwYSxcbitcdFx0XHRcdCAgbG9uZyBsZXZlbCxcbitcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyAqb3V0X3J0dCxcbitcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0RFU1RST1ksIHJkLCBpcGEsIGxldmVsXG4rXHR9O1xuK1x0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChvdXRfcnR0KVxuK1x0XHQqb3V0X3J0dCA9IHJlZ3MuYTE7XG4rXHRpZiAob3V0X3RvcClcbitcdFx0Km91dF90b3AgPSByZWdzLmEyO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3J0dF9mb2xkKCkgLSBGb2xkIGFuIFJUVFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUXG4rICogQGxldmVsOiBEZXB0aCBvZiB0aGUgUlRUIHdpdGhpbiB0aGUgdHJlZVxuKyAqIEBvdXRfcnR0OiBQb2ludGVyIHRvIHdyaXRlIHRoZSBQQSBvZiB0aGUgUlRUIHdoaWNoIHdhcyBkZXN0cm95ZWRcbisgKlxuKyAqIEZvbGRzIGFuIFJUVC4gSWYgYWxsIGVudHJpZXMgd2l0aCB0aGUgUlRUIGFyZSAnaG9tb2dlbmVvdXMnIHRoZSBSVFQgY2FuIGJlXG4rICogZm9sZGVkIGludG8gdGhlIHBhcmVudCBhbmQgdGhlIFJUVCBkZXN0cm95ZWQuXG4rICpcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZm9sZCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGlwYSxcbitcdFx0XHQgICAgICAgbG9uZyBsZXZlbCwgdW5zaWduZWQgbG9uZyAqb3V0X3J0dClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0ZPTEQsIHJkLCBpcGEsIGxldmVsXG4rXHR9O1xuK1x0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChvdXRfcnR0KVxuK1x0XHQqb3V0X3J0dCA9IHJlZ3MuYTE7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfcnR0X2luaXRfcmlwYXMoKSAtIFNldCBSSVBBUyBmb3IgbmV3IHJlYWxtXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAYmFzZTogQmFzZSBvZiB0YXJnZXQgSVBBIHJlZ2lvblxuKyAqIEB0b3A6IFRvcCBvZiB0YXJnZXQgSVBBIHJlZ2lvblxuKyAqIEBvdXRfdG9wOiBUb3AgSVBBIG9mIHJhbmdlIHdob3NlIFJJUEFTIHdhcyBtb2RpZmllZFxuKyAqXG4rICogU2V0cyB0aGUgUklQQVMgb2YgYSB0YXJnZXQgSVBBIHJhbmdlIHRvIFJBTSwgZm9yIGEgcmVhbG0gaW4gdGhlIE5FVyBzdGF0ZS5cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9pbml0X3JpcGFzKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgYmFzZSxcbitcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyB0b3AsIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX1JUVF9JTklUX1JJUEFTLCByZCwgYmFzZSwgdG9wXG4rXHR9O1xuK1x0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChvdXRfdG9wKVxuK1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfcnR0X3VucHJvdF9tYXAoKSAtIE1hcCB1bnByb3RlY3RlZCBncmFudWxlcyBpbnRvIGEgcmVhbG1cbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBiYXNlOiBCYXNlIElQQSBvZiB0aGUgbWFwcGluZ1xuKyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuKyAqIEBmbGFnczogRmxhZ3NcbisgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXG4rICogQG91dF90b3A6IFRvcCBJUEEgb2YgcmFuZ2Ugd2hpY2ggaGFzIGJlZW4gbWFwcGVkXG4rICpcbisgKiBDcmVhdGUgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuXG4rICpcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfdW5wcm90X21hcCh1bnNpZ25lZCBsb25nIHJkLFxuK1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuK1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLFxuK1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuK1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SVFRfVU5QUk9UX01BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4rXHR9O1xuK1x0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChvdXRfdG9wKVxuK1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfcnR0X3NldF9yaXBhcygpIC0gU2V0IFJJUEFTIGZvciBhbiBydW5uaW5nIHJlYWxtXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAcmVjOiBQQSBvZiB0aGUgUkVDIG1ha2luZyB0aGUgcmVxdWVzdFxuKyAqIEBiYXNlOiBCYXNlIG9mIHRhcmdldCBJUEEgcmVnaW9uXG4rICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uXG4rICogQG91dF90b3A6IFBvaW50ZXIgdG8gd3JpdGUgdG9wIElQQSBvZiByYW5nZSB3aG9zZSBSSVBBUyB3YXMgbW9kaWZpZWRcbisgKlxuKyAqIENvbXBsZXRlcyBhIHJlcXVlc3QgbWFkZSBieSB0aGUgcmVhbG0gdG8gY2hhbmdlIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEFcbisgKiByYW5nZS5cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9zZXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyByZWMsXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHRvcCxcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SVFRfU0VUX1JJUEFTLCByZCwgcmVjLCBiYXNlLCB0b3BcbitcdH07XG4rXHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKG91dF90b3ApXG4rXHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfdW5wcm90X3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3Mgd2l0aGluIGFuIHVucHJvdGVjdGVkIElQQSByYW5nZVxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQGJhc2U6IEJhc2UgSVBBIG9mIHRoZSBtYXBwaW5nXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQGZsYWdzOiBGbGFnc1xuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbisgKiBAb3V0X3RvcDogVG9wIElQQSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxuKyAqIEBvdXRfcmFuZ2U6IE91dHB1dCBhZGRyZXNzIHJhbmdlXG4rICogQG91dF9jb3VudDogTnVtYmVyIG9mIGVudHJpZXMgaW4gb3V0cHV0IGFkZHJlc3MgbGlzdFxuKyAqXG4rICogUmVtb3ZlcyBtYXBwaW5ncyB0byBtZW1vcnkgd2l0aGluIGEgdGFyZ2V0IHVucHJvdGVjdGVkIElQQSByYW5nZS5cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF91bnByb3RfdW5tYXAodW5zaWduZWQgbG9uZyByZCxcbitcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4rXHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcbitcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuK1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3AsXG4rXHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3JhbmdlLFxuK1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9jb3VudClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX1VOUFJPVF9VTk1BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4rXHR9O1xuK1x0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChvdXRfdG9wKVxuK1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4rXHRpZiAob3V0X3JhbmdlKVxuK1x0XHQqb3V0X3JhbmdlID0gcmVncy5hMjtcbitcdGlmIChvdXRfY291bnQpXG4rXHRcdCpvdXRfY291bnQgPSByZWdzLmEzO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rI2VuZGlmIC8qIF9fQVNNX1JNSV9DTURTX0ggKi9cbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNcbmluZGV4IDlhMjJkZjBjNTEyMGYzLi40YWU2M2M4OWNkYTk3ZCAxMDA2NDRcbi0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY1xuKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jXG5AQCAtMjkzLDYgKzI5Myw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRpc2FyM1tdID0ge1xuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRwZnIwW10gPSB7XG4gXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0NTVjNfU0hJRlQsIDQsIDApLFxuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9DU1YyX1NISUZULCA0LCAwKSxcbitcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfUk1FX1NISUZULCA0LCAwKSxcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9WSVNJQkxFLCBGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0RJVF9TSElGVCwgNCwgMCksXG4gXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0FNVV9TSElGVCwgNCwgMCksXG4gXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX01QQU1fU0hJRlQsIDQsIDApLFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ1xuaW5kZXggMTJkYzcwMjU0ODQyY2UuLjU1NTQyODc5ZmJiOGFiIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWdcbkBAIC0zMDEsNSArMzAxLDYgQEAgc291cmNlIFwiZHJpdmVycy9maXJtd2FyZS9zYW1zdW5nL0tjb25maWdcIlxuIHNvdXJjZSBcImRyaXZlcnMvZmlybXdhcmUvc21jY2MvS2NvbmZpZ1wiXG4gc291cmNlIFwiZHJpdmVycy9maXJtd2FyZS90ZWdyYS9LY29uZmlnXCJcbiBzb3VyY2UgXCJkcml2ZXJzL2Zpcm13YXJlL3hpbGlueC9LY29uZmlnXCJcbitzb3VyY2UgXCJkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1wiXG4gXG4gZW5kbWVudVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXG5pbmRleCA0ZGRlYzI4MjBjOTZmYS4uMDdlOGNhMTc4OWI0OWUgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXG5AQCAtMzgsMyArMzgsNCBAQCBvYmoteVx0XHRcdFx0Kz0gc2Ftc3VuZy9cbiBvYmoteVx0XHRcdFx0Kz0gc21jY2MvXG4gb2JqLXlcdFx0XHRcdCs9IHRlZ3JhL1xuIG9iai15XHRcdFx0XHQrPSB4aWxpbngvXG4rb2JqLXlcdFx0XHRcdCs9IGFybV9ybW0vXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWcgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5kMjI0YTcyY2NhOTA4OVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWdcbkBAIC0wLDAgKzEsMjIgQEBcbitcbitjb25maWcgQVJDSF9TVVBQT1JUU19STU1cbitcdGJvb2xcbitcbitjb25maWcgQVJNX1JNTVxuK1x0Ym9vbCBcIlJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvciAoUk1NKSBTdXBwb3J0XCJcbitcdGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19STU1cbitcdGRlZmF1bHQgeVxuK1x0aGVscFxuK1x0ICBTdXBwb3J0IHRoZSBSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3IgKFJNTSkgb24gQXJtIHN5c3RlbXMgdGhhdFxuK1x0ICBpbXBsZW1lbnQgdGhlIFJlYWxtIE1hbmFnZW1lbnQgRXh0ZW5zaW9uIChSTUUpLCBhcyBkZWZpbmVkIGJ5IHRoZVxuK1x0ICBBcm0gQ29uZmlkZW50aWFsIENvbXB1dGUgQXJjaGl0ZWN0dXJlLlxuK1xuK1x0ICBUaGUgUk1NIHJ1bnMgaW4gdGhlIFJlYWxtIHdvcmxkIGFuZCBwcm92aWRlcyB0aGUgUmVhbG0gTWFuYWdlbWVudFxuK1x0ICBJbnRlcmZhY2UgKFJNSSkgdXNlZCBieSBhIE5vcm1hbCBXb3JsZCBob3N0IHRvIGNyZWF0ZSwgbWFuYWdlIGFuZCBydW5cbitcdCAgcHJvdGVjdGVkIHZpcnR1YWwgbWFjaGluZXMgY2FsbGVkIFJlYWxtcy4gVGhpcyBvcHRpb24gYnVpbGRzIHRoZVxuK1x0ICBob3N0LXNpZGUgUk1JIHN1cHBvcnQgdXNlZCBieSBLVk0gdG8gZGV0ZWN0IGEgY29tcGF0aWJsZSBSTU0sXG4rXHQgIGNvbmZpZ3VyZSBpdCwgbWFuYWdlIGRlbGVnYXRlZCBtZW1vcnkgYW5kIGVuYWJsZSBSZWFsbSBndWVzdHMuXG4rXG4rXHQgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiBkb2VzIG5vdCBieSBpdHNlbGYgbWFrZSBSZWFsbSBndWVzdHMgYXZhaWxhYmxlOlxuK1x0ICB0aGUgc3lzdGVtIG11c3QgYWxzbyBwcm92aWRlIFJNRS1jYXBhYmxlIGhhcmR3YXJlIGFuZCBmaXJtd2FyZSB3aXRoIGFcbitcdCAgY29tcGF0aWJsZSBSTU0gaW1wbGVtZW50YXRpb24uXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjUxYWVmNWNjMDRiMDJjXG4tLS0gL2Rldi9udWxsXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcbkBAIC0wLDAgKzEsMiBAQFxuK1xuK29iai0kKENPTkZJR19BUk1fUk1NKVx0PSBybWkub1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5kMGMwODNiZGYyNTFmNFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jXG5AQCAtMCwwICsxLDcyNCBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLlxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NwdWZlYXR1cmUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbWJsb2NrLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9hcm0tcm1pLWNtZHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3Byb2Nlc3Nvci5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXHUwMDNjYXNtL21lbW9yeS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYXNtL3BndGFibGUtaHdkZWYuaFx1MDAzZVxuK1xuK3N0YXRpYyBib29sIGFybTY0X3JtaV9pc19hdmFpbGFibGU7XG4rXG4rLyogQ3VycmVudGx5IG9ubHkgdGhlIGZpcnN0IDIgcmVnaXN0ZXJzIGFyZSB1c2VkIGJ5IExpbnV4ICovXG4rI2RlZmluZSBSTUlfRkVBVF9SRUdfQ09VTlRcdDJcbitzdGF0aWMgX19yb19hZnRlcl9pbml0IHVuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnX2NhY2hlW1JNSV9GRUFUX1JFR19DT1VOVF07XG4rXG4rdW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWcodW5zaWduZWQgbG9uZyBpZClcbit7XG4rXHRpZiAoV0FSTl9PTihpZCBcdTAwM2U9IFJNSV9GRUFUX1JFR19DT1VOVCkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuIHJtaV9mZWF0X3JlZ19jYWNoZVtpZF07XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9mZWF0X3JlZyk7XG4rXG4raW50IHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLFxuK1x0XHQgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLFxuK1x0XHQgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgcmV0ID0gMDtcbitcdHVuc2lnbmVkIGxvbmcgdG9wID0gcGh5cyArIHNpemU7XG4rXHR1bnNpZ25lZCBsb25nIG91dF90b3A7XG4rXG4rXHR3aGlsZSAocGh5cyBcdTAwM2MgdG9wKSB7XG4rXHRcdHJldCA9IHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKHBoeXMsIHRvcCwgXHUwMDI2b3V0X3RvcCk7XG4rXHRcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpXG4rXHRcdFx0cGh5cyA9IG91dF90b3A7XG4rXHRcdGVsc2UgaWYgKHJldCA9PSBSTUlfQlVTWSB8fCByZXQgPT0gUk1JX0JMT0NLRUQpXG4rXHRcdFx0Y3B1X3JlbGF4KCk7XG4rXHRcdGVsc2VcbitcdFx0XHRicmVhaztcbitcdH1cbitcbitcdGlmIChvdXRfcGh5cylcbitcdFx0Km91dF9waHlzID0gcGh5cztcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9kZWxlZ2F0ZV9yYW5nZSk7XG4rXG4raW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsXG4rXHRcdFx0IHVuc2lnbmVkIGxvbmcgc2l6ZSlcbit7XG4rXHR1bnNpZ25lZCBsb25nIHJldCA9IDA7XG4rXHR1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgKyBzaXplO1xuK1x0dW5zaWduZWQgbG9uZyBvdXRfdG9wO1xuK1xuK1x0d2hpbGUgKHBoeXMgXHUwMDNjIHRvcCkge1xuK1x0XHRyZXQgPSBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHBoeXMsIHRvcCwgXHUwMDI2b3V0X3RvcCk7XG4rXHRcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpXG4rXHRcdFx0cGh5cyA9IG91dF90b3A7XG4rXHRcdGVsc2UgaWYgKHJldCA9PSBSTUlfQlVTWSB8fCByZXQgPT0gUk1JX0JMT0NLRUQpXG4rXHRcdFx0Y3B1X3JlbGF4KCk7XG4rXHRcdGVsc2VcbitcdFx0XHRicmVhaztcbitcdH1cbitcbitcdHJldHVybiByZXQ7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV91bmRlbGVnYXRlX3JhbmdlKTtcbitcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBkb25hdGVfcmVxX3RvX3NpemUodW5zaWduZWQgbG9uZyBkb25hdGVyZXEpXG4re1xuK1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTtcbitcbitcdHJldHVybiBCSVQoQVJNNjRfSFdfUEdUQUJMRV9MRVZFTF9TSElGVCgzIC0gdW5pdF9zaXplKSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJtaV9zbWNjY19pbnZva2Uoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVnc19pbixcbitcdFx0XHQgICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3Nfb3V0KVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9ICpyZWdzX2luO1xuK1x0dW5zaWduZWQgbG9uZyBzdGF0dXM7XG4rXG4rXHR3aGlsZSAoMSkge1xuK1x0XHRhcm1fc21jY2NfMV8yX2ludm9rZShcdTAwMjZyZWdzLCByZWdzX291dCk7XG4rXHRcdHN0YXR1cyA9IFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3Nfb3V0LVx1MDAzZWEwKTtcbitcdFx0aWYgKHN0YXR1cyAhPSBSTUlfQlVTWSBcdTAwMjZcdTAwMjYgc3RhdHVzICE9IFJNSV9CTE9DS0VEKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHRjcHVfcmVsYXgoKTtcbitcdH1cbit9XG4rXG4rc3RhdGljIHZvaWQgcm1pX29wX2NvbnRpbnVlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBmbGFncyxcbitcdFx0XHQgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX09QX0NPTlRJTlVFLCBzcm9faGFuZGxlLCBmbGFnc1xuK1x0fTtcbitcbitcdHJtaV9zbWNjY19pbnZva2UoXHUwMDI2cmVncywgb3V0X3JlZ3MpO1xuK31cbitcbitzdGF0aWMgdm9pZCBybWlfb3BfY2FuY2VsKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbitcdFx0XHQgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9PUF9DQU5DRUwsIHNyb19oYW5kbGVcbitcdH07XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgcm1pX29wX21lbV9kb25hdGUodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLCB1bnNpZ25lZCBsb25nIGxpc3RfYWRkcixcbitcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGxpc3RfY291bnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0ICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX09QX01FTV9ET05BVEUsIHNyb19oYW5kbGUsIGxpc3RfYWRkciwgbGlzdF9jb3VudCwgZmxhZ3NcbitcdH07XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgcm1pX29wX21lbV9yZWNsYWltKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbitcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsXG4rXHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9jb3VudCxcbitcdFx0XHQgICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnRcbitcdH07XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbit9XG4rXG4raW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbit7XG4rXHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5cykpKSB7XG4rXHRcdC8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovXG4rXHRcdHJldHVybiAtRUJVU1k7XG4rXHR9XG4rXG4rXHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHBoeXMpKTtcbitcbitcdHJldHVybiAwO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChmcmVlX2RlbGVnYXRlZF9wYWdlKTtcbitcbitzdGF0aWMgaW50IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGNvdW50KVxuK3tcbitcdGlmIChXQVJOX09OX09OQ0Uoc3JvLVx1MDAzZWFkZHJfY291bnQgXHUwMDNlIFJNSV9NQVhfQUREUl9MSVNUKSlcbitcdFx0cmV0dXJuIC1FT1ZFUkZMT1c7XG4rXG4rXHRpZiAoY291bnQgXHUwMDNlIFJNSV9NQVhfQUREUl9MSVNUIC0gc3JvLVx1MDAzZWFkZHJfY291bnQpXG4rXHRcdHJldHVybiAtRU5PU1BDO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4rXHRcdFx0XHQgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxuK1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuK1x0XHRcdFx0IHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLFxuK1x0XHRcdFx0IGdmcF90IGdmcClcbit7XG4rXHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9ET05BVEVfU0laRShkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemVfYnl0ZXMgPSBkb25hdGVfcmVxX3RvX3NpemUoZG9uYXRlcmVxKTtcbitcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XG4rXHR1bnNpZ25lZCBsb25nIHN0YXRlID0gUk1JX0RPTkFURV9TVEFURShkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyBzaXplID0gdW5pdF9zaXplX2J5dGVzICogY291bnQ7XG4rXHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XG4rXHRpbnQgcmV0O1xuK1x0dm9pZCAqdmlydDtcbitcdHBoeXNfYWRkcl90IHBoeXM7XG4rXG4rXHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2Mgc3JvLVx1MDAzZWFkZHJfY291bnQ7IGkrKykge1xuK1x0XHR1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLVx1MDAzZWFkZHJfbGlzdFtpXTtcbitcbitcdFx0aWYgKFJNSV9BRERSX1JBTkdFX1NJWkUoZW50cnkpID09IHVuaXRfc2l6ZSBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KSA9PSBjb3VudCBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIElTX0FMSUdORUQoUk1JX0FERFJfUkFOR0VfQUREUihlbnRyeSksIHNpemUpKSB7XG4rXHRcdFx0c3JvLVx1MDAzZWFkZHJfY291bnQtLTtcbitcdFx0XHRzd2FwKHNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdLFxuK1x0XHRcdCAgICAgc3JvLVx1MDAzZWFkZHJfbGlzdFtpXSk7XG4rXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcdH1cbitcbitcdHJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgMSk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0dmlydCA9IGFsbG9jX3BhZ2VzX2V4YWN0KHNpemUsIGdmcCk7XG4rXHRpZiAoIXZpcnQpXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1x0cGh5cyA9IHZpcnRfdG9fcGh5cyh2aXJ0KTtcbitcbitcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCkge1xuK1x0XHRwaHlzX2FkZHJfdCBkZWxlZ2F0ZWRfcGh5cztcbitcbitcdFx0aWYgKHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCBzaXplLCBcdTAwMjZkZWxlZ2F0ZWRfcGh5cykpIHtcbitcdFx0XHRpZiAoIXJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIGRlbGVnYXRlZF9waHlzIC0gcGh5cykpXG4rXHRcdFx0XHRmcmVlX3BhZ2VzX2V4YWN0KHZpcnQsIHNpemUpO1xuK1x0XHRcdHJldHVybiAtRU5YSU87XG4rXHRcdH1cbitcdH1cbitcbitcdGFkZHJfcmFuZ2UgPSBwaHlzIFx1MDAyNiBSTUlfQUREUl9SQU5HRV9BRERSX01BU0s7XG4rXHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCB1bml0X3NpemUpO1xuK1x0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIGNvdW50KTtcbitcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCBzdGF0ZSk7XG4rXG4rXHRzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSA9IGFkZHJfcmFuZ2U7XG4rXG4rb3V0OlxuK1x0cm1pX29wX21lbV9kb25hdGUoc3JvX2hhbmRsZSxcbitcdFx0XHQgIHZpcnRfdG9fcGh5cyhcdTAwMjZzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSksIDEsXG4rXHRcdFx0ICAwLCBvdXRfcmVncyk7XG4rXG4rXHR1bnNpZ25lZCBsb25nIGRvbmF0ZWRfZ3JhbnVsZXMgPSBvdXRfcmVncy1cdTAwM2VhMTtcbitcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplID0gZG9uYXRlZF9ncmFudWxlcyBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbitcbitcdGlmIChkb25hdGVkX2dyYW51bGVzID09IDApIHtcbitcdFx0LyogTm8gcGFnZXMgdXNlZCBieSB0aGUgUk1NICovXG4rXHRcdHNyby1cdTAwM2VhZGRyX2NvdW50Kys7XG4rXHR9IGVsc2UgaWYgKGRvbmF0ZWRfc2l6ZSBcdTAwM2Mgc2l6ZSkge1xuK1x0XHRwaHlzID0gc3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudF0gXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcbitcbitcdFx0LyogTm90IGFsbCBncmFudWxlcyB1c2VkIGJ5IHRoZSBSTU0sIGZyZWUgdGhlIHJlbWFpbmluZyBwYWdlcyAqL1xuK1x0XHRmb3IgKGxvbmcgaSA9IGRvbmF0ZWRfc2l6ZTsgaSBcdTAwM2Mgc2l6ZTsgaSArPSBQQUdFX1NJWkUpIHtcbitcdFx0XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpXG4rXHRcdFx0XHRmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXMgKyBpKTtcbitcdFx0XHRlbHNlXG4rXHRcdFx0XHRfX2ZyZWVfcGFnZShwaHlzX3RvX3BhZ2UocGh5cyArIGkpKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfbm9uY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuK1x0XHRcdFx0ICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLFxuK1x0XHRcdFx0ICAgIGdmcF90IGdmcClcbit7XG4rXHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9ET05BVEVfU0laRShkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemVfYnl0ZXMgPSBkb25hdGVfcmVxX3RvX3NpemUoZG9uYXRlcmVxKTtcbitcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XG4rXHR1bnNpZ25lZCBsb25nIHN0YXRlID0gUk1JX0RPTkFURV9TVEFURShkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyBmb3VuZCA9IDA7XG4rXHR1bnNpZ25lZCBsb25nIGFkZHJfbGlzdF9zdGFydCA9IHNyby1cdTAwM2VhZGRyX2NvdW50O1xuK1x0aW50IHJldDtcbitcbitcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBhZGRyX2xpc3Rfc3RhcnQgXHUwMDI2XHUwMDI2IGZvdW5kIFx1MDAzYyBjb3VudDsgaSsrKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXHUwMDNlYWRkcl9saXN0W2ldO1xuK1xuK1x0XHRpZiAoUk1JX0FERFJfUkFOR0VfU0laRShlbnRyeSkgPT0gdW5pdF9zaXplIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IDEgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBSTUlfQUREUl9SQU5HRV9TVEFURShlbnRyeSkgPT0gc3RhdGUpIHtcbitcdFx0XHRhZGRyX2xpc3Rfc3RhcnQtLTtcbitcdFx0XHRzd2FwKHNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSxcbitcdFx0XHQgICAgIHNyby1cdTAwM2VhZGRyX2xpc3RbaV0pO1xuK1x0XHRcdGZvdW5kKys7XG4rXHRcdFx0aS0tO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIGNvdW50IC0gZm91bmQpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHdoaWxlIChmb3VuZCBcdTAwM2MgY291bnQpIHtcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyX3JhbmdlO1xuK1x0XHR2b2lkICp2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3QodW5pdF9zaXplX2J5dGVzLCBnZnApO1xuK1x0XHRwaHlzX2FkZHJfdCBwaHlzO1xuK1xuK1x0XHRpZiAoIXZpcnQpXG4rXHRcdFx0cmV0dXJuIC1FTk9NRU07XG4rXG4rXHRcdHBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7XG4rXG4rXHRcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCkge1xuK1x0XHRcdHBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzO1xuK1xuK1x0XHRcdGlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgdW5pdF9zaXplX2J5dGVzLFxuK1x0XHRcdFx0XHQgICAgICAgXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XG4rXHRcdFx0XHRpZiAoIXJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIGRlbGVnYXRlZF9waHlzIC0gcGh5cykpXG4rXHRcdFx0XHRcdGZyZWVfcGFnZXNfZXhhY3QodmlydCwgdW5pdF9zaXplX2J5dGVzKTtcbitcdFx0XHRcdHJldHVybiAtRU5YSU87XG4rXHRcdFx0fVxuK1x0XHR9XG4rXG4rXHRcdGFkZHJfcmFuZ2UgPSBwaHlzIFx1MDAyNiBSTUlfQUREUl9SQU5HRV9BRERSX01BU0s7XG4rXHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TSVpFX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIHVuaXRfc2l6ZSk7XG4rXHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCAxKTtcbitcdFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIHN0YXRlKTtcbitcbitcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudCsrXSA9IGFkZHJfcmFuZ2U7XG4rXHRcdGZvdW5kKys7XG4rXHR9XG4rXG4rXHRybWlfb3BfbWVtX2RvbmF0ZShzcm9faGFuZGxlLFxuK1x0XHRcdCAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSksXG4rXHRcdFx0ICBmb3VuZCwgMCwgb3V0X3JlZ3MpO1xuK1xuK1x0dW5zaWduZWQgbG9uZyBkb25hdGVkX2dyYW51bGVzID0gb3V0X3JlZ3MtXHUwMDNlYTE7XG4rXHR1bnNpZ25lZCBsb25nIGdyYW51bGVzX3Blcl91bml0ID0gdW5pdF9zaXplX2J5dGVzIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuK1x0dW5zaWduZWQgbG9uZyBjb25zdW1lZF91bml0cztcbitcbitcdC8qXG4rXHQgKiBUaGUgUk1NIHNob3VsZG4ndCByZXBvcnQgbW9yZSBncmFudWxlcyB0aGFuIHdlIHByb3ZpZGVkLCBidXQgY2xhbXBcbitcdCAqIGp1c3QgaW4gY2FzZS5cbitcdCAqL1xuK1x0aWYgKFdBUk5fT05fT05DRShkb25hdGVkX2dyYW51bGVzIFx1MDAzZSBmb3VuZCAqIGdyYW51bGVzX3Blcl91bml0KSlcbitcdFx0ZG9uYXRlZF9ncmFudWxlcyA9IGZvdW5kICogZ3JhbnVsZXNfcGVyX3VuaXQ7XG4rXG4rXHQvKlxuK1x0ICogVGhlIFJNTSByZXBvcnRzIHRoZSBjb25zdW1lZCBtZW1vcnkgaW4gdGVybXMgb2YgZ3JhbnVsZXMsIGJ1dCB3ZVxuK1x0ICogdHJhY2sgaW4gdGhlIGFkZHJlc3MgbGlzdHMgaW4gdW5pdC1zaXplZCByYW5nZXMuIFNvIGRpdmlkZSB0byBnZXRcbitcdCAqIHRoZSBudW1iZXIgb2YgKGNvbXBsZXRlKSBjb25zdW1lZCB1bml0cy5cbitcdCAqL1xuK1x0Y29uc3VtZWRfdW5pdHMgPSBkb25hdGVkX2dyYW51bGVzIC8gZ3JhbnVsZXNfcGVyX3VuaXQ7XG4rXHRpZiAoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl91bml0KSB7XG4rXHRcdC8qXG4rXHRcdCAqIEEgdW5pdCBoYXMgYmVlbiBwYXJ0aWFsbHkgY29uc3VtZWQsIHRoZSBzdGFydCBpcyBvd25lZCBieVxuK1x0XHQgKiB0aGUgUk1NLCB0aGUgdGFpbCBpcyBvd25lZCBieSB0aGUgaG9zdFxuK1x0XHQgKi9cbitcdFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9XG4rXHRcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgKyBjb25zdW1lZF91bml0c107XG4rXHRcdHBoeXNfYWRkcl90IHBoeXMgPSBSTUlfQUREUl9SQU5HRV9BRERSKGVudHJ5KTtcbitcdFx0dW5zaWduZWQgbG9uZyBkb25hdGVkX3NpemUgPVxuK1x0XHRcdChkb25hdGVkX2dyYW51bGVzICUgZ3JhbnVsZXNfcGVyX3VuaXQpIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuK1xuK1x0XHQvKiBGcmVlIHRoZSB0YWlsIGJhY2sgKi9cbitcdFx0Zm9yICh1bnNpZ25lZCBsb25nIGkgPSBkb25hdGVkX3NpemU7IGkgXHUwMDNjIHVuaXRfc2l6ZV9ieXRlcztcbitcdFx0ICAgICBpICs9IFBBR0VfU0laRSkge1xuK1x0XHRcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRClcbitcdFx0XHRcdGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyArIGkpO1xuK1x0XHRcdGVsc2VcbitcdFx0XHRcdF9fZnJlZV9wYWdlKHBoeXNfdG9fcGFnZShwaHlzICsgaSkpO1xuK1x0XHR9XG4rXG4rXHRcdC8qXG4rXHRcdCAqIFRoaXMgdW5pdCBpcyBub3cgZnVsbHkgJ2NvbnN1bWVkJyAoZWl0aGVyIGhlbGQgYnkgdGhlIFJNTSBvclxuK1x0XHQgKiBmcmVlZClcbitcdFx0ICovXG4rXHRcdGNvbnN1bWVkX3VuaXRzKys7XG4rXHR9XG4rXG4rXHQvKiBLZWVwIGp1c3QgdGhlIHVuaXRzIHRoZSBSTU0gZGlkbid0IHVzZSBpbiBhZGRyX2xpc3QgKi9cbitcdGZvciAodW5zaWduZWQgbG9uZyBpID0gY29uc3VtZWRfdW5pdHM7IGkgXHUwMDNjIGZvdW5kOyBpKyspXG4rXHRcdHNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0ICsgaSAtIGNvbnN1bWVkX3VuaXRzXSA9XG4rXHRcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgKyBpXTtcbitcbitcdHNyby1cdTAwM2VhZGRyX2NvdW50IC09IGNvbnN1bWVkX3VuaXRzO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyxcbitcdFx0XHQgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbitcdFx0XHQgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuK1x0XHRcdCAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyxcbitcdFx0XHQgIGdmcF90IGdmcClcbit7XG4rXHR1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0RPTkFURV9DT1VOVChkb25hdGVyZXEpO1xuK1xuK1x0aWYgKFdBUk5fT05fT05DRSghY291bnQpKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdGlmIChSTUlfRE9OQVRFX0NPTlRJRyhkb25hdGVyZXEpKSB7XG4rXHRcdHJldHVybiBybWlfc3JvX2RvbmF0ZV9jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsXG4rXHRcdFx0XHRcdCAgICAgcmVncywgZ2ZwKTtcbitcdH0gZWxzZSB7XG4rXHRcdHJldHVybiBybWlfc3JvX2RvbmF0ZV9ub25jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsXG4rXHRcdFx0XHRcdFx0cmVncywgZ2ZwKTtcbitcdH1cbit9XG4rXG4rc3RhdGljIGludCBybWlfc3JvX3JlY2xhaW0oc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyxcbitcdFx0XHQgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4rXHRcdFx0ICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBjYXBhY2l0eTtcbitcdGludCByZXQ7XG4rXG4rXHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpO1xuK1x0aWYgKHJldClcbitcdFx0cm1pX3Nyb19mcmVlKHNybyk7XG4rXG4rXHRjYXBhY2l0eSA9IFJNSV9NQVhfQUREUl9MSVNUIC0gc3JvLVx1MDAzZWFkZHJfY291bnQ7XG4rXG4rXHRybWlfb3BfbWVtX3JlY2xhaW0oc3JvX2hhbmRsZSxcbitcdFx0XHQgICB2aXJ0X3RvX3BoeXMoXHUwMDI2c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudF0pLFxuK1x0XHRcdCAgIGNhcGFjaXR5LCBvdXRfcmVncyk7XG4rXG4rXHRpZiAoV0FSTl9PTl9PTkNFKG91dF9yZWdzLVx1MDAzZWExIFx1MDAzZSBjYXBhY2l0eSkpXG4rXHRcdG91dF9yZWdzLVx1MDAzZWExID0gY2FwYWNpdHk7XG4rXG4rXHRzcm8tXHUwMDNlYWRkcl9jb3VudCArPSBvdXRfcmVncy1cdTAwM2VhMTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbit2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuK3tcbitcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBzcm8tXHUwMDNlYWRkcl9jb3VudDsgaSsrKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXHUwMDNlYWRkcl9saXN0W2ldO1xuK1x0XHR1bnNpZ25lZCBsb25nIGFkZHIgPSBSTUlfQUREUl9SQU5HRV9BRERSKGVudHJ5KTtcbitcdFx0dW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfQUREUl9SQU5HRV9TSVpFKGVudHJ5KTtcbitcdFx0dW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KTtcbitcdFx0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KTtcbitcdFx0dW5zaWduZWQgbG9uZyBzaXplID0gZG9uYXRlX3JlcV90b19zaXplKHVuaXRfc2l6ZSkgKiBjb3VudDtcbitcbitcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7XG4rXHRcdFx0aWYgKFdBUk5fT05fT05DRShybWlfdW5kZWxlZ2F0ZV9yYW5nZShhZGRyLCBzaXplKSkpIHtcbitcdFx0XHRcdC8qIExlYWsgdGhlIHBhZ2VzICovXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHR9XG4rXHRcdH1cbitcdFx0ZnJlZV9wYWdlc19leGFjdChwaHlzX3RvX3ZpcnQoYWRkciksIHNpemUpO1xuK1x0fVxuK1xuK1x0c3JvLVx1MDAzZWFkZHJfY291bnQgPSAwO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX2ZyZWUpO1xuK1xuK3Vuc2lnbmVkIGxvbmcgcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywgZ2ZwX3QgZ2ZwKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZTtcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MgPSBcdTAwMjZzcm8tXHUwMDNlcmVncztcbitcbitcdHJtaV9zbWNjY19pbnZva2UocmVncywgcmVncyk7XG4rXG4rXHRzcm9faGFuZGxlID0gcmVncy1cdTAwM2VhMTtcbitcbitcdHdoaWxlIChSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVx1MDAzZWEwKSA9PSBSTUlfSU5DT01QTEVURSkge1xuK1x0XHRib29sIGNhbl9jYW5jZWwgPSBSTUlfUkVUVVJOX0NBTl9DQU5DRUwocmVncy1cdTAwM2VhMCk7XG4rXHRcdGludCByZXQgPSAwO1xuK1xuK1x0XHRzd2l0Y2ggKFJNSV9SRVRVUk5fTUVNUkVRKHJlZ3MtXHUwMDNlYTApKSB7XG4rXHRcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcbitcdFx0XHRybWlfb3BfY29udGludWUoc3JvX2hhbmRsZSwgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkcsXG4rXHRcdFx0XHRcdHJlZ3MpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlIFJNSV9PUF9NRU1fUkVRX0RPTkFURTpcbitcdFx0XHRyZXQgPSBybWlfc3JvX2RvbmF0ZShzcm8sIHNyb19oYW5kbGUsIHJlZ3MtXHUwMDNlYTIsIHJlZ3MsXG4rXHRcdFx0XHRcdCAgICAgZ2ZwKTtcbitcdFx0XHRicmVhaztcbitcdFx0Y2FzZSBSTUlfT1BfTUVNX1JFUV9SRUNMQUlNOlxuK1x0XHRcdHJldCA9IHJtaV9zcm9fcmVjbGFpbShzcm8sIHNyb19oYW5kbGUsIHJlZ3MpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRkZWZhdWx0OlxuK1x0XHRcdHJldCA9IFdBUk5fT05fT05DRSgxKTtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1xuK1x0XHRpZiAocmV0KSB7XG4rXHRcdFx0aWYgKGNhbl9jYW5jZWwpXG4rXHRcdFx0XHRybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpO1xuK1xuK1x0XHRcdGlmIChXQVJOX09OX09OQ0UoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCkgIT0gUk1JX0lOQ09NUExFVEUpKVxuK1x0XHRcdFx0cmV0dXJuIHJldDtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cmV0dXJuIHJlZ3MtXHUwMDNlYTA7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKTtcbitcbisvKiBGb3IgUk1JIGNvbW1hbmRzIHRoYXQgYXJlIHN0YXRlZnVsIGJ1dCBub3QgbWVtb3J5LXRyYW5zZmVycmluZyAqL1xuK3Vuc2lnbmVkIGxvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBzcm9faGFuZGxlO1xuK1xuK1x0cm1pX3NtY2NjX2ludm9rZShyZWdzLCByZWdzKTtcbitcbitcdHNyb19oYW5kbGUgPSByZWdzLVx1MDAzZWExO1xuK1xuK1x0d2hpbGUgKFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3MtXHUwMDNlYTApID09IFJNSV9JTkNPTVBMRVRFKSB7XG4rXHRcdGJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLVx1MDAzZWEwKTtcbitcbitcdFx0c3dpdGNoIChSTUlfUkVUVVJOX01FTVJFUShyZWdzLVx1MDAzZWEwKSkge1xuK1x0XHRjYXNlIFJNSV9PUF9NRU1fUkVRX05PTkU6XG4rXHRcdFx0cm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLFxuK1x0XHRcdFx0XHRyZWdzKTtcbitcdFx0XHRicmVhaztcbitcdFx0ZGVmYXVsdDpcbitcdFx0XHRXQVJOX09OX09OQ0UoMSk7XG4rXHRcdFx0aWYgKCFjYW5fY2FuY2VsKVxuK1x0XHRcdFx0cmV0dXJuIHJlZ3MtXHUwMDNlYTA7XG4rXG4rXHRcdFx0cm1pX29wX2NhbmNlbChzcm9faGFuZGxlLCByZWdzKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cmV0dXJuIHJlZ3MtXHUwMDNlYTA7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fZXhlY3V0ZSk7XG4rXG4rc3RhdGljIGludCBybWlfY2hlY2tfdmVyc2lvbih2b2lkKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbitcdHVuc2lnbmVkIHNob3J0IHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3I7XG4rXHR1bnNpZ25lZCBsb25nIGhvc3RfdmVyc2lvbiA9IFJNSV9BQklfVkVSU0lPTihSTUlfQUJJX01BSk9SX1ZFUlNJT04sXG4rXHRcdFx0XHRcdFx0ICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pO1xuK1x0dW5zaWduZWQgbG9uZyBhYTY0cGZyMCA9IHJlYWRfc2FuaXRpc2VkX2Z0cl9yZWcoU1lTX0lEX0FBNjRQRlIwX0VMMSk7XG4rXG4rXHQvKiBJZiBSTUUgaXNuJ3Qgc3VwcG9ydGVkLCB0aGVuIFJNSSBjYW4ndCBiZSAqL1xuK1x0aWYgKGNwdWlkX2ZlYXR1cmVfZXh0cmFjdF91bnNpZ25lZF9maWVsZChhYTY0cGZyMCwgSURfQUE2NFBGUjBfRUwxX1JNRV9TSElGVCkgPT0gMClcbitcdFx0cmV0dXJuIC1FTlhJTztcbitcbitcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfVkVSU0lPTiwgaG9zdF92ZXJzaW9uLCBcdTAwMjZyZXMpO1xuK1xuK1x0aWYgKHJlcy5hMCA9PSBTTUNDQ19SRVRfTk9UX1NVUFBPUlRFRClcbitcdFx0cmV0dXJuIC1FTlhJTztcbitcbitcdHZlcnNpb25fbWFqb3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHJlcy5hMSk7XG4rXHR2ZXJzaW9uX21pbm9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NSU5PUihyZXMuYTEpO1xuK1xuK1x0aWYgKHJlcy5hMCAhPSBSTUlfU1VDQ0VTUykge1xuK1x0XHR1bnNpZ25lZCBzaG9ydCBoaWdoX3ZlcnNpb25fbWFqb3IsIGhpZ2hfdmVyc2lvbl9taW5vcjtcbitcbitcdFx0aGlnaF92ZXJzaW9uX21ham9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUihyZXMuYTIpO1xuK1x0XHRoaWdoX3ZlcnNpb25fbWlub3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHJlcy5hMik7XG4rXG4rXHRcdHByX2VycihcIlVuc3VwcG9ydGVkIFJNSSBBQkkgKHYlZC4lZCAtIHYlZC4lZCkgd2Ugd2FudCB2JWQuJWRcXG5cIixcbitcdFx0ICAgICAgIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IsXG4rXHRcdCAgICAgICBoaWdoX3ZlcnNpb25fbWFqb3IsIGhpZ2hfdmVyc2lvbl9taW5vcixcbitcdFx0ICAgICAgIFJNSV9BQklfTUFKT1JfVkVSU0lPTixcbitcdFx0ICAgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7XG4rXHRcdHJldHVybiAtRU5YSU87XG4rXHR9XG4rXG4rXHRwcl9pbmZvKFwiUk1JIEFCSSB2ZXJzaW9uICVkLiVkXFxuXCIsIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IpO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcm1pX3JlYWRfZmVhdHVyZXModm9pZClcbit7XG4rXHQvKlxuK1x0ICogU2luY2Ugd2UndmUgbmVnb3RpYXRlZCBhIGNvbXBhdGlibGUgdmVyc2lvbiB0aGVzZSBmZWF0dXJlIHJlZ2lzdGVyc1xuK1x0ICogc2hvdWxkIGFsd2F5cyBiZSBhdmFpbGFibGVcbitcdCAqL1xuK1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIFJNSV9GRUFUX1JFR19DT1VOVDsgaSsrKSB7XG4rXHRcdGlmIChXQVJOX09OKHJtaV9mZWF0dXJlcyhpLCBcdTAwMjZybWlfZmVhdF9yZWdfY2FjaGVbaV0pKSlcbitcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHJtaV9jb25maWd1cmUodm9pZClcbit7XG4rXHR1bnNpZ25lZCBsb25nIHJldDtcbitcdHN0cnVjdCBybW1fY29uZmlnICpjb25maWcgX19mcmVlKGZyZWVfcGFnZSkgPSAoc3RydWN0IHJtbV9jb25maWcgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XG4rXHRzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvIF9fZnJlZShrZnJlZSkgPSAoc3RydWN0IHJtaV9zcm9fc3RhdGUgKilrbWFsbG9jX29iaigqc3JvKTtcbitcbitcdGlmICghY29uZmlnIHx8ICFzcm8pXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0c3dpdGNoIChQQUdFX1NJWkUpIHtcbitcdGNhc2UgU1pfNEs6XG4rXHRcdGNvbmZpZy1cdTAwM2VybWlfZ3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV80S0I7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBTWl8xNks6XG4rXHRcdGNvbmZpZy1cdTAwM2VybWlfZ3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV8xNktCO1xuK1x0XHRicmVhaztcbitcdGNhc2UgU1pfNjRLOlxuK1x0XHRjb25maWctXHUwMDNlcm1pX2dyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNjRLQjtcbitcdFx0YnJlYWs7XG4rXHRkZWZhdWx0OlxuK1x0XHRCVUlMRF9CVUcoKTtcbitcdH1cbitcbitcdC8qXG4rXHQgKiBGb3Igbm93IHdlIHNldCB0aGUgdHJhY2tpbmdfcmVnaW9uX3NpemUgdG8gMCB3aGljaCBpcyB0aGUgb25seSBvcHRpb25cbitcdCAqIGZvciA0S0IgUEFHRV9TSVpFICgxR0IgZm9yIDRLQiBQQUdFX1NJWkUsIDMyTUIvNTEyTUIgZm9yIDE2S0IvNjRLQikuXG4rXHQgKiBUT0RPOiBTdXBwb3J0IG90aGVyIHRyYWNraW5nIHNpemVzIHZpYSBLY29uZmlnIG9wdGlvbiBmb3Igb3RoZXJcbitcdCAqIFBBR0VfU0laRVNcbitcdCAqL1xuK1x0Y29uZmlnLVx1MDAzZXRyYWNraW5nX3JlZ2lvbl9zaXplID0gMDtcbitcbitcdHJldCA9IHJtaV9ybW1fY29uZmlnX3NldCh2aXJ0X3RvX3BoeXMoY29uZmlnKSk7XG4rXHRpZiAocmV0KSB7XG4rXHRcdHByX2VycihcIlJNTSBjb25maWcgc2V0IGZhaWxlZFxcblwiKTtcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHR9XG4rXG4rXHRyZXQgPSBybWlfcm1tX2FjdGl2YXRlKHNybyk7XG4rXHRpZiAocmV0KSB7XG4rXHRcdHByX2VycihcIlJNTSBhY3RpdmF0ZSBmYWlsZWRcXG5cIik7XG4rXHRcdHJldHVybiAtRU5YSU87XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLypcbisgKiBNYWtlIHN1cmUgdGhlIGFyZWEgaXMgdHJhY2tlZCBieSBSTU0gYXQgRklORSBncmFudWxhcml0eS5cbisgKiBXZSBkbyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aGUgdHJhY2tpbmcgeWV0LlxuKyAqL1xuK3N0YXRpYyBpbnQgcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcbit7XG4rXHR3aGlsZSAoc3RhcnQgXHUwMDNjIGVuZCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIHJldCwgY2F0ZWdvcnksIHN0YXRlLCBuZXh0O1xuK1xuK1x0XHRyZXQgPSBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQoc3RhcnQsIGVuZCwgXHUwMDI2Y2F0ZWdvcnksIFx1MDAyNnN0YXRlLCBcdTAwMjZuZXh0KTtcbitcdFx0aWYgKHJldCAhPSBSTUlfU1VDQ0VTUyB8fFxuK1x0XHQgICAgc3RhdGUgIT0gUk1JX1RSQUNLSU5HX0ZJTkUgfHxcbitcdFx0ICAgIGNhdGVnb3J5ICE9IFJNSV9NRU1fQ0FURUdPUllfQ09OVkVOVElPTkFMKSB7XG4rXHRcdFx0LyogVE9ETzogU2V0IGdyYW51bGUgdHJhY2tpbmcgaW4gdGhpcyBjYXNlICovXG4rXHRcdFx0cHJfZXJyKFwiR3JhbnVsZSB0cmFja2luZyBmb3IgcmVnaW9uIGlzbid0IGZpbmUvY29udmVudGlvbmFsOiAlbGx4XFxuXCIsXG4rXHRcdFx0ICAgICAgIHN0YXJ0KTtcbitcdFx0XHRyZXR1cm4gLUVOT0RFVjtcbitcdFx0fVxuK1x0XHRzdGFydCA9IG5leHQ7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBybWlfY3JlYXRlX2dwdHMocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcbit7XG4rXHRzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvO1xuK1x0dW5zaWduZWQgbG9uZyBsMGdwdF9zejtcbitcbitcdHNybyA9IGttYWxsb2Nfb2JqKCpzcm8sIEdGUF9LRVJORUwpO1xuK1x0aWYgKCFzcm8pXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0bDBncHRfc3ogPSAxVUwgXHUwMDNjXHUwMDNjICgzMCArIEZJRUxEX0dFVChSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1osXG4rXHRcdFx0XHRcdCAgcm1pX2ZlYXRfcmVnKDEpKSk7XG4rXHRzdGFydCA9IEFMSUdOX0RPV04oc3RhcnQsIGwwZ3B0X3N6KTtcbitcdGVuZCA9IEFMSUdOKGVuZCwgbDBncHRfc3opO1xuK1xuK1x0d2hpbGUgKHN0YXJ0IFx1MDAzYyBlbmQpIHtcbitcdFx0aW50IHJldCA9IHJtaV9ncHRfbDFfY3JlYXRlKHN0YXJ0LCBzcm8sIEdGUF9LRVJORUwpO1xuK1xuK1x0XHQvKlxuK1x0XHQgKiBNYWtlIHN1cmUgdGhlIEwxIEdQVCB0YWJsZXMgYXJlIGNyZWF0ZWQgZm9yIHRoZSByZWdpb24uXG4rXHRcdCAqIFJNSV9FUlJPUl9HUFQgaW5kaWNhdGVzIHRoZSBMMSB0YWJsZSBhbHJlYWR5IGV4aXN0cy5cbitcdFx0ICovXG4rXHRcdGlmIChyZXQgIT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IFJNSV9SRVRVUk5fU1RBVFVTKHJldCkgIT0gUk1JX0VSUk9SX0dQVCkge1xuK1x0XHRcdHByX2VycihcIkdQVCBMZXZlbDEgdGFibGUgbWlzc2luZyBmb3IgJWxseFxcblwiLCBzdGFydCk7XG4rXHRcdFx0a2ZyZWUoc3JvKTtcbitcdFx0XHRyZXR1cm4gLUVOT01FTTtcbitcdFx0fVxuK1x0XHRzdGFydCArPSBsMGdwdF9zejtcbitcdH1cbitcbitcdGtmcmVlKHNybyk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBybWlfaW5pdF9tZXRhZGF0YSh2b2lkKVxuK3tcbitcdHBoeXNfYWRkcl90IHN0YXJ0LCBlbmQ7XG4rXHRjb25zdCBzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyO1xuK1xuK1x0Zm9yX2VhY2hfbWVtX3JlZ2lvbihyKSB7XG4rXHRcdGludCByZXQ7XG4rXG4rXHRcdHN0YXJ0ID0gbWVtYmxvY2tfcmVnaW9uX21lbW9yeV9iYXNlX3BmbihyKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbitcdFx0ZW5kID0gbWVtYmxvY2tfcmVnaW9uX21lbW9yeV9lbmRfcGZuKHIpIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuK1x0XHRyZXQgPSBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhzdGFydCwgZW5kKTtcbitcdFx0aWYgKHJldClcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHRyZXQgPSBybWlfY3JlYXRlX2dwdHMoc3RhcnQsIGVuZCk7XG4rXHRcdGlmIChyZXQpXG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitib29sIGlzX3JtaV9hdmFpbGFibGUodm9pZClcbit7XG4rXHRyZXR1cm4gYXJtNjRfcm1pX2lzX2F2YWlsYWJsZTtcbit9XG4rXG4rc3RhdGljIGludCBfX2luaXQgYXJtNjRfaW5pdF9ybWkodm9pZClcbit7XG4rXHRpbnQgcmV0O1xuK1xuK1x0LyogQ29udGludWUgd2l0aG91dCByZWFsbSBzdXBwb3J0IGlmIHdlIGNhbid0IGFncmVlIG9uIGEgdmVyc2lvbiAqL1xuK1x0cmV0ID0gcm1pX2NoZWNrX3ZlcnNpb24oKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBybWlfcmVhZF9mZWF0dXJlcygpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IHJtaV9jb25maWd1cmUoKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBybWlfaW5pdF9tZXRhZGF0YSgpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdGFybTY0X3JtaV9pc19hdmFpbGFibGUgPSB0cnVlO1xuK1x0cHJfaW5mbyhcIlJNSSBjb25maWd1cmVkXCIpO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qXG4rICogTm90ZSBhcm02NF9pbml0X3JtaSgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBrdm1faW5pdF9ybWkoKSBvdGhlcndpc2UgS1ZNXG4rICogd2lsbCBub3Qgc3VwcG9ydCByZWFsbSBndWVzdHMuIHN1YnN5c19pbml0Y2FsbCgpIGlzIGNhbGxlZCBiZWZvcmVcbisgKiBtb2R1bGVfaW5pdCgpICh1c2VkIGZvciBLVk0pIHNvIHRoaXMgaXMgT0suXG4rICovXG4rc3Vic3lzX2luaXRjYWxsKGFybTY0X2luaXRfcm1pKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oIGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi4xMzg5ODNhYjRlM2MyMlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaFxuQEAgLTAsMCArMSwyMDUgQEBcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xuKy8qXG4rICogQ29weXJpZ2h0IChDKSAyMDI2IEFSTSBMdGQuXG4rICovXG4rXG4rI2lmbmRlZiBfX0xJTlVYX0FSTV9STUlfQ01EU19IX1xuKyNkZWZpbmUgX19MSU5VWF9BUk1fUk1JX0NNRFNfSF9cbitcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9hcm0tc21jY2Mtcm1pLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9idWcuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcdTAwM2Nhc20vcGFnZS5oXHUwMDNlXG4rXG4rc3RydWN0IHJ0dF9lbnRyeSB7XG4rXHR1bnNpZ25lZCBsb25nIHdhbGtfbGV2ZWw7XG4rXHR1bnNpZ25lZCBsb25nIGRlc2M7XG4rXHRpbnQgc3RhdGU7XG4rXHRpbnQgcmlwYXM7XG4rfTtcbitcbisjZGVmaW5lIFJNSV9NQVhfQUREUl9MSVNUXHQyNTZcbitcbitzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSB7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3M7XG4rXHR1bnNpZ25lZCBsb25nIGFkZHJfY291bnQ7XG4rXHR1bnNpZ25lZCBsb25nIGFkZHJfbGlzdFtSTUlfTUFYX0FERFJfTElTVF07XG4rfTtcbitcbit1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZyh1bnNpZ25lZCBsb25nIGlkKTtcbitcbitpbnQgcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbitcdFx0ICAgICAgIHBoeXNfYWRkcl90ICpvdXRfcGh5cyk7XG4raW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7XG4raW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cyk7XG4rXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX2RlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbit7XG4rXHRyZXR1cm4gcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIFBBR0VfU0laRSwgTlVMTCk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbit7XG4rXHRyZXR1cm4gcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFKTtcbit9XG4rXG4rYm9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpO1xuK1xuK3Vuc2lnbmVkIGxvbmcgcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywgZ2ZwX3QgZ2ZwKTtcbit2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKTtcbit1bnNpZ25lZCBsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKTtcbitcbisjZGVmaW5lIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBnZnAsIC4uLikgKHtcdFx0XHRcdFxcXG4rXHRzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqX19zcm8gPSAoc3JvKTtcdFx0XHRcdFxcXG4rXHQqX19zcm8gPSAoc3RydWN0IHJtaV9zcm9fc3RhdGUpeyAucmVncyA9IHtfX1ZBX0FSR1NfX30gfTtcdFxcXG4rXHRpbnQgX19yZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShfX3NybywgZ2ZwKTtcdFx0XFxcbitcdHJtaV9zcm9fZnJlZShfX3Nybyk7XHRcdFx0XHRcdFx0XFxcbitcdF9fcmV0O1x0XHRcdFx0XHRcdFx0XHRcXFxuK30pXG4rXG4rLyoqXG4rICogcm1pX3JtbV9jb25maWdfc2V0KCkgLSBDb25maWd1cmUgdGhlIFJNTVxuKyAqIEBjZmdfcHRyOiBQQSBvZiBhIHN0cnVjdCBybW1fY29uZmlnXG4rICpcbisgKiBTZXRzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiB0aGUgUk1NLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfcm1tX2NvbmZpZ19zZXQodW5zaWduZWQgbG9uZyBjZmdfcHRyKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbitcbitcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUk1NX0NPTkZJR19TRVQsIGNmZ19wdHIsIFx1MDAyNnJlcyk7XG4rXG4rXHRyZXR1cm4gcmVzLmEwO1xuK31cbitcbisvKipcbisgKiBybWlfcm1tX2FjdGl2YXRlKCkgLSBBY3RpdmF0ZSB0aGUgUk1NXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3JtbV9hY3RpdmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuK3tcbitcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwgU01DX1JNSV9STU1fQUNUSVZBVEUpO1xuK31cbitcbisvKipcbisgKiBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQoKSAtIEdldCBjb25maWd1cmF0aW9uIG9mIGEgR3JhbnVsZSB0cmFja2luZyByZWdpb25cbisgKiBAc3RhcnQ6IEJhc2UgUEEgb2YgdGhlIHRyYWNraW5nIHJlZ2lvblxuKyAqIEBlbmQ6IEVuZCBvZiB0aGUgUEEgcmVnaW9uXG4rICogQG91dF9jYXRlZ29yeTogTWVtb3J5IGNhdGVnb3J5XG4rICogQG91dF9zdGF0ZTogVHJhY2tpbmcgcmVnaW9uIHN0YXRlXG4rICogQG91dF90b3A6IFRvcCBvZiB0aGUgbWVtb3J5IHJlZ2lvblxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQodW5zaWduZWQgbG9uZyBzdGFydCxcbitcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBlbmQsXG4rXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF9jYXRlZ29yeSxcbitcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3N0YXRlLFxuK1x0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbitcbitcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVQsIHN0YXJ0LCBlbmQsIFx1MDAyNnJlcyk7XG4rXG4rXHRpZiAob3V0X2NhdGVnb3J5KVxuK1x0XHQqb3V0X2NhdGVnb3J5ID0gcmVzLmExO1xuK1x0aWYgKG91dF9zdGF0ZSlcbitcdFx0Km91dF9zdGF0ZSA9IHJlcy5hMjtcbitcdGlmIChvdXRfdG9wKVxuK1x0XHQqb3V0X3RvcCA9IHJlcy5hMztcbitcbitcdHJldHVybiByZXMuYTA7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ncHRfbDFfY3JlYXRlKCkgLSBDcmVhdGUgYSBMZXZlbCAxIEdQVFxuKyAqIEBhZGRyOiBCYXNlIG9mIHBoeXNpY2FsIGFkZHJlc3MgcmVnaW9uIGRlc2NyaWJlZCBieSB0aGUgTDFHUFRcbisgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuKyAqIEBnZnA6IEFsbG9jYXRpb24gZmxhZ3MgZm9yIFNSTyBtZW1vcnkgZG9uYXRpb24gcmVxdWVzdHNcbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX2dwdF9sMV9jcmVhdGUodW5zaWduZWQgbG9uZyBhZGRyLFxuK1x0XHRcdFx0ICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4rXHRcdFx0XHQgICAgZ2ZwX3QgZ2ZwKVxuK3tcbitcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgZ2ZwLCBTTUNfUk1JX0dQVF9MMV9DUkVBVEUsIGFkZHIpO1xuK31cbitcbisvKipcbisgKiBybWlfZmVhdHVyZXMoKSAtIFJlYWQgZmVhdHVyZSByZWdpc3RlclxuKyAqIEBpbmRleDogRmVhdHVyZSByZWdpc3RlciBpbmRleFxuKyAqIEBvdXQ6IEZlYXR1cmUgcmVnaXN0ZXIgdmFsdWUgaXMgd3JpdHRlbiB0byB0aGlzIHBvaW50ZXJcbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX2ZlYXR1cmVzKHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgKm91dClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XG4rXG4rXHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX0ZFQVRVUkVTLCBpbmRleCwgXHUwMDI2cmVzKTtcbitcbitcdGlmIChvdXQpXG4rXHRcdCpvdXQgPSByZXMuYTE7XG4rXHRyZXR1cm4gcmVzLmEwO1xuK31cbitcbisvKipcbisgKiBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSgpIC0gRGVsZWdhdGUgZ3JhbnVsZXNcbisgKiBAYmFzZTogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgb2YgdGhlIHJhbmdlXG4rICogQHRvcDogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgYWZ0ZXIgdGhlIHJhbmdlXG4rICogQG91dF90b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG5vdCBkZWxlZ2F0ZWRcbisgKlxuKyAqIERlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZSBmb3IgdXNlIGJ5IHRoZSByZWFsbSB3b3JsZC4gSWYgdGhlIGVudGlyZSByYW5nZVxuKyAqIHdhcyBkZWxlZ2F0ZWQgdGhlbiBAb3V0X3RvcCA9PSBAdG9wLCBvdGhlcndpc2UgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbisgKiBhZ2FpbiB3aXRoIEBiYXNlID09IEBvdXRfdG9wLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4rXHRcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfR1JBTlVMRV9SQU5HRV9ERUxFR0FURSwgYmFzZSwgdG9wXG4rXHR9O1xuK1x0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChvdXRfdG9wKVxuK1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKCkgLSBVbmRlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZXNcbisgKiBAYmFzZTogQmFzZSBQQSBvZiB0aGUgdGFyZ2V0IHJhbmdlXG4rICogQHRvcDogVG9wIFBBIG9mIHRoZSB0YXJnZXQgcmFuZ2VcbisgKiBAb3V0X3RvcDogUmV0dXJucyB0aGUgdG9wIFBBIG9mIHJhbmdlIHdob3NlIHN0YXRlIGlzIHVuZGVsZWdhdGVkXG4rICpcbisgKiBVbmRlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZXMgdG8gYWxsb3cgdXNlIGJ5IHRoZSBub3JtYWwgd29ybGQuIFdpbGwgZmFpbCBpZlxuKyAqIHRoZSBncmFudWxlcyBhcmUgaW4gdXNlLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSxcbitcdFx0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuK1x0XHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfR1JBTlVMRV9SQU5HRV9VTkRFTEVHQVRFLCBiYXNlLCB0b3BcbitcdH07XG4rXHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKG91dF90b3ApXG4rXHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKyNlbmRpZlxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oIGIvaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uYzk2NWU4ODY3NTE4ZjNcbi0tLSAvZGV2L251bGxcbisrKyBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oXG5AQCAtMCwwICsxLDQ5OSBAQFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4rLypcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLlxuKyAqXG4rICogVGhlIHZhbHVlcyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgYXJlIGZyb20gdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvclxuKyAqIHNwZWNpZmljYXRpb24gKERFTjAxMzcpIHZlcnNpb24gMi4wLWJldDI6XG4rICogaHR0cHM6Ly9kZXZlbG9wZXIuYXJtLmNvbS9kb2N1bWVudGF0aW9uL2RlbjAxMzcvMi0wYmV0Mi9cbisgKi9cbitcbisjaWZuZGVmIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IX1xuKyNkZWZpbmUgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYXJtLXNtY2NjLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRmaWVsZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYml0cy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnVpbGRfYnVnLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zaXplcy5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXHUwMDNjYXNtL3BhZ2UuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2FzbS9zeXNyZWcuaFx1MDAzZVxuK1xuKyNkZWZpbmUgU01DX1JNSV9DQUxMKGZ1bmMpXHRcdFx0XHRcXFxuK1x0QVJNX1NNQ0NDX0NBTExfVkFMKEFSTV9TTUNDQ19GQVNUX0NBTEwsXHRcdFxcXG4rXHRcdFx0ICAgQVJNX1NNQ0NDX1NNQ182NCxcdFx0XFxcbitcdFx0XHQgICBBUk1fU01DQ0NfT1dORVJfU1RBTkRBUkQsXHRcXFxuK1x0XHRcdCAgIChmdW5jKSlcbitcbisjZGVmaW5lIFNNQ19STUlfVkVSU0lPTlx0XHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1MClcbitcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVRcdFx0U01DX1JNSV9DQUxMKDB4MDE1MylcbitcbisjZGVmaW5lIFNNQ19STUlfUkVBTE1fQUNUSVZBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTU3KVxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTU4KVxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1OSlcbisjZGVmaW5lIFNNQ19STUlfUkVDX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNWEpXG4rI2RlZmluZSBTTUNfUk1JX1JFQ19ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1YilcbisjZGVmaW5lIFNNQ19STUlfUkVDX0VOVEVSXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1YylcbisjZGVmaW5lIFNNQ19STUlfUlRUX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNWQpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1ZSlcbitcbisjZGVmaW5lIFNNQ19STUlfUlRUX1JFQURfRU5UUllcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTYxKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1ZBTElEQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxNjMpXG4rI2RlZmluZSBTTUNfUk1JX1BTQ0lfQ09NUExFVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTY0KVxuKyNkZWZpbmUgU01DX1JNSV9GRUFUVVJFU1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjUpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9GT0xEXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2NilcbitcbisjZGVmaW5lIFNNQ19STUlfUlRUX0lOSVRfUklQQVNcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTY4KVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1JJUEFTXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2OSlcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2YSlcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNmIpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1JNTV9DT05GSUdfU0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2ZSlcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfSVJRX05PVElGWVx0XHRTTUNfUk1JX0NBTEwoMHgwMTZmKVxuKyNkZWZpbmUgU01DX1JNSV9BVFRFU1RfUExBVF9UT0tFTl9SRUZSRVNIXHRTTUNfUk1JX0NBTEwoMHgwMTcwKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9QREVWX0FCT1JUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3NClcbisjZGVmaW5lIFNNQ19STUlfUERFVl9DT01NVU5JQ0FURVx0XHRTTUNfUk1JX0NBTEwoMHgwMTc1KVxuKyNkZWZpbmUgU01DX1JNSV9QREVWX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzYpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzcpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfR0VUX1NUQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3OClcbitcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fS0VZX1JFRlJFU0hcdFx0U01DX1JNSV9DQUxMKDB4MDE3YSlcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TRVRfUFVCS0VZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3YilcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVE9QXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3YylcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdkKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdlKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0ZPTERcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdmKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9WREVWX0FCT1JUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4NSlcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9DT01NVU5JQ0FURVx0XHRTTUNfUk1JX0NBTEwoMHgwMTg2KVxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODcpXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODgpXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfR0VUX1NUQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4OSlcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9VTkxPQ0tcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMThhKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1MyQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMThiKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9JTlRFUkZBQ0VfUkVQT1JUXHRTTUNfUk1JX0NBTEwoMHgwMWQwKVxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9NRUFTVVJFTUVOVFNcdFx0U01DX1JNSV9DQUxMKDB4MDFkMSlcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9MT0NLXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkMilcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9TVEFSVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZDMpXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfUDJQX0JJTkRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWQ0KVxuKyNkZWZpbmUgU01DX1JNSV9WREVWX1AyUF9VTkJJTkRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWQ1KVxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9FVkVOVF9IQU5ETEVcdFx0U01DX1JNSV9DQUxMKDB4MDFkNilcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfQUNUSVZBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWQ3KVxuKyNkZWZpbmUgU01DX1JNSV9QU01NVV9ERUFDVElWQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZDgpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX1NUX0wyX0NSRUFURVx0XHRTTUNfUk1JX0NBTEwoMHgwMWRiKVxuKyNkZWZpbmUgU01DX1JNSV9QU01NVV9TVF9MMl9ERVNUUk9ZXHRcdFNNQ19STUlfQ0FMTCgweDAxZGMpXG4rI2RlZmluZSBTTUNfUk1JX0RQVF9MMF9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWRkKVxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDBfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZGUpXG4rI2RlZmluZSBTTUNfUk1JX0RQVF9MMV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWRmKVxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDFfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZTApXG4rI2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfR0VUXHRcdFNNQ19STUlfQ0FMTCgweDAxZTEpXG4rXG4rI2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfU0VUXHRcdFNNQ19STUlfQ0FMTCgweDAxZTMpXG4rI2RlZmluZSBTTUNfUk1JX0NNRU1fQUREX1BERVZcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWU0KVxuKyNkZWZpbmUgU01DX1JNSV9DTUVNX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZTUpXG4rI2RlZmluZSBTTUNfUk1JX0NNRU1fREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZTYpXG4rI2RlZmluZSBTTUNfUk1JX0NNRU1fUE9QVUxBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWU3KVxuKyNkZWZpbmUgU01DX1JNSV9DTUVNX1JFTU9WRV9QREVWXHRcdFNNQ19STUlfQ0FMTCgweDAxZTgpXG4rI2RlZmluZSBTTUNfUk1JX0NNRU1fU1RBUlRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWU5KVxuKyNkZWZpbmUgU01DX1JNSV9DTUVNX1NUT1BcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWVhKVxuKyNkZWZpbmUgU01DX1JNSV9DTUVNX1VOUE9QVUxBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWViKVxuKyNkZWZpbmUgU01DX1JNSV9STU1fQ09ORklHX0dFVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZWMpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfTUVDX1JFRlJFU0hcdFx0U01DX1JNSV9DQUxMKDB4MDFlZClcbisjZGVmaW5lIFNNQ19STUlfUk1NX1NUQVRFX0dFVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZWUpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX0VWRU5UX0NPTlNVTUVcdFx0U01DX1JNSV9DQUxMKDB4MDFmMClcbisjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9SQU5HRV9ERUxFR0FURVx0XHRTTUNfUk1JX0NBTEwoMHgwMWYxKVxuKyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEVcdFNNQ19STUlfQ0FMTCgweDAxZjIpXG4rI2RlZmluZSBTTUNfUk1JX0dQVF9MMV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWYzKVxuKyNkZWZpbmUgU01DX1JNSV9HUFRfTDFfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjQpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX01BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjUpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX1VOTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmNilcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9NQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWY3KVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1VOTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmOClcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FSQ0hfREVWX01BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWY5KVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVJDSF9ERVZfVU5NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmYSlcbisjZGVmaW5lIFNNQ19STUlfUlRUX1VOUFJPVF9NQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZiKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmMpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfUFJPVF9NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmZClcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmUpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX01BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZmKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1VOUFJPVF9VTk1BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAwKVxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9URVJNSU5BVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAxKVxuKyNkZWZpbmUgU01DX1JNSV9STU1fQUNUSVZBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAyKVxuKyNkZWZpbmUgU01DX1JNSV9PUF9DT05USU5VRVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMDMpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTk5FQ1RcdFx0U01DX1JNSV9DQUxMKDB4MDIwNClcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fRElTQ09OTkVDVFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA1KVxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9DT01QTEVURVx0XHRTTUNfUk1JX0NBTEwoMHgwMjA2KVxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUFVSR0VcdFx0U01DX1JNSV9DQUxMKDB4MDIwNylcbisjZGVmaW5lIFNNQ19STUlfT1BfTUVNX0RPTkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMDgpXG4rI2RlZmluZSBTTUNfUk1JX09QX01FTV9SRUNMQUlNXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwOSlcbisjZGVmaW5lIFNNQ19STUlfT1BfQ0FOQ0VMXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwYSlcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfRkVBVFVSRVNcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBiKVxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9DTURfR0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwYylcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0NPTVBMRVRFXHRcdFNNQ19STUlfQ0FMTCgweDAyMGQpXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX0lORk9cdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBlKVxuK1xuKyNkZWZpbmUgUk1JX0FCSV9NQUpPUl9WRVJTSU9OXHQyXG4rI2RlZmluZSBSTUlfQUJJX01JTk9SX1ZFUlNJT05cdDBcbitcbisjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IodmVyc2lvbikgKCh2ZXJzaW9uKSBcdTAwM2VcdTAwM2UgMTYpXG4rI2RlZmluZSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHZlcnNpb24pICgodmVyc2lvbikgXHUwMDI2IDB4RkZGRilcbisjZGVmaW5lIFJNSV9BQklfVkVSU0lPTihtYWpvciwgbWlub3IpICAgICAgKCgobWFqb3IpIFx1MDAzY1x1MDAzYyAxNikgfCAobWlub3IpKVxuK1xuKyNkZWZpbmUgUk1JX1JFVFVSTl9TVEFUVVNfTUFTS1x0XHQoMHhGRlVMKVxuKyNkZWZpbmUgUk1JX1JFVFVSTl9JTkRFWF9NQVNLXHRcdCgweEZGVUwgXHUwMDNjXHUwMDNjIDgpXG4rI2RlZmluZSBSTUlfUkVUVVJOX01FTVJFUV9NQVNLXHRcdCgweDNVTCBcdTAwM2NcdTAwM2MgOClcbisjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLXHQoMHgxVUwgXHUwMDNjXHUwMDNjIDEwKVxuK1xuKyNkZWZpbmUgUk1JX1JFVFVSTl9TVEFUVVMocmV0KVx0XHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9TVEFUVVNfTUFTSywgcmV0KVxuKyNkZWZpbmUgUk1JX1JFVFVSTl9JTkRFWChyZXQpXHRcdEZJRUxEX0dFVChSTUlfUkVUVVJOX0lOREVYX01BU0ssIHJldClcbisjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRKHJldClcdFx0RklFTERfR0VUKFJNSV9SRVRVUk5fTUVNUkVRX01BU0ssIHJldClcbisjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZXQpXHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMX01BU0ssIHJldClcbitcbisjZGVmaW5lIFJNSV9TVUNDRVNTXHRcdFx0MFxuKyNkZWZpbmUgUk1JX0VSUk9SX0lOUFVUXHRcdFx0MVxuKyNkZWZpbmUgUk1JX0VSUk9SX1JFQUxNXHRcdFx0MlxuKyNkZWZpbmUgUk1JX0VSUk9SX1JFQ1x0XHRcdDNcbisjZGVmaW5lIFJNSV9FUlJPUl9SVFRcdFx0XHQ0XG4rI2RlZmluZSBSTUlfRVJST1JfTk9UX1NVUFBPUlRFRFx0XHQ1XG4rI2RlZmluZSBSTUlfRVJST1JfREVWSUNFXHRcdDZcbisjZGVmaW5lIFJNSV9FUlJPUl9SVFRfQVVYXHRcdDdcbisjZGVmaW5lIFJNSV9FUlJPUl9QU01NVV9TVFx0XHQ4XG4rI2RlZmluZSBSTUlfRVJST1JfRFBUXHRcdFx0OVxuKyNkZWZpbmUgUk1JX0JVU1lcdFx0XHQxMFxuKyNkZWZpbmUgUk1JX0VSUk9SX0dMT0JBTFx0XHQxMVxuKyNkZWZpbmUgUk1JX0VSUk9SX1RSQUNLSU5HXHRcdDEyXG4rI2RlZmluZSBSTUlfSU5DT01QTEVURVx0XHRcdDEzXG4rI2RlZmluZSBSTUlfQkxPQ0tFRFx0XHRcdDE0XG4rI2RlZmluZSBSTUlfRVJST1JfR1BUXHRcdFx0MTVcbisjZGVmaW5lIFJNSV9FUlJPUl9HUkFOVUxFXHRcdDE2XG4rXG4rI2RlZmluZSBSTUlfQ09OVElOVUVfS0VFUF9HT0lOR1x0XHQwXG4rI2RlZmluZSBSTUlfQ09OVElOVUVfU1RPUFx0XHQxXG4rXG4rI2RlZmluZSBSTUlfT1BfTUVNX1JFUV9OT05FXHRcdDBcbisjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX0RPTkFURVx0XHQxXG4rI2RlZmluZSBSTUlfT1BfTUVNX1JFUV9SRUNMQUlNXHRcdDJcbitcbisjZGVmaW5lIFJNSV9ET05BVEVfU0laRV9NQVNLXHRcdDNVTFxuKyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVF9NQVNLXHRcdEdFTk1BU0soMTUsIDIpXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJR19NQVNLXHRcdEJJVCgxNilcbisjZGVmaW5lIFJNSV9ET05BVEVfU1RBVEVfTUFTS1x0XHRCSVQoMTcpXG4rXG4rI2RlZmluZSBSTUlfRE9OQVRFX1NJWkUocmVxKVx0XHRGSUVMRF9HRVQoUk1JX0RPTkFURV9TSVpFX01BU0ssIHJlcSlcbisjZGVmaW5lIFJNSV9ET05BVEVfQ09VTlQocmVxKVx0XHRGSUVMRF9HRVQoUk1JX0RPTkFURV9DT1VOVF9NQVNLLCByZXEpXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJRyhyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPTlRJR19NQVNLLCByZXEpXG4rI2RlZmluZSBSTUlfRE9OQVRFX1NUQVRFKHJlcSlcdFx0RklFTERfR0VUKFJNSV9ET05BVEVfU1RBVEVfTUFTSywgcmVxKVxuK1xuKyNkZWZpbmUgUk1JX09QX01FTV9ERUxFR0FURURcdFx0MFxuKyNkZWZpbmUgUk1JX09QX01FTV9VTkRFTEVHQVRFRFx0XHQxXG4rXG4rI2RlZmluZSBSTUlfQUREUl9UWVBFX05PTkVcdFx0MFxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9TSU5HTEVcdFx0MVxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9MSVNUXHRcdDJcbitcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTS1x0R0VOTUFTSygxLCAwKVxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTS1x0R0VOTUFTSyhQQUdFX1NISUZUIC0gMSwgMilcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFJfTUFTS1x0KFBBR0VfTUFTSyBcdTAwMjYgR0VOTUFTSyg1MSwgMCkpXG4rI2RlZmluZSBSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLXHRCSVQoNjMpXG4rXG4rI2RlZmluZSBSTUlfQUREUl9SQU5HRV9TSVpFKGFyKVx0XHQoRklFTERfR0VUKFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTSywgXFxcbitcdFx0XHRcdFx0XHQgICAoYXIpKSlcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0NPVU5UKGFyKVx0KEZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcXFxuK1x0XHRcdFx0XHRcdCAgIChhcikpKVxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQUREUihhcilcdFx0KChhcikgXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSylcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NUQVRFKGFyKVx0KEZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcXFxuK1x0XHRcdFx0XHRcdCAgIChhcikpKVxuK1xuK2VudW0gcm1pX3JpcGFzIHtcbitcdFJNSV9FTVBUWSA9IDAsXG4rXHRSTUlfUkFNID0gMSxcbitcdFJNSV9ERVNUUk9ZRUQgPSAyLFxuK1x0Uk1JX0RFViA9IDMsXG4rfTtcbitcbisjZGVmaW5lIFJNSV9OT19NRUFTVVJFX0NPTlRFTlRcdDBcbisjZGVmaW5lIFJNSV9NRUFTVVJFX0NPTlRFTlRcdDFcbitcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUzJTWlx0XHRHRU5NQVNLKDcsIDApXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX0xQQTJcdFx0QklUKDgpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1NWRVx0XHRCSVQoOSlcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFX1ZMXHRcdEdFTk1BU0soMTMsIDEwKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9OVU1fQlBTXHRcdEdFTk1BU0soMTksIDE0KVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9OVU1fV1BTXHRcdEdFTk1BU0soMjUsIDIwKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVcdFx0QklUKDI2KVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVfTlVNX0NUUlNcdEdFTk1BU0soMzEsIDI3KVxuK1xuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl80S0JcdEJJVCgwKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl8xNktCXHRCSVQoMSlcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNjRLQlx0QklUKDIpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzI1Nlx0QklUKDMpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzM4NFx0QklUKDQpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzUxMlx0QklUKDUpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX01BWF9SRUNTX09SREVSXHRHRU5NQVNLKDksIDYpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1pcdFx0R0VOTUFTSygxMywgMTApXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1BQU1x0XHRHRU5NQVNLKDE2LCAxNClcbitcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfREFcdFx0QklUKDApXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0RBX0NPSFx0XHRCSVQoMSlcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVlNNTVVcdFx0QklUKDIpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0FUU1x0XHRCSVQoMylcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfTUFYX1ZERVZTX09SREVSXHRHRU5NQVNLKDcsIDQpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1ZERVZfS1JPVVx0QklUKDgpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX05PTl9URUVfU1RSRUFNXHRCSVQoOSlcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfUDJQXHRcdEJJVCgxMClcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQ01FTV9DWExcdFx0QklUKDExKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9NQVhfQ01FTVx0XHRHRU5NQVNLKDE5LCAxMilcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQ01FTV9UU0VfUkVRXHRCSVQoMjApXG4rXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX01BWF9OVU1fQVVYX1BMQU5FU1x0R0VOTUFTSygzLCAwKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19SVFRfUExBTkVcdFx0R0VOTUFTSyg1LCA0KVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19SVFRfUzJBUF9JTkRJUkVDVFx0QklUKDYpXG4rXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl80X01FQ19DT1VOVFx0XHRHRU5NQVNLKDYzLCAwKVxuK1xuKyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUxcdFx0MFxuKyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9ERVZfTkNPSFx0XHQxXG4rI2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0RFVl9DT0hcdFx0MlxuK1xuKyNkZWZpbmUgUk1JX1RSQUNLSU5HX1JFU0VSVkVEXHRcdFx0MFxuKyNkZWZpbmUgUk1JX1RSQUNLSU5HX05PTkVcdFx0XHQxXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfRklORVx0XHRcdDJcbisjZGVmaW5lIFJNSV9UUkFDS0lOR19DT0FSU0VcdFx0XHQzXG4rXG4rI2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzRLQlx0MFxuKyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV8xNktCXHQxXG4rI2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzY0S0JcdDJcbitcbisvKlxuKyAqIE5vdGUgbWFueSBvZiB0aGVzZSBmaWVsZHMgYXJlIHNtYWxsZXIgdGhhbiB1NjQgYnV0IGFsbCBmaWVsZHMgaGF2ZSB1NjRcbisgKiBhbGlnbm1lbnQsIHNvIHVzZSB1NjQgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50LlxuKyAqL1xuK3N0cnVjdCBybW1fY29uZmlnIHtcbitcdHVuaW9uIHsgLyogMHgwICovXG4rXHRcdHN0cnVjdCB7XG4rXHRcdFx0dTY0IHRyYWNraW5nX3JlZ2lvbl9zaXplO1xuK1x0XHRcdHU2NCBybWlfZ3JhbnVsZV9zaXplO1xuK1x0XHR9O1xuK1x0XHR1OCBzaXplcltTWl80S107XG4rXHR9O1xuK307XG4rXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJtbV9jb25maWcpID09IFNaXzRLKTtcbitcbisjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0xQQTJcdFx0QklUKDApXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19TVkVcdFx0QklUKDEpXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19QTVVcdFx0QklUKDIpXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19EQVx0XHRcdEJJVCgzKVxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfTEZBX1BPTElDWVx0XHRHRU5NQVNLKDYsIDUpXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19NRUNfUE9MSUNZXHRcdEdFTk1BU0soOCwgNylcbitcbisjZGVmaW5lIFJNSV9IQVNIX1NIQV8yNTZcdFx0XHQwXG4rI2RlZmluZSBSTUlfSEFTSF9TSEFfNTEyXHRcdFx0MVxuKyNkZWZpbmUgUk1JX0hBU0hfU0hBXzM4NFx0XHRcdDJcbitcbitzdHJ1Y3QgcmVhbG1fcGFyYW1zIHtcbitcdHVuaW9uIHsgLyogMHgwICovXG4rXHRcdHN0cnVjdCB7XG4rXHRcdFx0dTY0IGZsYWdzMDtcbitcdFx0XHR1NjQgczJzejtcbitcdFx0XHR1NjQgc3ZlX3ZsO1xuK1x0XHRcdHU2NCBudW1fYnBzO1xuK1x0XHRcdHU2NCBudW1fd3BzO1xuK1x0XHRcdHU2NCBwbXVfbnVtX2N0cnM7XG4rXHRcdFx0dTY0IGhhc2hfYWxnbztcbitcdFx0XHR1NjQgbnVtX2F1eF9wbGFuZXM7XG4rXHRcdH07XG4rXHRcdHU4IHBhZGRpbmcwWzB4NDAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4NDAwICovXG4rXHRcdHN0cnVjdCB7XG4rXHRcdFx0dTggcnB2WzY0XTtcbitcdFx0XHR1NjQgYXRzX3BsYW5lO1xuK1x0XHR9O1xuK1x0XHR1OCBwYWRkaW5nMVsweDQwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDgwMCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHU2NCBwYWRkaW5nO1xuK1x0XHRcdHU2NCBydHRfYmFzZTtcbitcdFx0XHRzNjQgcnR0X2xldmVsX3N0YXJ0O1xuK1x0XHRcdHU2NCBydHRfbnVtX3N0YXJ0O1xuK1x0XHRcdHU2NCBmbGFnczE7XG4rXHRcdFx0dTY0IGF1eF9ydHRfYmFzZVszXTtcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzJbMHg4MDBdO1xuK1x0fTtcbit9O1xuK1xuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWFsbV9wYXJhbXMpID09IFNaXzRLKTtcbitcbisvKlxuKyAqIFRoZSBudW1iZXIgb2YgR1BScyAoc3RhcnRpbmcgZnJvbSBYMCkgdGhhdCBhcmVcbisgKiBjb25maWd1cmVkIGJ5IHRoZSBob3N0IHdoZW4gYSBSRUMgaXMgY3JlYXRlZC5cbisgKi9cbisjZGVmaW5lIFJFQ19DUkVBVEVfTlJfR1BSU1x0XHQ4XG4rXG4rI2RlZmluZSBSRUNfUEFSQU1TX0ZMQUdfUlVOTkFCTEVcdEJJVF9VTEwoMClcbitcbitzdHJ1Y3QgcmVjX3BhcmFtcyB7XG4rXHR1bmlvbiB7IC8qIDB4MCAqL1xuK1x0XHR1NjQgZmxhZ3M7XG4rXHRcdHU4IHBhZGRpbmcwWzB4MTAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4MTAwICovXG4rXHRcdHU2NCBtcGlkcjtcbitcdFx0dTggcGFkZGluZzFbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHgyMDAgKi9cbitcdFx0dTY0IHBjO1xuK1x0XHR1OCBwYWRkaW5nMlsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDMwMCAqL1xuK1x0XHR1NjQgZ3Byc1tSRUNfQ1JFQVRFX05SX0dQUlNdO1xuK1x0XHR1OCBwYWRkaW5nM1sweGQwMF07XG4rXHR9O1xuK307XG4rXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19wYXJhbXMpID09IFNaXzRLKTtcbitcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0VNVUxBVEVEX01NSU9cdEJJVCgwKVxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfSU5KRUNUX1NFQVx0QklUKDEpXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGSVx0XHRCSVQoMilcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1RSQVBfV0ZFXHRcdEJJVCgzKVxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfUklQQVNfUkVTUE9OU0VcdEJJVCg0KVxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfUzJBUF9SRVNQT05TRVx0QklUKDUpXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19ERVZfTUVNX1JFU1BPTlNFXHRCSVQoNilcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0ZPUkNFX1AwXHRcdEJJVCg3KVxuK1xuKyNkZWZpbmUgUkVDX1JVTl9HUFJTXHRcdFx0MzFcbisjZGVmaW5lIFJFQ19NQVhfR0lDX05VTV9MUlNcdFx0MTZcbitcbisjZGVmaW5lIFJNSV9QRVJNSVRURURfR0lDVjNfSENSX0JJVFNcdChJQ0hfSENSX0VMMl9VSUUgfFx0XHRcXFxuK1x0XHRcdFx0XHQgSUNIX0hDUl9FTDJfTFJFTlBJRSB8XHRcdFxcXG4rXHRcdFx0XHRcdCBJQ0hfSENSX0VMMl9OUElFIHxcdFx0XFxcbitcdFx0XHRcdFx0IElDSF9IQ1JfRUwyX1ZHcnAwRUlFIHxcdFx0XFxcbitcdFx0XHRcdFx0IElDSF9IQ1JfRUwyX1ZHcnAwRElFIHxcdFx0XFxcbitcdFx0XHRcdFx0IElDSF9IQ1JfRUwyX1ZHcnAxRUlFIHxcdFx0XFxcbitcdFx0XHRcdFx0IElDSF9IQ1JfRUwyX1ZHcnAxRElFIHxcdFx0XFxcbitcdFx0XHRcdFx0IElDSF9IQ1JfRUwyX1RESVIpXG4rXG4rc3RydWN0IHJlY19lbnRlciB7XG4rXHR1bmlvbiB7IC8qIDB4MDAwICovXG4rXHRcdHU2NCBmbGFncztcbitcdFx0dTggcGFkZGluZzBbMHgyMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHgyMDAgKi9cbitcdFx0dTY0IGdwcnNbUkVDX1JVTl9HUFJTXTtcbitcdFx0dTggcGFkZGluZzFbMHgxMDBdO1xuK1x0fTtcbitcdHU4IHBhZGRpbmczWzB4NTAwXTtcbit9O1xuK1xuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfZW50ZXIpID09IFNaXzJLKTtcbitcbisjZGVmaW5lIFJNSV9FWElUX1NZTkNcdFx0XHQweDAwXG4rI2RlZmluZSBSTUlfRVhJVF9JUlFcdFx0XHQweDAxXG4rI2RlZmluZSBSTUlfRVhJVF9GSVFcdFx0XHQweDAyXG4rI2RlZmluZSBSTUlfRVhJVF9QU0NJXHRcdFx0MHgwM1xuKyNkZWZpbmUgUk1JX0VYSVRfUklQQVNfQ0hBTkdFXHRcdDB4MDRcbisjZGVmaW5lIFJNSV9FWElUX0hPU1RfQ0FMTFx0XHQweDA1XG4rI2RlZmluZSBSTUlfRVhJVF9TRVJST1JcdFx0XHQweDA2XG4rI2RlZmluZSBSTUlfRVhJVF9TMkFQX0NIQU5HRVx0XHQweDA3XG4rI2RlZmluZSBSTUlfRVhJVF9WREVWX1ZBTElEQVRFX01BUFBJTkdcdDB4MDhcbisjZGVmaW5lIFJNSV9FWElUX1ZTTU1VX0NPTU1BTkRcdFx0MHgwYVxuKyNkZWZpbmUgUk1JX0VYSVRfVkRFVl9QMlBfQklORElOR1x0MHgwYlxuK1xuK3N0cnVjdCByZWNfZXhpdCB7XG4rXHR1bmlvbiB7IC8qIDB4MDAwICovXG4rXHRcdHU4IGV4aXRfcmVhc29uO1xuK1x0XHR1OCBwYWRkaW5nMFsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDEwMCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHU2NCBlc3I7XG4rXHRcdFx0dTY0IGZhcjtcbitcdFx0XHR1NjQgaHBmYXI7XG4rXHRcdFx0dTY0IHJ0dF90cmVlO1xuK1x0XHR9O1xuK1x0XHR1OCBwYWRkaW5nMVsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDIwMCAqL1xuK1x0XHR1NjQgZ3Byc1tSRUNfUlVOX0dQUlNdO1xuK1x0XHR1OCBwYWRkaW5nMlsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDMwMCAqL1xuK1x0XHR1OCBwYWRkaW5nM1sweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDQwMCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHU2NCBjbnRwX2N0bDtcbitcdFx0XHR1NjQgY250cF9jdmFsO1xuK1x0XHRcdHU2NCBjbnR2X2N0bDtcbitcdFx0XHR1NjQgY250dl9jdmFsO1xuK1x0XHR9O1xuK1x0XHR1OCBwYWRkaW5nNFsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDUwMCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHU2NCByaXBhc19iYXNlO1xuK1x0XHRcdHU2NCByaXBhc190b3A7XG4rXHRcdFx0dTggcmlwYXNfdmFsdWU7XG4rXHRcdFx0dTggcGFkZGluZzhbMTVdO1xuK1x0XHRcdHU2NCBzMmFwX2Jhc2U7XG4rXHRcdFx0dTY0IHMyYXBfdG9wO1xuK1x0XHRcdHU2NCB2ZGV2X2lkXzE7XG4rXHRcdFx0dTY0IHZkZXZfaWRfMjtcbitcdFx0XHR1NjQgZGV2X21lbV9iYXNlO1xuK1x0XHRcdHU2NCBkZXZfbWVtX3RvcDtcbitcdFx0XHR1NjQgZGV2X21lbV9wYTtcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzVbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHg2MDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1MTYgaW1tO1xuK1x0XHRcdHUxNiBwYWRkaW5nOTtcbitcdFx0XHR1NjQgcGxhbmU7XG4rXHRcdH07XG4rXHRcdHU4IHBhZGRpbmc2WzB4MTAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4NzAwICovXG4rXHRcdHN0cnVjdCB7XG4rXHRcdFx0dTggcG11X292Zl9zdGF0dXM7XG4rXHRcdFx0dTggcGFkZGluZzEwWzE1XTtcbitcdFx0XHR1NjQgdnNtbXU7XG4rXHRcdH07XG4rXHRcdHU4IHBhZGRpbmc3WzB4MTAwXTtcbitcdH07XG4rfTtcbitcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2V4aXQpID09IFNaXzJLKTtcbitcbitzdHJ1Y3QgcmVjX3J1biB7XG4rXHRzdHJ1Y3QgcmVjX2VudGVyIGVudGVyO1xuK1x0c3RydWN0IHJlY19leGl0IGV4aXQ7XG4rfTtcbitcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3J1bikgPT0gU1pfNEspO1xuK1xuKy8qIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHUyBkZWZpbml0aW9ucyAqL1xuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX09BRERSX1RZUEVcdEdFTk1BU0soMSwgMClcbisjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UXHRHRU5NQVNLKDE1LCAyKVxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX01FTUFUVFJcdEdFTk1BU0soMTgsIDE2KVxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX1MyQVBcdFx0R0VOTUFTSygyMiwgMTkpXG4rXG4rLyogUk1JX1JUVF9EQVRBX01BUF9GTEFHUyBkZWZpbml0aW9ucyAqL1xuKyNkZWZpbmUgUk1JX1JUVF9QUk9UX01BUF9GTEFHU19PQUREUl9UWVBFXHRHRU5NQVNLKDEsIDApXG4rI2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX0xJU1RfQ09VTlRcdEdFTk1BU0soMTUsIDIpXG4rXG4rLyogUzJBUCBEaXJlY3QgRW5jb2RpbmdzLCB1c2VkIGluIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQICovXG4rI2RlZmluZSBSTUlfUzJBUF9ESVJFQ1RfV1JJVEVcdFx0XHRCSVQoMClcbisjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9SRUFEXHRcdFx0QklUKDEpXG4rXG4rI2VuZGlmIC8qIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IXyAqL1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMjE6Mjk6NTUuNDA4MjgzODI1WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTIwNjkyOTYzNzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBSZWFjaGFiaWxpdHkgb2YgUk1NL1JNSSBDb2RlIGluIGEgVmlydHVhbGl6ZWQgRW52aXJvbm1lbnQqKlxuXG5Pa2F5LCBzbyB3ZSd2ZSBnb3QgdGhpcyBwYXRjaCBhZGRpbmcgUmVhbG0gTWFuYWdlbWVudCBNb25pdG9yIChSTU0pIHN1cHBvcnQgZm9yIEFSTTY0LiBJdCBzZWVtcyBwcmV0dHkgc2VsZi1jb250YWluZWQsIGFkZGluZyB0aGUgbmVjZXNzYXJ5IGhlYWRlciBmaWxlcyBhbmQgZHJpdmVyIGNvZGU6IGBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmhgLCBgZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWdgLCBgZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlYCwgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuY2AsIGBpbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oYCwgYW5kIGBpbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaGAuICBJdCBpbnRyb2R1Y2VzIGBDT05GSUdfQVJNX1JNTWAsIHdoaWNoIGlzIGdvb2QsIGFuZCBpdOKAmXMgZGVwZW5kZW50IG9uIGBBUkNIX1NVUFBPUlRTX1JNTWAuIEl0IHByb3ZpZGVzIGhvc3Qtc2lkZSBSTUkgc3VwcG9ydCwgd2hpY2ggaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBLVk0gZm9yIHRoaW5ncyBsaWtlIGRldGVjdGluZyBhIGNvbXBhdGlibGUgUk1NLCBjb25maWd1cmluZyBpdCwgbWFuYWdpbmcgZGVsZWdhdGVkIG1lbW9yeSwgYW5kIGVuYWJsaW5nIFJlYWxtIGd1ZXN0cy5cblxuTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGFzc2VzcyBpdHMgcmVhY2hhYmlsaXR5IHdpdGhpbiBhIHZpcnR1YWxpemVkIHNldHRpbmcsIHBhcnRpY3VsYXJseSBRRU1VLiBUaGUgY29kZSBkb2VzIGEgY2hlY2sgZm9yIFJNRSAoUmVhbG0gTWFuYWdlbWVudCBFeHRlbnNpb24pIHN1cHBvcnQgaW4gdGhlIENQVSB1c2luZyB0aGUgYElEX0FBNjRQRlIwX0VMMWAgcmVnaXN0ZXIuIFRoaXMgaXMga2V5LCBhcyBSTUkgaXMgY29udGluZ2VudCBvbiBSTUUuIElmIFJNRSBpc24ndCBwcmVzZW50LCB0aGUgaW5pdGlhbGl6YXRpb24gZmFpbHMuIFFFTVUgZG9lcyBzdXBwb3J0IFJNRSBlbXVsYXRpb24gaW4gaXRzIGB2aXJ0YCBtYWNoaW5lIHR5cGUsIGJ1dCBpdCBuZWVkcyBzcGVjaWZpYyBzZXR1cCB3aGljaCBwcm9iYWJseSBpbmNsdWRlcyBURi1BIGFuZCBSTU0uXG5cblN5emthbGxlciBpcyBhIGNvbmNlcm4sIGFzIGl0IG9mdGVuIHJ1bnMgd2l0aCBkZWZhdWx0IFFFTVUgQ1BVcywgc3VjaCBhcyBgbWF4YCBvciBgY29ydGV4LWE1N2AuIEkgbmVlZCB0byB2ZXJpZnkgd2hldGhlciB0aGUgZGVmYXVsdCBRRU1VIENQVXMgYXJlIGNvbmZpZ3VyZWQgd2l0aCBSTUUgc3VwcG9ydC4gIFRoZSBjb2RlIGl0c2VsZiwgc3BlY2lmaWNhbGx5IGBhcm02NF9pbml0X3JtaWAsIGlzIGEgYHN1YnN5c19pbml0Y2FsbGAuIEl0IGNoZWNrcyBmb3IgdGhlIGBJRF9BQTY0UEZSMF9FTDFfUk1FX1NISUZUYCBiaXQuIElmIFJNRSBpc24ndCBwcmVzZW50LCB0aGUgaW5pdGlhbGl6YXRpb24gd2lsbCByZXR1cm4gYC1FTlhJT2AuIElmIFJNRSBpcyBwcmVzZW50LCBpdCBkb2VzIFNNQyBjYWxscyB0byBSTU0uIElmIFJNTSBpcyBub3QgcHJlc2VudCwgdGhlIFNNQyBjYWxscyByZXR1cm4gYFNNQ0NDX1JFVF9OT1RfU1VQUE9SVEVEYC4gIFNvIGl0J3MgaGFyZHdhcmUtIGFuZCBmaXJtd2FyZS1kZXBlbmRlbnQuIEhvd2V2ZXIsIHN5emthbGxlciBtaWdodCBiZSBhYmxlIHRvIGZ1enogdGhlIFNNQyBjYWxscyBpZiB0aGVyZSdzIGEgd2F5IHRvIG1vY2sgdGhlbS5cblxuVGhlIHByb2JsZW0gc3RhdGVtZW50IG1lbnRpb25zIHVucmVhY2hhYmxlIGNvZGUgcGF0aHMgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsIGV2ZW4gd2l0aCBlbXVsYXRlZCBoYXJkd2FyZS4gU28gdGhlIHF1ZXN0aW9uIGlzOiBpcyBSTUUgc3VwcG9ydGVkIGluIFFFTVU/IFllcywgUUVNVSBoYXMgUk1FIGVtdWxhdGlvbi4gVGhlIHBhdGNoIGl0c2VsZiBqdXN0IGFkZHMgdGhlIFJNSSBsaWJyYXJ5IGZ1bmN0aW9ucyBhbmQgdGhlIGluaXRpYWxpemF0aW9uLiBUaGVyZSBhcmUgbm8gc3lzY2FsbHMgb3IgaW9jdGxzIGV4cG9zZWQgZGlyZWN0bHkgdG8gdXNlci1zcGFjZSBpbiAqdGhpcyogcGF0Y2guIFRoZXNlIGFyZSBleHBvcnRlZCB1c2luZyBgRVhQT1JUX1NZTUJPTF9HUExgIChlLmcuLCBgcm1pX2RlbGVnYXRlX3JhbmdlYCwgYHJtaV91bmRlbGVnYXRlX3JhbmdlYCwgZXRjLikuXG5cblRoZXNlIGZ1bmN0aW9ucyBhcmUgcmVhbGx5IG1lYW50IGZvciBLVk0uIFRoZSBwYXRjaCBkZXNjcmlwdGlvbiBjb25maXJtcyB0aGlzOiBcIlRoaXMgb3B0aW9uIGJ1aWxkcyB0aGUgaG9zdC1zaWRlIFJNSSBzdXBwb3J0IHVzZWQgYnkgS1ZNLi4uXCIuIENydWNpYWxseSwgdGhlICpLVk0qIHN1cHBvcnQgaXRzZWxmIGlzbid0ICppbiogdGhpcyBwYXRjaC4gVGhlIHBhdGNoIG9ubHkgKmFkZHMqIHRoZSBidWlsZGluZyBibG9ja3MgZm9yIEtWTSB0byB1c2UgbGF0ZXIuIFNvIHdpdGhvdXQgS1ZNIHVzaW5nIHRoZW0sIHRoZXNlIGV4cG9ydGVkIGZ1bmN0aW9ucyBhcmUgZGVhZCBjb2RlLiBHaXZlbiB0aGF0IHRoZSBjaGFuZ2VzIGFyZSBBTFJFQURZIGNvbW1pdHRlZCBhcyBIRUFELCBJIHNob3VsZCBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgZm9sbG93LXVwIHBhdGNoIHRoYXQgYWRkcyB0aGUgS1ZNIGNvZGUuIEkgbXVzdCBzZWFyY2ggZm9yIHdoZXJlIEtWTSB1c2VzIHRoZXNlIGZ1bmN0aW9ucyBpbiB0aGUgY3VycmVudCB0cmVlLiBUaGUgcHJvbXB0IHNheXMgdGhlIGNvZGUgaXMgYWxyZWFkeSBpbiBIRUFELCBzbyBsZXQgbWUgc2VhcmNoIGZvciBgcm1pX2RlbGVnYXRlX3JhbmdlYCBvciBgcm1pX3Nyb19leGVjdXRlYCBpbiB0aGUgdHJlZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjU4MjcsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5MDYsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQyMTozMDowNy40Nzc1ODQwNjdaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzQyNjA1NzU5NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJybWlfZGVsZWdhdGVfcmFuZ2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jPTI4PUVYUE9SVF9TWU1CT0xfR1BMKHJtaV9mZWF0X3JlZyk7XFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTI5LVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYzozMDppbnQgcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTMxLVxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsXFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtNTItfVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYzo1MzpFWFBPUlRfU1lNQk9MX0dQTChybWlfZGVsZWdhdGVfcmFuZ2UpO1xcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy01NC1cXG4tLVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYz0xNjY9c3RhdGljIGludCBybWlfc3JvX2RvbmF0ZV9jb250aWcoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyxcXG4tLVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy0yMDgtXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjIwOTpcXHRcXHRpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIHNpemUsIFxcdTAwMjZkZWxlZ2F0ZWRfcGh5cykpIHtcXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtMjEwLVxcdFxcdFxcdGlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSlcXG4tLVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYz0yNDk9c3RhdGljIGludCBybWlfc3JvX2RvbmF0ZV9ub25jb250aWcoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyxcXG4tLVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy0yOTMtXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjI5NDpcXHRcXHRcXHRpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIHVuaXRfc2l6ZV9ieXRlcyxcXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtMjk1LVxcdFxcdFxcdFxcdFxcdCAgICAgICBcXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oPTMwPXVuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaWQpO1xcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmgtMzEtXFxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaDozMjppbnQgcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcXG5pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oLTMzLVxcdFxcdCAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpO1xcbi0tXFxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaD0zNz1zdGF0aWMgaW5saW5lIGludCBybWlfZGVsZWdhdGVfcGFnZShwaHlzX2FkZHJfdCBwaHlzKVxcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmgtMzgte1xcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmg6Mzk6XFx0cmV0dXJuIHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCBQQUdFX1NJWkUsIE5VTEwpO1xcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmgtNDAtfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQyMTozMDoxMC45MDM2NTI4MTFaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMDM3MzA3OTUxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkludmVzdGlnYXRpbmcgUk1JIEZ1bmN0aW9uIFVzYWdlKipcblxuT2theSwgc28gS1ZNIGlzbid0IGFjdGl2ZWx5IHVzaW5nIHRoaXMgcGFydGljdWxhciBmdW5jdGlvbi4gVGhhdCdzIGdvb2QgdG8ga25vdywgYnV0IGRvZXNuJ3QgcnVsZSBvdXQgaXRzIG92ZXJhbGwgc2lnbmlmaWNhbmNlLiBJIHNob3VsZCBicm9hZGVuIHRoZSBzZWFyY2guIEkgbmVlZCB0byBtYWtlIHN1cmUgSSdtIG5vdCBtaXNzaW5nIHNvbWV0aGluZyBzdWJ0bHkgY29ubmVjdGVkLiBMZXQncyBzZWUgaWYgS1ZNIG1pZ2h0IGJlIGluZGlyZWN0bHkgbGV2ZXJhZ2luZyBhbnkgb2YgdGhlc2UgYHJtaV9gIGZ1bmN0aW9ucy4gUGVyaGFwcyBzb21ldGhpbmcgbGlrZSBgcm1pX3JlYWxtX2NyZWF0ZWAgb3IgYSByZWxhdGVkIGZ1bmN0aW9uIGNvdWxkIGJlIHRoZSBrZXkuIEkgbmVlZCB0byBlbnN1cmUgYSBjb21wcmVoZW5zaXZlIG92ZXJ2aWV3IG9mIGhvdyBpdCBpcyB1c2VkLCBvciBub3QgdXNlZC4gSSBuZWVkIHRvIGRvIGEgdGhvcm91Z2ggY2hlY2sgb2YgdGhlIGNvZGUgYmFzZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjgyMTcsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQyMTozMDoxMy45NDA5NjM2NjJaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjUyMTk0OTA0OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJybWlfcmVhbG1fY3JlYXRlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaD0xMzY9c3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX2FjdGl2YXRlKHVuc2lnbmVkIGxvbmcgcmQpXFxuLS1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMTQ1LS8qKlxcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaDoxNDY6ICogcm1pX3JlYWxtX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgcmVhbG1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMTQ3LSAqIEByZDogUEEgb2YgdGhlIFJEXFxuLS1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMTU0LSAqL1xcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaDoxNTU6c3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHBhcmFtcyxcXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMTU2LVxcdFxcdFxcdFxcdCAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDIxOjMwOjE2LjQ2MjkxOTdaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNjAxNDU0NTAxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93biwgZ2l2ZW4gbXkgZXhwZXJ0aXNlOlxuXG4qKktWTSBJbnRlZ3JhdGlvbiBDb25jZXJucyoqXG5cblJpZ2h0LCBzbyBJIHNlZSB0aGlzIHBhdGNoLCBhbmQgaXQgbG9va3MgbGlrZSBpdCdzIGludHJvZHVjaW5nIHRoZSBSZW1vdGUgTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgbGlicmFyeSBhbmQgaXRzIGluaXRpYWxpemF0aW9uLCBidXQgaXQncyBub3QgaW1tZWRpYXRlbHkgY2xlYXIgaG93IEtWTSBpcyBsZXZlcmFnaW5nIGl0IGluIHRoZSBjdXJyZW50IHNvdXJjZSB0cmVlLiBUaGF0J3MgYSBiaXQgb2YgYSByZWQgZmxhZzsgeW91IGRvbid0IHdhbnQgdG8ganVzdCBhZGQgY29kZSB0aGF0J3Mgbm90IGFjdGl2ZWx5IGJlaW5nIHVzZWQsIGl0IGFkZHMgdG8gdGhlIGNvZGViYXNlIGJsb2F0IGFuZCBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzIGlmIGl0J3Mgbm90IGJlaW5nIHVzZWQuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBcIk9rYXksIGlzIHRoaXMgcHJlbWF0dXJlIG9wdGltaXphdGlvbiwgb3IgaXMgdGhlcmUgYSBwbGFuIGluIHBsYWNlP1wiXG5cblRoZSBuZXh0IGxvZ2ljYWwgc3RlcCBpcyB0byBkaXZlIGluIGFuZCBsb29rIGZvciBjYWxsZXJzIG9mIGBybWlfc3JvX2V4ZWN1dGVgLiBUaGF0J3Mgd2hlcmUgSSBuZWVkIHRvIHN0YXJ0IGRpZ2dpbmcgdG8gc2VlICp3aHkqIHRoaXMgaGFzIGJlZW4gYWRkZWQuIEFyZSB0aGVyZSBleGlzdGluZyBtb2R1bGVzLCBkcml2ZXJzLCBvciBoeXBlcnZpc29yIGNvbXBvbmVudHMgYWxyZWFkeSBzbGF0ZWQgdG8gdXNlIGl0IGluIGZ1dHVyZSBjb21taXRzLCBvciBkb2VzIHRoaXMgcGF0Y2ggcmVwcmVzZW50IGFuIHVuaW50ZWdyYXRlZCBwaWVjZSBvZiB0aGUgcHV6emxlIHRoYXQgbmVlZHMgZnVydGhlciBkZXZlbG9wbWVudD8gVW5kZXJzdGFuZGluZyAqd2hlcmUqIHRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkLCBhbmQgaG93IGl0J3MgYmVpbmcgdXNlZCwgaXMgZ29pbmcgdG8gaW5mb3JtIG15IGFzc2Vzc21lbnQgb2YgdGhlIHBhdGNoJ3MgcHVycG9zZSBhbmQgaXRzIHJlYWRpbmVzcy4gTGV0J3Mgc2VlIGlmIHdlIGNhbiBmaW5kIHNvbWUgdXNhZ2UhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI4NjM3LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMjE6MzA6MjAuMDY0Mzc3NjUxWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI5NzE1NjQ4MzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicm1pX3Nyb19leGVjdXRlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaD0yNT1zdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2RhdGFfbWFwX2luaXQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBkYXRhLFxcbi0tXFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTMyLVxcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaDozMzpcXHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMzQtfVxcbi0tXFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTQ3PXN0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGF0YV9tYXAodW5zaWduZWQgbG9uZyByZCxcXG4tLVxcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC01OC1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg6NTk6XFx0cmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtNjAtXFxuLS1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg9ODI9c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9kYXRhX3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsXFxuLS1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtOTUtXFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oOjk2OlxcdHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTk3LVxcbi0tXFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTI2Nz1zdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJ0dCxcXG4tLVxcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC0yNzMtXFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oOjI3NDpcXHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMjc1LX1cXG4tLVxcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaD0yOTE9c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXFxuLS1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMjk5LVxcdH07XFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oOjMwMDpcXHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMzAxLVxcbi0tXFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTMyMj1zdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2ZvbGQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBpcGEsXFxuLS1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMzI3LVxcdH07XFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oOjMyODpcXHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMzI5LVxcbi0tXFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTM0Nz1zdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2luaXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBiYXNlLFxcbi0tXFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTM1Mi1cXHR9O1xcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaDozNTM6XFx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTM1NC1cXG4tLVxcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaD0zNzQ9c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF91bnByb3RfbWFwKHVuc2lnbmVkIGxvbmcgcmQsXFxuLS1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMzgzLVxcdH07XFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oOjM4NDpcXHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMzg1LVxcbi0tXFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTQwNT1zdGF0aWMgaW5saW5lIGludCBybWlfcnR0X3NldF9yaXBhcyh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJlYyxcXG4tLVxcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC00MTEtXFx0fTtcXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg6NDEyOlxcdGludCByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC00MTMtXFxuLS1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg9NDM1PXN0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfdW5wcm90X3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsXFxuLS1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtNDQ2LVxcdH07XFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oOjQ0NzpcXHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtNDQ4LVxcbi0tXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jPTQ3OD1FWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX21lbXhmZXJfZXhlY3V0ZSk7XFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtNDgwLS8qIEZvciBSTUkgY29tbWFuZHMgdGhhdCBhcmUgc3RhdGVmdWwgYnV0IG5vdCBtZW1vcnktdHJhbnNmZXJyaW5nICovXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjQ4MTp1bnNpZ25lZCBsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy00ODIte1xcbi0tXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTUwNy19XFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjUwODpFWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX2V4ZWN1dGUpO1xcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy01MDktXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oPTUwPXZvaWQgcm1pX3Nyb19mcmVlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pO1xcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmg6NTE6dW5zaWduZWQgbG9uZyBybWlfc3JvX2V4ZWN1dGUoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyk7XFxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaC01Mi1cXG4tLVxcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmg9MTY0PXN0YXRpYyBpbmxpbmUgaW50IHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSxcXG4tLVxcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmgtMTcwLVxcdH07XFxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaDoxNzE6XFx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaC0xNzItXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oPTE5MD1zdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSxcXG4tLVxcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmgtMTk2LVxcdH07XFxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaDoxOTc6XFx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaC0xOTgtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDIxOjMwOjIzLjAzNTk1MDU0MloiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjI4MjM2MzgwOTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIHNlZSB3aGF0J3MgZ29pbmcgb24gaGVyZS5cblxuKipLVk0gSW5xdWlyeTogSW5pdGlhbCBDb25mdXNpb24gYW5kIEZvY3VzZWQgSW52ZXN0aWdhdGlvbioqXG5cbkhtbSwgc28gaXQgc2VlbXMgS1ZNIGlzbid0IGFjdGl2ZWx5ICppbiB1c2UqIGp1c3QgeWV0LiBUaGF04oCZcyBhIGJpdCBvZGQuIEJ1dCB3YWl0LCBgYXJtNjRfaW5pdF9ybWlgIGlzIGdldHRpbmcgY2FsbGVkIGR1cmluZyB0aGUgYm9vdCBwcm9jZXNzLiBPa2F5LCB0aGF0IHNwYXJrcyBteSBpbnRlcmVzdC4gVGhpcyBzdWdnZXN0cyBzb21ldGhpbmcgaXMgaGFwcGVuaW5nIHVuZGVyIHRoZSBob29kLiBUaW1lIHRvIGRpZyBpbnRvIGBhcm02NF9pbml0X3JtaWAgYW5kIHVuZGVyc3RhbmQgcHJlY2lzZWx5IHdoYXQgcm9sZSBpdCBwbGF5cy4gTGV0J3Mgc2VlIHdoYXQgd2UgY2FuIGZpbmQuIEknbSBrZWVuIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgaXMgYmVpbmcgaW5pdGlhbGl6ZWQsIGV2ZW4gaWYgS1ZNIGl0c2VsZiBpc24ndCB5ZXQgdmlzaWJseSBhY3RpdmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMwNzAxLCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMjE6MzA6MjUuODU5NTkzMzE2WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTM3MTg3NjU5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImFybTY0X2luaXRfcm1pXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYz02ODc9Ym9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpXFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtNjkxLVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYzo2OTI6c3RhdGljIGludCBfX2luaXQgYXJtNjRfaW5pdF9ybWkodm9pZClcXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtNjkzLXtcXG4tLVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy03MTktLypcXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6NzIwOiAqIE5vdGUgYXJtNjRfaW5pdF9ybWkoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUga3ZtX2luaXRfcm1pKCkgb3RoZXJ3aXNlIEtWTVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy03MjEtICogd2lsbCBub3Qgc3VwcG9ydCByZWFsbSBndWVzdHMuIHN1YnN5c19pbml0Y2FsbCgpIGlzIGNhbGxlZCBiZWZvcmVcXG4tLVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy03MjMtICovXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjcyNDpzdWJzeXNfaW5pdGNhbGwoYXJtNjRfaW5pdF9ybWkpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQyMTozMDoyOC4zOTY4MjI4NzVaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTA5OTkyMjM3MDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqUk1JIEluaXRpYWxpemF0aW9uIGFuZCBSZWFjaGFiaWxpdHkgQW5hbHlzaXMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGBhcm02NF9pbml0X3JtaWAgZnVuY3Rpb24sIGFuZCBpdCdzIHByZXR0eSBzdHJhaWdodGZvcndhcmQ6IGl0IGNhbGxzIGEgc2VyaWVzIG9mIGBybWlfKmAgZnVuY3Rpb25zIGZvciBpbml0aWFsaXphdGlvbiBkdXJpbmcgYm9vdC4gU2VlbXMgbGlrZSB0aGlzIGludm9sdmVzIFNlY3VyZSBNb25pdG9yIENhbGwgKFNNQykgaW50ZXJhY3Rpb25zLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgY2FuIHRoaXMgYmUgZnV6emVkPyBTeXprYWxsZXIgaXMgYSBmYW50YXN0aWMgdG9vbCBmb3IgU01DIGZ1enppbmcsIGJ1dCBpdCB1c3VhbGx5IHJlbGllcyBvbiBlaXRoZXIgaW50ZXJjZXB0aW5nIHRoZSBjYWxscyBvciBmdXp6aW5nIGEgaHlwZXJ2aXNvci4gSGVyZSwgTGludXggKmlzKiB0aGUgaG9zdCwgY2FsbGluZyBpbnRvIHRoZSBSTU0gKFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvciksIHdoaWNoIGlzIGZpcm13YXJlLiBTeXprYWxsZXIgZG9lc24ndCB0eXBpY2FsbHkgdGFyZ2V0IGZpcm13YXJlIGRpcmVjdGx5IHVubGVzcyB0aGVyZSdzIGEgbW9jayBkcml2ZXIgaW4gcGxhY2UuXG5cbkhvd2V2ZXIsIEkgcmVhbGl6ZSB0aGlzIGlzIGVhcmx5IGJvb3QgY29kZS4gSWYgS1ZNIGlzbid0IHVzaW5nIGl0IHlldCAod2hpY2ggSSBzdXNwZWN0IGl0IGlzbid0LCBnaXZlbiB0aGlzIGlzIGEgbmV3IHBhdGNoKSwgdGhlICpvbmx5KiBwbGFjZSB0aGlzIGNvZGUgY2FuIGJlIHJlYWNoZWQgaXMgdGhlIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlLiBBIHF1aWNrIGNoZWNrIG9mIHRoZSBjb2RlIGNvbmZpcm1zIHRoaXM6IGlmIFJNRSBpc24ndCBzdXBwb3J0ZWQsIGl0IHJldHVybnMgYC1FTlhJT2AuIE9uIGEgc3RhbmRhcmQgc3l6a2FsbGVyIFZNLCB0aGlzIGlzIHRoZSBleHBlY3RlZCBvdXRjb21lLCBzaW5jZSBSTUUgaXMgbm90IGVuYWJsZWQgaW4gdGhlIGRlZmF1bHQgUUVNVSBzZXR1cC5cblxuU28gdGhlIHF1ZXN0aW9uIGlzLCBjYW4gd2UgYWN0dWFsbHkgKnJlYWNoKiB0aGUgcmVzdCBvZiB0aGUgY29kZT8gSXQgaGluZ2VzIG9uIHRoZSBDUFUgc3VwcG9ydGluZyBSTUUuIFN5emthbGxlciB1c3VhbGx5IHJ1bnMgd2l0aCBgcWVtdS1zeXN0ZW0tYWFyY2g2NCAtbWFjaGluZSB2aXJ0IC1jcHUgbWF4YC4gRG9lcyBgLWNwdSBtYXhgIGV2ZW4gKmhhdmUqIFJNRSBlbmFibGVkPyBJdCBsb29rcyBsaWtlIG5vLCBpdCByZXF1aXJlcyBgLW1hY2hpbmUgdmlydCx4LXJtZT1vbmAgYW5kIGFwcHJvcHJpYXRlIGZpcm13YXJlIChURi1BIGFuZCBSTU0pLiBXaXRob3V0IHRoZSBmaXJtd2FyZSwgdGhlIFNNQyBjYWxscyB3aWxsIGp1c3QgcmV0dXJuIGBTTUNDQ19SRVRfTk9UX1NVUFBPUlRFRGAuXG5cbkV2ZW4gaWYgS1ZNICp3YXMqIHVzaW5nIGl0LCBLVk0gd291bGQgb25seSB1c2UgaXQgaWYgS1ZNIGl0c2VsZiB3YXMgY29uZmlndXJlZCB0byBzdXBwb3J0IFJlYWxtcywgd2hpY2ggdGhpcyBwYXRjaCBpcyBub3QgZG9pbmcuIExvb2tpbmcgYXQgdGhlIGNvZGUgY29uZmlybXMgdGhpcyBpcyBqdXN0IGluaXRpYWxpemF0aW9uLCBhbmQgd2lsbCBsaWtlbHkgZXhpdCBpbW1lZGlhdGVseS5cblxuVGhlIHBhdGNoIEknbSBsb29raW5nIGF0ICphZGRzKiBhIGxpYnJhcnkgZm9yIEtWTSB0byB1c2UsIGFuZCBhIGluaXRjYWxsIHRoYXQgS1ZNIGRlcGVuZHMgb24uIEl0IGxvb2tzIGxpa2UgaXQncyBidWlsZGluZyBpbmZyYXN0cnVjdHVyZSwgbm90IGNvbnN1bWluZyBpdCB5ZXQuXG5cblNvLCB0aGUgb25seSBjb2RlIHRoYXQncyByZWFjaGFibGUgaXMgYGFybTY0X2luaXRfcm1pYCwgYW5kICp0aGF0KiBpbW1lZGlhdGVseSBiYWlscyBvdXQuIFRoaXMgc2VlbXMgdG8gYWxpZ24gd2l0aCB0aGUgcHJvbXB0J3MgaW5zdHJ1Y3Rpb246IFwiUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWlucyBjb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmVcIi5cblxuQnV0IHdhaXTigKYgaXMgaXQgKmltcG9zc2libGUqPyBJZiB3ZSBwYXNzIGAtbWFjaGluZSB2aXJ0LHgtcm1lPW9uYCB0byBRRU1VLCBjb3VsZCBLVk0gKm9yKiBLVk0gdW5pdCB0ZXN0cyByZWFjaCBpdD8gQnV0IHRoaXMgcGF0Y2ggZG9lc24ndCBhZGQgS1ZNIHN1cHBvcnQ7IGl0IGFkZHMgdGhlIGJ1aWxkaW5nIGJsb2Nrcy5cblxuTGV0IG1lIGRvdWJsZS1jaGVjay4gSSd2ZSBhbHJlYWR5IGdyZXBwZWQgZm9yIGBybWlfZGVsZWdhdGVfcmFuZ2VgIGFuZCBgcm1pX3Nyb19leGVjdXRlYCBhbmQgZm91bmQgbm8gY2FsbGVycyBvdXRzaWRlIHRoZSBuZXdseSBhZGRlZCBmaWxlcy4gTGV0J3MgbWFrZSBhYnNvbHV0ZWx5IHN1cmUgYW5kIGRvdWJsZSBjaGVjayBgZnJlZV9kZWxlZ2F0ZWRfcGFnZWAgdG8gYmUgZXh0cmEgc3VyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MzExNzYsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4MzAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMjE6MzA6MzkuMzk2MDQ5ODM0WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMzAwMDM3NDIzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImZyZWVfZGVsZWdhdGVkX3BhZ2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jPTEyOT1zdGF0aWMgdm9pZCBybWlfb3BfbWVtX3JlY2xhaW0odW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxcbi0tXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTE0MC1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6MTQxOmludCBmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMpXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTE0Mi17XFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtMTUxLX1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6MTUyOkVYUE9SVF9TWU1CT0xfR1BMKGZyZWVfZGVsZWdhdGVkX3BhZ2UpO1xcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy0xNTMtXFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM9MTY2PXN0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtMjM5LVxcdFxcdFxcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRClcXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6MjQwOlxcdFxcdFxcdFxcdGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyArIGkpO1xcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy0yNDEtXFx0XFx0XFx0ZWxzZVxcbi0tXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jPTI0OT1zdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxcbi0tXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTM0Ni1cXHRcXHRcXHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjM0NzpcXHRcXHRcXHRcXHRmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXMgKyBpKTtcXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtMzQ4LVxcdFxcdFxcdGVsc2VcXG4tLVxcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmg9MzQ9aW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7XFxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaDozNTppbnQgZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzX2FkZHJfdCBwaHlzKTtcXG5pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oLTM2LVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQyMTozMDo0MS42OTYwOTI0ODdaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTU1MTY0NDg0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiB0aGUgUk1JIENvZGUgZm9yIEZ1enppbmcgUG90ZW50aWFsKipcblxuT2theSwgc28gSSd2ZSBsb29rZWQgdGhyb3VnaCB0aGUgY29kZSwgc3BlY2lmaWNhbGx5IHRoZSBgZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jYCBmaWxlLiBUaGUgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIGNsZWFyOiB0aGVyZSBhcmUgbm8gZW50cnkgcG9pbnRzIGZvciBleHRlcm5hbCBjYWxsZXJzIG91dHNpZGUgb2YgdGhpcyBzcGVjaWZpYyBmaWxlLiBUaGlzIGltbWVkaWF0ZWx5IHN1Z2dlc3RzIHRoYXQgS1ZNIHN1cHBvcnQsIHdoaWNoIGlzIHdoYXQgSSdtIHByaW1hcmlseSBpbnRlcmVzdGVkIGluLCBpcyAqbm90KiBwcmVzZW50IGhlcmUuXG5cbk15IGZvY3VzIG5hcnJvd3MgdG8gdGhlIGBhcm02NF9pbml0X3JtaSgpYCBmdW5jdGlvbi4gSXQncyB0aGUgb25seSBjb2RlIHRoYXQgYXBwZWFycyB0byBleGVjdXRlLiBMZXQncyBzZWUgaWYgdGhpcyBpcyBmdXp6YWJsZS4gSXQncyBjYWxsZWQgb25jZSBhdCBib290LiBJdCBjaGVja3MgaWYgUk1FIGlzIHN1cHBvcnRlZCBieSByZWFkaW5nIGEgQ1BVIHJlZ2lzdGVyLCBhbmQgaWYgbm90IGl0IHJldHVybnMgYW4gZXJyb3IuIElmIFJNRSBpcyBzdXBwb3J0ZWQsIGl0IGNhbGxzIGBTTUNfUk1JX1ZFUlNJT05gLiBJZiB0aGF0IGFsc28gZmFpbHMsIGl0IGdpdmVzIGFuIGVycm9yLiBJZiB0aGF0IHN1Y2NlZWRzIGl0IHJlYWRzIGZlYXR1cmVzLCBjb25maWd1cmVzIFJNTSwgYW5kIGluaXRpYWxpemVzIG1ldGFkYXRhLlxuXG5UaGUgY2hhbGxlbmdlIGhlcmUgaXMgb2J2aW91czogaXQncyBhICpvbmUtdGltZSogYm9vdCBpbml0aWFsaXphdGlvbi4gSXQgZXhwZWN0cyBzcGVjaWZpYyBoYXJkd2FyZSBhbmQgZmlybXdhcmUg4oCTIFJNTS4gU3RhbmRhcmQgU3l6a2FsbGVyIGVudmlyb25tZW50cywgd2hpY2ggaXMgbXkgcHJpbWFyeSBmdXp6aW5nIHRvb2wsIGRvbid0IHR5cGljYWxseSBoYXZlIHRoaXMuIEkgY2FuJ3QgdHJpZ2dlciB0aGlzIGNvZGUgcmVwZWF0ZWRseSBmcm9tIHVzZXItc3BhY2UsIG5vciBkb2VzIGl0IHNlZW0gdG8gZXhwb3NlIGFueSB1c2VyLXNwYWNlIGludGVyZmFjZSwgbGlrZSBhIHN5c2NhbGwsIGlvY3RsLCBvciBzeXNmcyBlbnRyeS4gU3l6a2FsbGVyIHdvcmtzIGJ5IGV4ZWN1dGluZyBzeXNjYWxscywgc28gdGhpcyBwcmVzZW50cyBhIGZ1bmRhbWVudGFsIHByb2JsZW0uXG5cbldhaXQsIGlzIHRoZXJlICphbnkqIGRldmljZSBleHBvc2VkPyBOb3BlLiBBbGwgSSBzZWUgaXMgYGFybTY0X3JtaV9pc19hdmFpbGFibGUgPSB0cnVlYCBiZWluZyBzZXQsIGFsb25nIHdpdGggc29tZSBzeW1ib2wgZXhwb3J0cy4gVGhpcyBpcyBjb21wbGV0ZWx5IHVzZWxlc3MgZm9yIGZ1enppbmcuIFN5emthbGxlciBjYW4ndCB0b3VjaCBhbnkgb2YgdGhpcy4gS1ZNIHN1cHBvcnQgaXMgbWlzc2luZy5cblxuTGV0J3MgZG91YmxlLWNoZWNrIHRoZSBLY29uZmlnLiBUaGUgcGF0Y2ggYWRkcyBgQ09ORklHX0FSTV9STU1gLCB3aGljaCBkZWZhdWx0cyB0byBcInlcIiBhbmQgZGVwZW5kcyBvbiBgQVJDSF9TVVBQT1JUU19STU1gLlxuXG5TaW5jZSBLVk0gaXMgKm5vdCogcHJlc2VudCwgYW5kIEtWTSBpcyB0aGUgaW50ZW5kZWQgY29uc3VtZXIsIGFuZCBLVk0gaXNuJ3QgdXNpbmcgdGhpcyBsaWJyYXJ5IHlldCwgdGhpcyBpcyBwdXJlbHkgZGVhZCBjb2RlLiBJdCdzIGxpYnJhcnkgZnVuY3Rpb25zIGFuZCBhIGJvb3QtdGltZSBjaGVjayB0aGF0J2xsIGZhaWwgaW4gb3VyIHN0YW5kYXJkIGVudmlyb25tZW50cy4gSXQncyBub3Qgd29ydGggdGhlIGVmZm9ydCB0byBmdXp6IGl0LlxuXG5Pa2F5LCBsZXQncyB2ZXJpZnkgaWYgS1ZNIHVzZXMgdGhpcyB0aHJvdWdoIGEgZGlmZmVyZW50IHJvdXRlLiBXYXMgS1ZNIG1lcmdlZCwgYnV0IHRoaXMgcGF0Y2ggd2FzIG1pc3Npbmc/IE5vcGUsIEtWTSdzIFJNRSBzdXBwb3J0IGlzIGEgbGFyZ2Ugc2VyaWVzLCBhbmQgdGhpcyBpcyBvbmUgb2YgdGhlIGZpcnN0IHBhdGNoZXMuXG5cblRoZXJlZm9yZSwgbXkgY29uY2x1c2lvbiBpcyB0aGF0IHRoZSBjb2RlIGlzIG5vdCB3b3J0aCBmdXp6aW5nLiBJJ2xsIHJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgYmVjYXVzZSBLVk0gc3VwcG9ydCBpcyBub3QgeWV0IHByZXNlbnQuIFRoZSBhZGRlZCBSTUkgbGlicmFyeSBmdW5jdGlvbnMgYXJlIHVucmVhY2hhYmxlIGZyb20gdXNlci1zcGFjZSwgYW5kIHRoZSBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gcmVsaWVzIG9uIHNwZWNpZmljIGZpcm13YXJlIChSTU0pIG5vdCBwcmVzZW50IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzMyMzgsIk91dHB1dFRva2VucyI6MTQyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTcwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDIxOjMwOjUxLjI0Nzc0MjMzWiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjU3ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBob3N0LXNpZGUgUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgbGlicmFyeSBmdW5jdGlvbnMgYW5kIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiBmb3IgS1ZNIHRvIHVzZS4gSG93ZXZlciwgS1ZNIHN1cHBvcnQgZm9yIFJlYWxtcyBpcyBub3QgaW5jbHVkZWQgaW4gdGhpcyBwYXRjaCwgbWFraW5nIHRoZSBleHBvcnRlZCBsaWJyYXJ5IGZ1bmN0aW9ucyB1bnJlYWNoYWJsZSBmcm9tIHVzZXItc3BhY2UuIEZ1cnRoZXJtb3JlLCB0aGUgYm9vdC10aW1lIGluaXRpYWxpemF0aW9uIHJlcXVpcmVzIHNwZWNpZmljIGhhcmR3YXJlL2Zpcm13YXJlIChSTU0pIHN1cHBvcnQgdGhhdCBpcyBub3QgcHJlc2VudCBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMsIGFuZCBpdCB3aWxsIHNpbXBseSBiYWlsIG91dCBlYXJseS4gVGhlcmUgYXJlIG5vIHN5c2NhbGxzLCBpb2N0bHMsIG9yIG90aGVyIHVzZXItc3BhY2UgaW50ZXJmYWNlcyBpbnRyb2R1Y2VkIHRoYXQgc3l6a2FsbGVyIGNvdWxkIGZ1enouXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIGhvc3Qtc2lkZSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBsaWJyYXJ5IGZ1bmN0aW9ucyBhbmQgYm9vdC10aW1lIGluaXRpYWxpemF0aW9uIGZvciBLVk0gdG8gdXNlLiBIb3dldmVyLCBLVk0gc3VwcG9ydCBmb3IgUmVhbG1zIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGlzIHBhdGNoLCBtYWtpbmcgdGhlIGV4cG9ydGVkIGxpYnJhcnkgZnVuY3Rpb25zIHVucmVhY2hhYmxlIGZyb20gdXNlci1zcGFjZS4gRnVydGhlcm1vcmUsIHRoZSBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gcmVxdWlyZXMgc3BlY2lmaWMgaGFyZHdhcmUvZmlybXdhcmUgKFJNTSkgc3VwcG9ydCB0aGF0IGlzIG5vdCBwcmVzZW50IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgYW5kIGl0IHdpbGwgc2ltcGx5IGJhaWwgb3V0IGVhcmx5LiBUaGVyZSBhcmUgbm8gc3lzY2FsbHMsIGlvY3Rscywgb3Igb3RoZXIgdXNlci1zcGFjZSBpbnRlcmZhY2VzIGludHJvZHVjZWQgdGhhdCBzeXprYWxsZXIgY291bGQgZnV6ei5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },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-workflowrtdc2[0].run-triage(0) Phase: Succeeded StartedAt: 2026-07-15 21:15:08 +0000 UTC FinishedAt: 2026-07-15 21:30:53 +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+CgkJCTx0ZD4yMDI2LzA3LzE1IDIxOjI5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgaG9zdC1zaWRlIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIGxpYnJhcnkgZnVuY3Rpb25zIGFuZCBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gZm9yIEtWTSB0byB1c2UuIEhvd2V2ZXIsIEtWTSBzdXBwb3J0IGZvciBSZWFsbXMgaXMgbm90IGluY2x1ZGVkIGluIHRoaXMgcGF0Y2gsIG1ha2luZyB0aGUgZXhwb3J0ZWQgbGlicmFyeSBmdW5jdGlvbnMgdW5yZWFjaGFibGUgZnJvbSB1c2VyLXNwYWNlLiBGdXJ0aGVybW9yZSwgdGhlIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiByZXF1aXJlcyBzcGVjaWZpYyBoYXJkd2FyZS9maXJtd2FyZSAoUk1NKSBzdXBwb3J0IHRoYXQgaXMgbm90IHByZXNlbnQgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLCBhbmQgaXQgd2lsbCBzaW1wbHkgYmFpbCBvdXQgZWFybHkuIFRoZXJlIGFyZSBubyBzeXNjYWxscywgaW9jdGxzLCBvciBvdGhlciB1c2VyLXNwYWNlIGludGVyZmFjZXMgaW50cm9kdWNlZCB0aGF0IHN5emthbGxlciBjb3VsZCBmdXp6LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAyMToyOTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDljYTM0NzQ0NWM2Y2FjYzliYTBjODA4MTE2ZmJjZDhkYzA3OTAxMTlcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIEp1bCAxNSAyMToyOTo1MiAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L0tjb25maWcgYi9hcmNoL2FybTY0L0tjb25maWdcbmluZGV4IGIzYWZlMDY4ODkxOWJkLi4wZjE5NTZlZGYxMzA3YiAxMDA2NDRcbi0tLSBhL2FyY2gvYXJtNjQvS2NvbmZpZ1xuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9LY29uZmlnXG5AQCAtMzgsNiAmIzQzOzM4LDcgQEAgY29uZmlnIEFSTTY0XG4gXHRzZWxlY3QgQVJDSF9IQVNfTUVNQkFSUklFUl9TWU5DX0NPUkVcbiBcdHNlbGVjdCBBUkNIX0hBU19NRU1fRU5DUllQVFxuIFx0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNFQUxfU1lTVEVNX01BUFBJTkdTXG4mIzQzO1x0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfUk1NXG4gXHRzZWxlY3QgQVJDSF9IQVNfTk1JX1NBRkVfVEhJU19DUFVfT1BTXG4gXHRzZWxlY3QgQVJDSF9IQVNfTk9OX09WRVJMQVBQSU5HX0FERFJFU1NfU1BBQ0VcbiBcdHNlbGVjdCBBUkNIX0hBU19OT05MRUFGX1BNRF9ZT1VORyBpZiBBUk02NF9IQUZUXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLmYxM2VjZGI0MGRlZDQxXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmhcbkBAIC0wLDAgJiM0MzsxLDQ1OSBAQFxuJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xuJiM0MzsvKlxuJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLlxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgX19BU01fUk1JX0NNRFNfSFxuJiM0MzsjZGVmaW5lIF9fQVNNX1JNSV9DTURTX0hcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2FybS1ybWktY21kcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2FybS1zbWNjYy1ybWkuaFx1MDAzZVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ydHRfZGF0YV9tYXBfaW5pdCgpIC0gQ3JlYXRlIGEgcHJvdGVjdGVkIG1hcHBpbmcgd2l0aCBkYXRhIGNvbnRlbnRzXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqIEBkYXRhOiBQQSBvZiB0aGUgdGFyZ2V0IGdyYW51bGVcbiYjNDM7ICogQGlwYTogSVBBIGF0IHdoaWNoIHRoZSBncmFudWxlIHdpbGwgYmUgbWFwcGVkIGluIHRoZSBndWVzdFxuJiM0MzsgKiBAc3JjOiBQQSBvZiB0aGUgc291cmNlIGdyYW51bGVcbiYjNDM7ICogQGZsYWdzOiBSTUlfTUVBU1VSRV9DT05URU5UIGlmIHRoZSBjb250ZW50cyBzaG91bGQgYmUgbWVhc3VyZWRcbiYjNDM7ICpcbiYjNDM7ICogQ3JlYXRlIGEgbWFwcGluZyBmcm9tIFByb3RlY3RlZCBJUEEgc3BhY2UgdG8gY29udmVudGlvbmFsIG1lbW9yeSwgY29weWluZ1xuJiM0MzsgKiBjb250ZW50cyBmcm9tIGEgTm9uLXNlY3VyZSBHcmFudWxlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2RhdGFfbWFwX2luaXQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBkYXRhLFxuJiM0MztcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBpcGEsIHVuc2lnbmVkIGxvbmcgc3JjLFxuJiM0MztcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBmbGFncylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVQsIHJkLCBkYXRhLCBpcGEsIHNyYywgZmxhZ3NcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9kYXRhX21hcCgpIC0gQ3JlYXRlIG1hcHBpbmdzIGluIHByb3RlY3RlZCBJUEEgd2l0aCB1bmtub3duIGNvbnRlbnRzXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4mIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuJiM0MzsgKiBAZmxhZ3M6IEZsYWdzXG4mIzQzOyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbiYjNDM7ICogQG91dF90b3A6IFRvcCBhZGRyZXNzIG9mIHJhbmdlIHdoaWNoIHdhcyBwcm9jZXNzZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGF0YV9tYXAodW5zaWduZWQgbG9uZyByZCxcbiYjNDM7XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyB0b3AsXG4mIzQzO1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBmbGFncyxcbiYjNDM7XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuJiM0MztcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9EQVRBX01BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4mIzQzO1x0fTtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChvdXRfdG9wKVxuJiM0MztcdFx0Km91dF90b3AgPSByZWdzLmExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9kYXRhX3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3MgdG8gY29udmVudGlvbmFsIG1lbW9yeVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCBSZWFsbVxuJiM0MzsgKiBAYmFzZTogQmFzZSBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcbiYjNDM7ICogQGZsYWdzOiBGbGFnc1xuJiM0MzsgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXG4mIzQzOyAqIEBvdXRfdG9wOiBSZXR1cm5zIHRvcCBJUEEgb2YgcmFuZ2Ugd2hpY2ggaGFzIGJlZW4gdW5tYXBwZWRcbiYjNDM7ICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2VcbiYjNDM7ICogQG91dF9jb3VudDogTnVtYmVyIG9mIGVudHJpZXMgaW4gb3V0cHV0IGFkZHJlc3MgbGlzdFxuJiM0MzsgKlxuJiM0MzsgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIGNvbnZlbnRpb24gbWVtb3J5IHdpdGggYSB0YXJnZXQgUHJvdGVjdGVkIElQQSByYW5nZS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGF0YV91bm1hcCh1bnNpZ25lZCBsb25nIHJkLFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4mIzQzO1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcbiYjNDM7XHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3AsXG4mIzQzO1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nICpvdXRfcmFuZ2UsXG4mIzQzO1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nICpvdXRfY291bnQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9EQVRBX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcbiYjNDM7XHR9O1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKG91dF90b3ApXG4mIzQzO1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4mIzQzO1x0aWYgKG91dF9yYW5nZSlcbiYjNDM7XHRcdCpvdXRfcmFuZ2UgPSByZWdzLmEyO1xuJiM0MztcdGlmIChvdXRfY291bnQpXG4mIzQzO1x0XHQqb3V0X2NvdW50ID0gcmVncy5hMztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9wc2NpX2NvbXBsZXRlKCkgLSBDb21wbGV0ZSBwZW5kaW5nIFBTQ0kgY29tbWFuZFxuJiM0MzsgKiBAY2FsbGluZ19yZWM6IFBBIG9mIHRoZSBjYWxsaW5nIFJFQ1xuJiM0MzsgKiBAc3RhdHVzOiBTdGF0dXMgb2YgdGhlIFBTQ0kgcmVxdWVzdFxuJiM0MzsgKlxuJiM0MzsgKiBDb21wbGV0ZXMgYSBwZW5kaW5nIFBTQ0kgY29tbWFuZC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9wc2NpX2NvbXBsZXRlKHVuc2lnbmVkIGxvbmcgY2FsbGluZ19yZWMsXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgc3RhdHVzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xuJiM0MztcbiYjNDM7XHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1BTQ0lfQ09NUExFVEUsIGNhbGxpbmdfcmVjLCBzdGF0dXMsIFx1MDAyNnJlcyk7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXMuYTA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcmVhbG1fYWN0aXZhdGUoKSAtIEFjdGl2ZSBhIHJlYWxtXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqXG4mIzQzOyAqIE1hcmsgYSByZWFsbSBhcyBBY3RpdmUgc2lnbmFsbGluZyB0aGF0IGNyZWF0aW9uIGlzIGNvbXBsZXRlIGFuZCBhbGxvd2luZ1xuJiM0MzsgKiBleGVjdXRpb24gb2YgdGhlIHJlYWxtLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX2FjdGl2YXRlKHVuc2lnbmVkIGxvbmcgcmQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XG4mIzQzO1xuJiM0MztcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUkVBTE1fQUNUSVZBVEUsIHJkLCBcdTAwMjZyZXMpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmVzLmEwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3JlYWxtX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgcmVhbG1cbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHBhcmFtczogUEEgb2YgcmVhbG0gcGFyYW1ldGVyc1xuJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuJiM0MzsgKlxuJiM0MzsgKiBDcmVhdGUgYSBuZXcgcmVhbG0gdXNpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcmVhbG1fY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcGFyYW1zLFxuJiM0MztcdFx0XHRcdCAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXG4mIzQzO1x0XHRcdFx0ICAgU01DX1JNSV9SRUFMTV9DUkVBVEUsIHJkLCBwYXJhbXMpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3JlYWxtX3Rlcm1pbmF0ZSgpIC0gVGVybWluYXRlIGEgcmVhbG1cbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbiYjNDM7ICpcbiYjNDM7ICogVGVybWluYXRlcyBhIHJlYWxtLCBtb3ZpbmcgaXQgaW50byBhIFpPTUJJRSBzdGF0ZVxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX3Rlcm1pbmF0ZSh1bnNpZ25lZCBsb25nIHJkLFxuJiM0MztcdFx0XHRcdCAgICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXG4mIzQzO1x0XHRcdFx0ICAgU01DX1JNSV9SRUFMTV9URVJNSU5BVEUsIHJkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9yZWFsbV9kZXN0cm95KCkgLSBEZXN0cm95IGEgcmVhbG1cbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbiYjNDM7ICpcbiYjNDM7ICogRGVzdHJveXMgYSByZWFsbSwgYWxsIG9iamVjdHMgYmVsb25naW5nIHRvIHRoZSByZWFsbSBtdXN0IGJlIGRlc3Ryb3llZCBmaXJzdC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9yZWFsbV9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0ICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXG4mIzQzO1x0XHRcdFx0ICAgU01DX1JNSV9SRUFMTV9ERVNUUk9ZLCByZCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcmVjX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgUkVDXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXG4mIzQzOyAqIEBwYXJhbXM6IFBBIG9mIFJFQyBwYXJhbWV0ZXJzXG4mIzQzOyAqIEBzcm86IEFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXG4mIzQzOyAqXG4mIzQzOyAqIENyZWF0ZSBhIFJFQyB1c2luZyB0aGUgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdCByZWNfcGFyYW1zIHBvaW50ZWRcbiYjNDM7ICogdG8gYnkgQHBhcmFtcy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9yZWNfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgcmVjLFxuJiM0MztcdFx0XHRcdCB1bnNpZ25lZCBsb25nIHBhcmFtcyxcbiYjNDM7XHRcdFx0XHQgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdCpzcm8gPSAoc3RydWN0IHJtaV9zcm9fc3RhdGUpey5yZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9SRUNfQ1JFQVRFLCByZCwgcmVjLCBwYXJhbXNcbiYjNDM7XHR9fTtcbiYjNDM7XHRyZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzcm8sIEdGUF9LRVJORUwpO1xuJiM0MztcdHJtaV9zcm9fZnJlZShzcm8pO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3JlY19kZXN0cm95KCkgLSBEZXN0cm95IGEgUkVDXG4mIzQzOyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXG4mIzQzOyAqIEBzcm86IEFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXG4mIzQzOyAqXG4mIzQzOyAqIERlc3Ryb3lzIGEgUkVDLiBUaGUgUkVDIG11c3Qgbm90IGJlIHJ1bm5pbmcuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcmVjX2Rlc3Ryb3kodW5zaWduZWQgbG9uZyByZWMsXG4mIzQzO1x0XHRcdFx0ICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JFQ19ERVNUUk9ZLCByZWMpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3JlY19lbnRlcigpIC0gRW50ZXIgYSBSRUNcbiYjNDM7ICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUNcbiYjNDM7ICogQHJ1bl9wdHI6IFBBIG9mIFJlY1J1biBzdHJ1Y3R1cmVcbiYjNDM7ICpcbiYjNDM7ICogU3RhcnRzIChvciBjb250aW51ZXMpIGV4ZWN1dGlvbiB3aXRoaW4gYSBSRUMuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcmVjX2VudGVyKHVuc2lnbmVkIGxvbmcgcmVjLCB1bnNpZ25lZCBsb25nIHJ1bl9wdHIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XG4mIzQzO1xuJiM0MztcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUkVDX0VOVEVSLCByZWMsIHJ1bl9wdHIsIFx1MDAyNnJlcyk7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXMuYTA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X2NyZWF0ZSgpIC0gQ3JlYXRlcyBhbiBSVFRcbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHJ0dDogUEEgb2YgdGhlIHRhcmdldCBSVFRcbiYjNDM7ICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUXG4mIzQzOyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWVcbiYjNDM7ICpcbiYjNDM7ICogQ3JlYXRlcyBhbiBSVFQgKFJlYWxtIFRyYW5zbGF0aW9uIFRhYmxlKSBhdCB0aGUgc3BlY2lmaWVkIGxldmVsIGZvciB0aGVcbiYjNDM7ICogdHJhbnNsYXRpb24gb2YgdGhlIHNwZWNpZmllZCBhZGRyZXNzIHdpdGhpbiB0aGUgcmVhbG0uXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJ0dCxcbiYjNDM7XHRcdFx0XHQgdW5zaWduZWQgbG9uZyBpcGEsIGxvbmcgbGV2ZWwpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9DUkVBVEUsIHJkLCBydHQsIGlwYSwgbGV2ZWxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9kZXN0cm95KCkgLSBEZXN0cm95IGFuIFJUVFxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCByZWFsbVxuJiM0MzsgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcbiYjNDM7ICogQGxldmVsOiBSVFQgbGV2ZWxcbiYjNDM7ICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZFxuJiM0MzsgKiBAb3V0X3RvcDogUG9pbnRlciB0byB3cml0ZSB0aGUgdG9wIElQQSBvZiBub24tbGl2ZSBSVFQgZW50cmllcywgZnJvbSBlbnRyeVxuJiM0MzsgKiBhdCB3aGljaCB0aGUgUlRUIHdhbGsgdGVybWluYXRlZC5cbiYjNDM7ICpcbiYjNDM7ICogRGVzdHJveXMgYW4gUlRULiBUaGUgUlRUIG11c3QgYmUgbm9uLWxpdmUsIGkuZS4gbm9uZSBvZiB0aGUgZW50cmllcyBpbiB0aGVcbiYjNDM7ICogdGFibGUgYXJlIGluIEFTU0lHTkVEIG9yIFRBQkxFIHN0YXRlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLFxuJiM0MztcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyBpcGEsXG4mIzQzO1x0XHRcdFx0ICBsb25nIGxldmVsLFxuJiM0MztcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyAqb3V0X3J0dCxcbiYjNDM7XHRcdFx0XHQgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9ERVNUUk9ZLCByZCwgaXBhLCBsZXZlbFxuJiM0MztcdH07XG4mIzQzO1x0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKG91dF9ydHQpXG4mIzQzO1x0XHQqb3V0X3J0dCA9IHJlZ3MuYTE7XG4mIzQzO1x0aWYgKG91dF90b3ApXG4mIzQzO1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTI7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X2ZvbGQoKSAtIEZvbGQgYW4gUlRUXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVFxuJiM0MzsgKiBAbGV2ZWw6IERlcHRoIG9mIHRoZSBSVFQgd2l0aGluIHRoZSB0cmVlXG4mIzQzOyAqIEBvdXRfcnR0OiBQb2ludGVyIHRvIHdyaXRlIHRoZSBQQSBvZiB0aGUgUlRUIHdoaWNoIHdhcyBkZXN0cm95ZWRcbiYjNDM7ICpcbiYjNDM7ICogRm9sZHMgYW4gUlRULiBJZiBhbGwgZW50cmllcyB3aXRoIHRoZSBSVFQgYXJlICYjMzk7aG9tb2dlbmVvdXMmIzM5OyB0aGUgUlRUIGNhbiBiZVxuJiM0MzsgKiBmb2xkZWQgaW50byB0aGUgcGFyZW50IGFuZCB0aGUgUlRUIGRlc3Ryb3llZC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZm9sZCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGlwYSxcbiYjNDM7XHRcdFx0ICAgICAgIGxvbmcgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgKm91dF9ydHQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9GT0xELCByZCwgaXBhLCBsZXZlbFxuJiM0MztcdH07XG4mIzQzO1x0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKG91dF9ydHQpXG4mIzQzO1x0XHQqb3V0X3J0dCA9IHJlZ3MuYTE7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X2luaXRfcmlwYXMoKSAtIFNldCBSSVBBUyBmb3IgbmV3IHJlYWxtXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRhcmdldCBJUEEgcmVnaW9uXG4mIzQzOyAqIEB0b3A6IFRvcCBvZiB0YXJnZXQgSVBBIHJlZ2lvblxuJiM0MzsgKiBAb3V0X3RvcDogVG9wIElQQSBvZiByYW5nZSB3aG9zZSBSSVBBUyB3YXMgbW9kaWZpZWRcbiYjNDM7ICpcbiYjNDM7ICogU2V0cyB0aGUgUklQQVMgb2YgYSB0YXJnZXQgSVBBIHJhbmdlIHRvIFJBTSwgZm9yIGEgcmVhbG0gaW4gdGhlIE5FVyBzdGF0ZS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfaW5pdF9yaXBhcyh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIHRvcCwgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX0lOSVRfUklQQVMsIHJkLCBiYXNlLCB0b3BcbiYjNDM7XHR9O1xuJiM0MztcdGludCByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChvdXRfdG9wKVxuJiM0MztcdFx0Km91dF90b3AgPSByZWdzLmExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF91bnByb3RfbWFwKCkgLSBNYXAgdW5wcm90ZWN0ZWQgZ3JhbnVsZXMgaW50byBhIHJlYWxtXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqIEBiYXNlOiBCYXNlIElQQSBvZiB0aGUgbWFwcGluZ1xuJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcbiYjNDM7ICogQGZsYWdzOiBGbGFnc1xuJiM0MzsgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXG4mIzQzOyAqIEBvdXRfdG9wOiBUb3AgSVBBIG9mIHJhbmdlIHdoaWNoIGhhcyBiZWVuIG1hcHBlZFxuJiM0MzsgKlxuJiM0MzsgKiBDcmVhdGUgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X3VucHJvdF9tYXAodW5zaWduZWQgbG9uZyByZCxcbiYjNDM7XHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSxcbiYjNDM7XHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcbiYjNDM7XHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgb2FkZHIsXG4mIzQzO1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9SVFRfVU5QUk9UX01BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4mIzQzO1x0fTtcbiYjNDM7XHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0MztcbiYjNDM7XHRpZiAob3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ydHRfc2V0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIGFuIHJ1bm5pbmcgcmVhbG1cbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHJlYzogUEEgb2YgdGhlIFJFQyBtYWtpbmcgdGhlIHJlcXVlc3RcbiYjNDM7ICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb25cbiYjNDM7ICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uXG4mIzQzOyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRvcCBJUEEgb2YgcmFuZ2Ugd2hvc2UgUklQQVMgd2FzIG1vZGlmaWVkXG4mIzQzOyAqXG4mIzQzOyAqIENvbXBsZXRlcyBhIHJlcXVlc3QgbWFkZSBieSB0aGUgcmVhbG0gdG8gY2hhbmdlIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEFcbiYjNDM7ICogcmFuZ2UuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X3NldF9yaXBhcyh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJlYyxcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHRvcCxcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX1NFVF9SSVBBUywgcmQsIHJlYywgYmFzZSwgdG9wXG4mIzQzO1x0fTtcbiYjNDM7XHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0MztcbiYjNDM7XHRpZiAob3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ydHRfdW5wcm90X3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3Mgd2l0aGluIGFuIHVucHJvdGVjdGVkIElQQSByYW5nZVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmdcbiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4mIzQzOyAqIEBmbGFnczogRmxhZ3NcbiYjNDM7ICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxuJiM0MzsgKiBAb3V0X3RvcDogVG9wIElQQSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxuJiM0MzsgKiBAb3V0X3JhbmdlOiBPdXRwdXQgYWRkcmVzcyByYW5nZVxuJiM0MzsgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XG4mIzQzOyAqXG4mIzQzOyAqIFJlbW92ZXMgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X3VucHJvdF91bm1hcCh1bnNpZ25lZCBsb25nIHJkLFxuJiM0MztcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuJiM0MztcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLFxuJiM0MztcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuJiM0MztcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxuJiM0MztcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nICpvdXRfcmFuZ2UsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9jb3VudClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX1VOUFJPVF9VTk1BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4mIzQzO1x0fTtcbiYjNDM7XHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0MztcbiYjNDM7XHRpZiAob3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbiYjNDM7XHRpZiAob3V0X3JhbmdlKVxuJiM0MztcdFx0Km91dF9yYW5nZSA9IHJlZ3MuYTI7XG4mIzQzO1x0aWYgKG91dF9jb3VudClcbiYjNDM7XHRcdCpvdXRfY291bnQgPSByZWdzLmEzO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsjZW5kaWYgLyogX19BU01fUk1JX0NNRFNfSCAqL1xuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY1xuaW5kZXggOWEyMmRmMGM1MTIwZjMuLjRhZTYzYzg5Y2RhOTdkIDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNcbkBAIC0yOTMsNiAmIzQzOzI5Myw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRpc2FyM1tdID0ge1xuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRwZnIwW10gPSB7XG4gXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0NTVjNfU0hJRlQsIDQsIDApLFxuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9DU1YyX1NISUZULCA0LCAwKSxcbiYjNDM7XHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX1JNRV9TSElGVCwgNCwgMCksXG4gXHRBUk02NF9GVFJfQklUUyhGVFJfVklTSUJMRSwgRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9ESVRfU0hJRlQsIDQsIDApLFxuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9BTVVfU0hJRlQsIDQsIDApLFxuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9NUEFNX1NISUZULCA0LCAwKSxcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWcgYi9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWdcbmluZGV4IDEyZGM3MDI1NDg0MmNlLi41NTU0Mjg3OWZiYjhhYiAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ1xuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXG5AQCAtMzAxLDUgJiM0MzszMDEsNiBAQCBzb3VyY2UgXCYjMzQ7ZHJpdmVycy9maXJtd2FyZS9zYW1zdW5nL0tjb25maWdcJiMzNDtcbiBzb3VyY2UgXCYjMzQ7ZHJpdmVycy9maXJtd2FyZS9zbWNjYy9LY29uZmlnXCYjMzQ7XG4gc291cmNlIFwmIzM0O2RyaXZlcnMvZmlybXdhcmUvdGVncmEvS2NvbmZpZ1wmIzM0O1xuIHNvdXJjZSBcJiMzNDtkcml2ZXJzL2Zpcm13YXJlL3hpbGlueC9LY29uZmlnXCYjMzQ7XG4mIzQzO3NvdXJjZSBcJiMzNDtkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1wmIzM0O1xuIFxuIGVuZG1lbnVcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlIGIvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZVxuaW5kZXggNGRkZWMyODIwYzk2ZmEuLjA3ZThjYTE3ODliNDllIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZVxuQEAgLTM4LDMgJiM0MzszOCw0IEBAIG9iai15XHRcdFx0XHQmIzQzOz0gc2Ftc3VuZy9cbiBvYmoteVx0XHRcdFx0JiM0Mzs9IHNtY2NjL1xuIG9iai15XHRcdFx0XHQmIzQzOz0gdGVncmEvXG4gb2JqLXlcdFx0XHRcdCYjNDM7PSB4aWxpbngvXG4mIzQzO29iai15XHRcdFx0XHQmIzQzOz0gYXJtX3JtbS9cbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLmQyMjRhNzJjY2E5MDg5XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1xuQEAgLTAsMCAmIzQzOzEsMjIgQEBcbiYjNDM7XG4mIzQzO2NvbmZpZyBBUkNIX1NVUFBPUlRTX1JNTVxuJiM0MztcdGJvb2xcbiYjNDM7XG4mIzQzO2NvbmZpZyBBUk1fUk1NXG4mIzQzO1x0Ym9vbCBcJiMzNDtSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3IgKFJNTSkgU3VwcG9ydFwmIzM0O1xuJiM0MztcdGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19STU1cbiYjNDM7XHRkZWZhdWx0IHlcbiYjNDM7XHRoZWxwXG4mIzQzO1x0ICBTdXBwb3J0IHRoZSBSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3IgKFJNTSkgb24gQXJtIHN5c3RlbXMgdGhhdFxuJiM0MztcdCAgaW1wbGVtZW50IHRoZSBSZWFsbSBNYW5hZ2VtZW50IEV4dGVuc2lvbiAoUk1FKSwgYXMgZGVmaW5lZCBieSB0aGVcbiYjNDM7XHQgIEFybSBDb25maWRlbnRpYWwgQ29tcHV0ZSBBcmNoaXRlY3R1cmUuXG4mIzQzO1xuJiM0MztcdCAgVGhlIFJNTSBydW5zIGluIHRoZSBSZWFsbSB3b3JsZCBhbmQgcHJvdmlkZXMgdGhlIFJlYWxtIE1hbmFnZW1lbnRcbiYjNDM7XHQgIEludGVyZmFjZSAoUk1JKSB1c2VkIGJ5IGEgTm9ybWFsIFdvcmxkIGhvc3QgdG8gY3JlYXRlLCBtYW5hZ2UgYW5kIHJ1blxuJiM0MztcdCAgcHJvdGVjdGVkIHZpcnR1YWwgbWFjaGluZXMgY2FsbGVkIFJlYWxtcy4gVGhpcyBvcHRpb24gYnVpbGRzIHRoZVxuJiM0MztcdCAgaG9zdC1zaWRlIFJNSSBzdXBwb3J0IHVzZWQgYnkgS1ZNIHRvIGRldGVjdCBhIGNvbXBhdGlibGUgUk1NLFxuJiM0MztcdCAgY29uZmlndXJlIGl0LCBtYW5hZ2UgZGVsZWdhdGVkIG1lbW9yeSBhbmQgZW5hYmxlIFJlYWxtIGd1ZXN0cy5cbiYjNDM7XG4mIzQzO1x0ICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gZG9lcyBub3QgYnkgaXRzZWxmIG1ha2UgUmVhbG0gZ3Vlc3RzIGF2YWlsYWJsZTpcbiYjNDM7XHQgIHRoZSBzeXN0ZW0gbXVzdCBhbHNvIHByb3ZpZGUgUk1FLWNhcGFibGUgaGFyZHdhcmUgYW5kIGZpcm13YXJlIHdpdGggYVxuJiM0MztcdCAgY29tcGF0aWJsZSBSTU0gaW1wbGVtZW50YXRpb24uXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjUxYWVmNWNjMDRiMDJjXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcbkBAIC0wLDAgJiM0MzsxLDIgQEBcbiYjNDM7XG4mIzQzO29iai0kKENPTkZJR19BUk1fUk1NKVx0PSBybWkub1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5kMGMwODNiZGYyNTFmNFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jXG5AQCAtMCwwICYjNDM7MSw3MjQgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LypcbiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9jcHVmZWF0dXJlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbWVtYmxvY2suaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9hcm0tcm1pLWNtZHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9wcm9jZXNzb3IuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2FzbS9tZW1vcnkuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20vcGd0YWJsZS1od2RlZi5oXHUwMDNlXG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBhcm02NF9ybWlfaXNfYXZhaWxhYmxlO1xuJiM0MztcbiYjNDM7LyogQ3VycmVudGx5IG9ubHkgdGhlIGZpcnN0IDIgcmVnaXN0ZXJzIGFyZSB1c2VkIGJ5IExpbnV4ICovXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRfUkVHX0NPVU5UXHQyXG4mIzQzO3N0YXRpYyBfX3JvX2FmdGVyX2luaXQgdW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWdfY2FjaGVbUk1JX0ZFQVRfUkVHX0NPVU5UXTtcbiYjNDM7XG4mIzQzO3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaWQpXG4mIzQzO3tcbiYjNDM7XHRpZiAoV0FSTl9PTihpZCBcdTAwM2U9IFJNSV9GRUFUX1JFR19DT1VOVCkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJtaV9mZWF0X3JlZ19jYWNoZVtpZF07XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX2ZlYXRfcmVnKTtcbiYjNDM7XG4mIzQzO2ludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cyxcbiYjNDM7XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsXG4mIzQzO1x0XHQgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyByZXQgPSAwO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgdG9wID0gcGh5cyAmIzQzOyBzaXplO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgb3V0X3RvcDtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKHBoeXMgXHUwMDNjIHRvcCkge1xuJiM0MztcdFx0cmV0ID0gcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUocGh5cywgdG9wLCBcdTAwMjZvdXRfdG9wKTtcbiYjNDM7XHRcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpXG4mIzQzO1x0XHRcdHBoeXMgPSBvdXRfdG9wO1xuJiM0MztcdFx0ZWxzZSBpZiAocmV0ID09IFJNSV9CVVNZIHx8IHJldCA9PSBSTUlfQkxPQ0tFRClcbiYjNDM7XHRcdFx0Y3B1X3JlbGF4KCk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG91dF9waHlzKVxuJiM0MztcdFx0Km91dF9waHlzID0gcGh5cztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfZGVsZWdhdGVfcmFuZ2UpO1xuJiM0MztcbiYjNDM7aW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsXG4mIzQzO1x0XHRcdCB1bnNpZ25lZCBsb25nIHNpemUpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHJldCA9IDA7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB0b3AgPSBwaHlzICYjNDM7IHNpemU7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBvdXRfdG9wO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAocGh5cyBcdTAwM2MgdG9wKSB7XG4mIzQzO1x0XHRyZXQgPSBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHBoeXMsIHRvcCwgXHUwMDI2b3V0X3RvcCk7XG4mIzQzO1x0XHRpZiAocmV0ID09IFJNSV9TVUNDRVNTKVxuJiM0MztcdFx0XHRwaHlzID0gb3V0X3RvcDtcbiYjNDM7XHRcdGVsc2UgaWYgKHJldCA9PSBSTUlfQlVTWSB8fCByZXQgPT0gUk1JX0JMT0NLRUQpXG4mIzQzO1x0XHRcdGNwdV9yZWxheCgpO1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3VuZGVsZWdhdGVfcmFuZ2UpO1xuJiM0MztcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgZG9uYXRlX3JlcV90b19zaXplKHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIEJJVChBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUKDMgLSB1bml0X3NpemUpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgcm1pX3NtY2NjX2ludm9rZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzX2luLFxuJiM0MztcdFx0XHQgICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3Nfb3V0KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gKnJlZ3NfaW47XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzdGF0dXM7XG4mIzQzO1xuJiM0MztcdHdoaWxlICgxKSB7XG4mIzQzO1x0XHRhcm1fc21jY2NfMV8yX2ludm9rZShcdTAwMjZyZWdzLCByZWdzX291dCk7XG4mIzQzO1x0XHRzdGF0dXMgPSBSTUlfUkVUVVJOX1NUQVRVUyhyZWdzX291dC1cdTAwM2VhMCk7XG4mIzQzO1x0XHRpZiAoc3RhdHVzICE9IFJNSV9CVVNZIFx1MDAyNlx1MDAyNiBzdGF0dXMgIT0gUk1JX0JMT0NLRUQpXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0Y3B1X3JlbGF4KCk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBybWlfb3BfY29udGludWUodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLCB1bnNpZ25lZCBsb25nIGZsYWdzLFxuJiM0MztcdFx0XHQgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX09QX0NPTlRJTlVFLCBzcm9faGFuZGxlLCBmbGFnc1xuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdHJtaV9zbWNjY19pbnZva2UoXHUwMDI2cmVncywgb3V0X3JlZ3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBybWlfb3BfY2FuY2VsKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfT1BfQ0FOQ0VMLCBzcm9faGFuZGxlXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cm1pX3NtY2NjX2ludm9rZShcdTAwMjZyZWdzLCBvdXRfcmVncyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJtaV9vcF9tZW1fZG9uYXRlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsXG4mIzQzO1x0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9jb3VudCwgdW5zaWduZWQgbG9uZyBmbGFncyxcbiYjNDM7XHRcdFx0ICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX09QX01FTV9ET05BVEUsIHNyb19oYW5kbGUsIGxpc3RfYWRkciwgbGlzdF9jb3VudCwgZmxhZ3NcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX21lbV9yZWNsYWltKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9hZGRyLFxuJiM0MztcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2NvdW50LFxuJiM0MztcdFx0XHQgICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnRcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbiYjNDM7e1xuJiM0MztcdGlmIChXQVJOX09OX09OQ0Uocm1pX3VuZGVsZWdhdGVfcGFnZShwaHlzKSkpIHtcbiYjNDM7XHRcdC8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovXG4mIzQzO1x0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBoeXNfdG9fdmlydChwaHlzKSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKGZyZWVfZGVsZWdhdGVkX3BhZ2UpO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgY291bnQpXG4mIzQzO3tcbiYjNDM7XHRpZiAoV0FSTl9PTl9PTkNFKHNyby1cdTAwM2VhZGRyX2NvdW50IFx1MDAzZSBSTUlfTUFYX0FERFJfTElTVCkpXG4mIzQzO1x0XHRyZXR1cm4gLUVPVkVSRkxPVztcbiYjNDM7XG4mIzQzO1x0aWYgKGNvdW50IFx1MDAzZSBSTUlfTUFYX0FERFJfTElTVCAtIHNyby1cdTAwM2VhZGRyX2NvdW50KVxuJiM0MztcdFx0cmV0dXJuIC1FTk9TUEM7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHRcdCB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuJiM0MztcdFx0XHRcdCBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcbiYjNDM7XHRcdFx0XHQgZ2ZwX3QgZ2ZwKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZV9ieXRlcyA9IGRvbmF0ZV9yZXFfdG9fc2l6ZShkb25hdGVyZXEpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHNpemUgPSB1bml0X3NpemVfYnl0ZXMgKiBjb3VudDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XHR2b2lkICp2aXJ0O1xuJiM0MztcdHBoeXNfYWRkcl90IHBoeXM7XG4mIzQzO1xuJiM0MztcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBzcm8tXHUwMDNlYWRkcl9jb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXHUwMDNlYWRkcl9saXN0W2ldO1xuJiM0MztcbiYjNDM7XHRcdGlmIChSTUlfQUREUl9SQU5HRV9TSVpFKGVudHJ5KSA9PSB1bml0X3NpemUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IGNvdW50IFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBJU19BTElHTkVEKFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpLCBzaXplKSkge1xuJiM0MztcdFx0XHRzcm8tXHUwMDNlYWRkcl9jb3VudC0tO1xuJiM0MztcdFx0XHRzd2FwKHNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdLFxuJiM0MztcdFx0XHQgICAgIHNyby1cdTAwM2VhZGRyX2xpc3RbaV0pO1xuJiM0MztcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHR2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3Qoc2l6ZSwgZ2ZwKTtcbiYjNDM7XHRpZiAoIXZpcnQpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XHRwaHlzID0gdmlydF90b19waHlzKHZpcnQpO1xuJiM0MztcbiYjNDM7XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHtcbiYjNDM7XHRcdHBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzO1xuJiM0MztcbiYjNDM7XHRcdGlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgc2l6ZSwgXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XG4mIzQzO1x0XHRcdGlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSlcbiYjNDM7XHRcdFx0XHRmcmVlX3BhZ2VzX2V4YWN0KHZpcnQsIHNpemUpO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVOWElPO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0YWRkcl9yYW5nZSA9IHBoeXMgXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcbiYjNDM7XHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCB1bml0X3NpemUpO1xuJiM0MztcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCBjb3VudCk7XG4mIzQzO1x0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIHN0YXRlKTtcbiYjNDM7XG4mIzQzO1x0c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudF0gPSBhZGRyX3JhbmdlO1xuJiM0MztcbiYjNDM7b3V0OlxuJiM0MztcdHJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdCAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdKSwgMSxcbiYjNDM7XHRcdFx0ICAwLCBvdXRfcmVncyk7XG4mIzQzO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9ncmFudWxlcyA9IG91dF9yZWdzLVx1MDAzZWExO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplID0gZG9uYXRlZF9ncmFudWxlcyBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiYjNDM7XG4mIzQzO1x0aWYgKGRvbmF0ZWRfZ3JhbnVsZXMgPT0gMCkge1xuJiM0MztcdFx0LyogTm8gcGFnZXMgdXNlZCBieSB0aGUgUk1NICovXG4mIzQzO1x0XHRzcm8tXHUwMDNlYWRkcl9jb3VudCYjNDM7JiM0Mzs7XG4mIzQzO1x0fSBlbHNlIGlmIChkb25hdGVkX3NpemUgXHUwMDNjIHNpemUpIHtcbiYjNDM7XHRcdHBoeXMgPSBzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSBcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xuJiM0MztcbiYjNDM7XHRcdC8qIE5vdCBhbGwgZ3JhbnVsZXMgdXNlZCBieSB0aGUgUk1NLCBmcmVlIHRoZSByZW1haW5pbmcgcGFnZXMgKi9cbiYjNDM7XHRcdGZvciAobG9uZyBpID0gZG9uYXRlZF9zaXplOyBpIFx1MDAzYyBzaXplOyBpICYjNDM7PSBQQUdFX1NJWkUpIHtcbiYjNDM7XHRcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKVxuJiM0MztcdFx0XHRcdGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyAmIzQzOyBpKTtcbiYjNDM7XHRcdFx0ZWxzZVxuJiM0MztcdFx0XHRcdF9fZnJlZV9wYWdlKHBoeXNfdG9fcGFnZShwaHlzICYjNDM7IGkpKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuJiM0MztcdFx0XHRcdCAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcbiYjNDM7XHRcdFx0XHQgICAgZ2ZwX3QgZ2ZwKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZV9ieXRlcyA9IGRvbmF0ZV9yZXFfdG9fc2l6ZShkb25hdGVyZXEpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGZvdW5kID0gMDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFkZHJfbGlzdF9zdGFydCA9IHNyby1cdTAwM2VhZGRyX2NvdW50O1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBhZGRyX2xpc3Rfc3RhcnQgXHUwMDI2XHUwMDI2IGZvdW5kIFx1MDAzYyBjb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXHUwMDNlYWRkcl9saXN0W2ldO1xuJiM0MztcbiYjNDM7XHRcdGlmIChSTUlfQUREUl9SQU5HRV9TSVpFKGVudHJ5KSA9PSB1bml0X3NpemUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IDEgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpID09IHN0YXRlKSB7XG4mIzQzO1x0XHRcdGFkZHJfbGlzdF9zdGFydC0tO1xuJiM0MztcdFx0XHRzd2FwKHNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSxcbiYjNDM7XHRcdFx0ICAgICBzcm8tXHUwMDNlYWRkcl9saXN0W2ldKTtcbiYjNDM7XHRcdFx0Zm91bmQmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRpLS07XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIGNvdW50IC0gZm91bmQpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoZm91bmQgXHUwMDNjIGNvdW50KSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XG4mIzQzO1x0XHR2b2lkICp2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3QodW5pdF9zaXplX2J5dGVzLCBnZnApO1xuJiM0MztcdFx0cGh5c19hZGRyX3QgcGh5cztcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIXZpcnQpXG4mIzQzO1x0XHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcbiYjNDM7XHRcdHBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7XG4mIzQzO1x0XHRcdHBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzO1xuJiM0MztcbiYjNDM7XHRcdFx0aWYgKHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCB1bml0X3NpemVfYnl0ZXMsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XG4mIzQzO1x0XHRcdFx0aWYgKCFybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBkZWxlZ2F0ZWRfcGh5cyAtIHBoeXMpKVxuJiM0MztcdFx0XHRcdFx0ZnJlZV9wYWdlc19leGFjdCh2aXJ0LCB1bml0X3NpemVfYnl0ZXMpO1xuJiM0MztcdFx0XHRcdHJldHVybiAtRU5YSU87XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRhZGRyX3JhbmdlID0gcGh5cyBcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xuJiM0MztcdFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTSywgXHUwMDI2YWRkcl9yYW5nZSwgdW5pdF9zaXplKTtcbiYjNDM7XHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCAxKTtcbiYjNDM7XHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCBzdGF0ZSk7XG4mIzQzO1xuJiM0MztcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudCYjNDM7JiM0MztdID0gYWRkcl9yYW5nZTtcbiYjNDM7XHRcdGZvdW5kJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdCAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSksXG4mIzQzO1x0XHRcdCAgZm91bmQsIDAsIG91dF9yZWdzKTtcbiYjNDM7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBkb25hdGVkX2dyYW51bGVzID0gb3V0X3JlZ3MtXHUwMDNlYTE7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBncmFudWxlc19wZXJfdW5pdCA9IHVuaXRfc2l6ZV9ieXRlcyBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGNvbnN1bWVkX3VuaXRzO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBSTU0gc2hvdWxkbiYjMzk7dCByZXBvcnQgbW9yZSBncmFudWxlcyB0aGFuIHdlIHByb3ZpZGVkLCBidXQgY2xhbXBcbiYjNDM7XHQgKiBqdXN0IGluIGNhc2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKFdBUk5fT05fT05DRShkb25hdGVkX2dyYW51bGVzIFx1MDAzZSBmb3VuZCAqIGdyYW51bGVzX3Blcl91bml0KSlcbiYjNDM7XHRcdGRvbmF0ZWRfZ3JhbnVsZXMgPSBmb3VuZCAqIGdyYW51bGVzX3Blcl91bml0O1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBSTU0gcmVwb3J0cyB0aGUgY29uc3VtZWQgbWVtb3J5IGluIHRlcm1zIG9mIGdyYW51bGVzLCBidXQgd2VcbiYjNDM7XHQgKiB0cmFjayBpbiB0aGUgYWRkcmVzcyBsaXN0cyBpbiB1bml0LXNpemVkIHJhbmdlcy4gU28gZGl2aWRlIHRvIGdldFxuJiM0MztcdCAqIHRoZSBudW1iZXIgb2YgKGNvbXBsZXRlKSBjb25zdW1lZCB1bml0cy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRjb25zdW1lZF91bml0cyA9IGRvbmF0ZWRfZ3JhbnVsZXMgLyBncmFudWxlc19wZXJfdW5pdDtcbiYjNDM7XHRpZiAoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl91bml0KSB7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogQSB1bml0IGhhcyBiZWVuIHBhcnRpYWxseSBjb25zdW1lZCwgdGhlIHN0YXJ0IGlzIG93bmVkIGJ5XG4mIzQzO1x0XHQgKiB0aGUgUk1NLCB0aGUgdGFpbCBpcyBvd25lZCBieSB0aGUgaG9zdFxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGVudHJ5ID1cbiYjNDM7XHRcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgJiM0MzsgY29uc3VtZWRfdW5pdHNdO1xuJiM0MztcdFx0cGh5c19hZGRyX3QgcGh5cyA9IFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBkb25hdGVkX3NpemUgPVxuJiM0MztcdFx0XHQoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl91bml0KSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiYjNDM7XG4mIzQzO1x0XHQvKiBGcmVlIHRoZSB0YWlsIGJhY2sgKi9cbiYjNDM7XHRcdGZvciAodW5zaWduZWQgbG9uZyBpID0gZG9uYXRlZF9zaXplOyBpIFx1MDAzYyB1bml0X3NpemVfYnl0ZXM7XG4mIzQzO1x0XHQgICAgIGkgJiM0Mzs9IFBBR0VfU0laRSkge1xuJiM0MztcdFx0XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpXG4mIzQzO1x0XHRcdFx0ZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzICYjNDM7IGkpO1xuJiM0MztcdFx0XHRlbHNlXG4mIzQzO1x0XHRcdFx0X19mcmVlX3BhZ2UocGh5c190b19wYWdlKHBoeXMgJiM0MzsgaSkpO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBUaGlzIHVuaXQgaXMgbm93IGZ1bGx5ICYjMzk7Y29uc3VtZWQmIzM5OyAoZWl0aGVyIGhlbGQgYnkgdGhlIFJNTSBvclxuJiM0MztcdFx0ICogZnJlZWQpXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGNvbnN1bWVkX3VuaXRzJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEtlZXAganVzdCB0aGUgdW5pdHMgdGhlIFJNTSBkaWRuJiMzOTt0IHVzZSBpbiBhZGRyX2xpc3QgKi9cbiYjNDM7XHRmb3IgKHVuc2lnbmVkIGxvbmcgaSA9IGNvbnN1bWVkX3VuaXRzOyBpIFx1MDAzYyBmb3VuZDsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRzcm8tXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCAmIzQzOyBpIC0gY29uc3VtZWRfdW5pdHNdID1cbiYjNDM7XHRcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgJiM0MzsgaV07XG4mIzQzO1xuJiM0MztcdHNyby1cdTAwM2VhZGRyX2NvdW50IC09IGNvbnN1bWVkX3VuaXRzO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfc3JvX2RvbmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHQgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSxcbiYjNDM7XHRcdFx0ICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzLFxuJiM0MztcdFx0XHQgIGdmcF90IGdmcClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XG4mIzQzO1xuJiM0MztcdGlmIChXQVJOX09OX09OQ0UoIWNvdW50KSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRpZiAoUk1JX0RPTkFURV9DT05USUcoZG9uYXRlcmVxKSkge1xuJiM0MztcdFx0cmV0dXJuIHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzcm8sIHNyb19oYW5kbGUsIGRvbmF0ZXJlcSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgcmVncywgZ2ZwKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0cmV0dXJuIHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzcm8sIHNyb19oYW5kbGUsIGRvbmF0ZXJlcSxcbiYjNDM7XHRcdFx0XHRcdFx0cmVncywgZ2ZwKTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcm1pX3Nyb19yZWNsYWltKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4mIzQzO1x0XHRcdCAgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGNhcGFjaXR5O1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgMSk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJtaV9zcm9fZnJlZShzcm8pO1xuJiM0MztcbiYjNDM7XHRjYXBhY2l0eSA9IFJNSV9NQVhfQUREUl9MSVNUIC0gc3JvLVx1MDAzZWFkZHJfY291bnQ7XG4mIzQzO1xuJiM0MztcdHJtaV9vcF9tZW1fcmVjbGFpbShzcm9faGFuZGxlLFxuJiM0MztcdFx0XHQgICB2aXJ0X3RvX3BoeXMoXHUwMDI2c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudF0pLFxuJiM0MztcdFx0XHQgICBjYXBhY2l0eSwgb3V0X3JlZ3MpO1xuJiM0MztcbiYjNDM7XHRpZiAoV0FSTl9PTl9PTkNFKG91dF9yZWdzLVx1MDAzZWExIFx1MDAzZSBjYXBhY2l0eSkpXG4mIzQzO1x0XHRvdXRfcmVncy1cdTAwM2VhMSA9IGNhcGFjaXR5O1xuJiM0MztcbiYjNDM7XHRzcm8tXHUwMDNlYWRkcl9jb3VudCAmIzQzOz0gb3V0X3JlZ3MtXHUwMDNlYTE7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuJiM0Mzt7XG4mIzQzO1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIHNyby1cdTAwM2VhZGRyX2NvdW50OyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9IHNyby1cdTAwM2VhZGRyX2xpc3RbaV07XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGFkZHIgPSBSTUlfQUREUl9SQU5HRV9BRERSKGVudHJ5KTtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplID0gUk1JX0FERFJfUkFOR0VfU0laRShlbnRyeSk7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KTtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgc2l6ZSA9IGRvbmF0ZV9yZXFfdG9fc2l6ZSh1bml0X3NpemUpICogY291bnQ7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7XG4mIzQzO1x0XHRcdGlmIChXQVJOX09OX09OQ0Uocm1pX3VuZGVsZWdhdGVfcmFuZ2UoYWRkciwgc2l6ZSkpKSB7XG4mIzQzO1x0XHRcdFx0LyogTGVhayB0aGUgcGFnZXMgKi9cbiYjNDM7XHRcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fVxuJiM0MztcdFx0ZnJlZV9wYWdlc19leGFjdChwaHlzX3RvX3ZpcnQoYWRkciksIHNpemUpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0c3JvLVx1MDAzZWFkZHJfY291bnQgPSAwO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fZnJlZSk7XG4mIzQzO1xuJiM0Mzt1bnNpZ25lZCBsb25nIHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sIGdmcF90IGdmcClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZTtcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzID0gXHUwMDI2c3JvLVx1MDAzZXJlZ3M7XG4mIzQzO1xuJiM0MztcdHJtaV9zbWNjY19pbnZva2UocmVncywgcmVncyk7XG4mIzQzO1xuJiM0MztcdHNyb19oYW5kbGUgPSByZWdzLVx1MDAzZWExO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCkgPT0gUk1JX0lOQ09NUExFVEUpIHtcbiYjNDM7XHRcdGJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLVx1MDAzZWEwKTtcbiYjNDM7XHRcdGludCByZXQgPSAwO1xuJiM0MztcbiYjNDM7XHRcdHN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy1cdTAwM2VhMCkpIHtcbiYjNDM7XHRcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcbiYjNDM7XHRcdFx0cm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLFxuJiM0MztcdFx0XHRcdFx0cmVncyk7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0Y2FzZSBSTUlfT1BfTUVNX1JFUV9ET05BVEU6XG4mIzQzO1x0XHRcdHJldCA9IHJtaV9zcm9fZG9uYXRlKHNybywgc3JvX2hhbmRsZSwgcmVncy1cdTAwM2VhMiwgcmVncyxcbiYjNDM7XHRcdFx0XHRcdCAgICAgZ2ZwKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU06XG4mIzQzO1x0XHRcdHJldCA9IHJtaV9zcm9fcmVjbGFpbShzcm8sIHNyb19oYW5kbGUsIHJlZ3MpO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGRlZmF1bHQ6XG4mIzQzO1x0XHRcdHJldCA9IFdBUk5fT05fT05DRSgxKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0aWYgKHJldCkge1xuJiM0MztcdFx0XHRpZiAoY2FuX2NhbmNlbClcbiYjNDM7XHRcdFx0XHRybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpO1xuJiM0MztcbiYjNDM7XHRcdFx0aWYgKFdBUk5fT05fT05DRShSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVx1MDAzZWEwKSAhPSBSTUlfSU5DT01QTEVURSkpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiByZWdzLVx1MDAzZWEwO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKTtcbiYjNDM7XG4mIzQzOy8qIEZvciBSTUkgY29tbWFuZHMgdGhhdCBhcmUgc3RhdGVmdWwgYnV0IG5vdCBtZW1vcnktdHJhbnNmZXJyaW5nICovXG4mIzQzO3Vuc2lnbmVkIGxvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHNyb19oYW5kbGU7XG4mIzQzO1xuJiM0MztcdHJtaV9zbWNjY19pbnZva2UocmVncywgcmVncyk7XG4mIzQzO1xuJiM0MztcdHNyb19oYW5kbGUgPSByZWdzLVx1MDAzZWExO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCkgPT0gUk1JX0lOQ09NUExFVEUpIHtcbiYjNDM7XHRcdGJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLVx1MDAzZWEwKTtcbiYjNDM7XG4mIzQzO1x0XHRzd2l0Y2ggKFJNSV9SRVRVUk5fTUVNUkVRKHJlZ3MtXHUwMDNlYTApKSB7XG4mIzQzO1x0XHRjYXNlIFJNSV9PUF9NRU1fUkVRX05PTkU6XG4mIzQzO1x0XHRcdHJtaV9vcF9jb250aW51ZShzcm9faGFuZGxlLCBSTUlfQ09OVElOVUVfS0VFUF9HT0lORyxcbiYjNDM7XHRcdFx0XHRcdHJlZ3MpO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGRlZmF1bHQ6XG4mIzQzO1x0XHRcdFdBUk5fT05fT05DRSgxKTtcbiYjNDM7XHRcdFx0aWYgKCFjYW5fY2FuY2VsKVxuJiM0MztcdFx0XHRcdHJldHVybiByZWdzLVx1MDAzZWEwO1xuJiM0MztcbiYjNDM7XHRcdFx0cm1pX29wX2NhbmNlbChzcm9faGFuZGxlLCByZWdzKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiByZWdzLVx1MDAzZWEwO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fZXhlY3V0ZSk7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9jaGVja192ZXJzaW9uKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XG4mIzQzO1x0dW5zaWduZWQgc2hvcnQgdmVyc2lvbl9tYWpvciwgdmVyc2lvbl9taW5vcjtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGhvc3RfdmVyc2lvbiA9IFJNSV9BQklfVkVSU0lPTihSTUlfQUJJX01BSk9SX1ZFUlNJT04sXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgUk1JX0FCSV9NSU5PUl9WRVJTSU9OKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFhNjRwZnIwID0gcmVhZF9zYW5pdGlzZWRfZnRyX3JlZyhTWVNfSURfQUE2NFBGUjBfRUwxKTtcbiYjNDM7XG4mIzQzO1x0LyogSWYgUk1FIGlzbiYjMzk7dCBzdXBwb3J0ZWQsIHRoZW4gUk1JIGNhbiYjMzk7dCBiZSAqL1xuJiM0MztcdGlmIChjcHVpZF9mZWF0dXJlX2V4dHJhY3RfdW5zaWduZWRfZmllbGQoYWE2NHBmcjAsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQpID09IDApXG4mIzQzO1x0XHRyZXR1cm4gLUVOWElPO1xuJiM0MztcbiYjNDM7XHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1ZFUlNJT04sIGhvc3RfdmVyc2lvbiwgXHUwMDI2cmVzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJlcy5hMCA9PSBTTUNDQ19SRVRfTk9UX1NVUFBPUlRFRClcbiYjNDM7XHRcdHJldHVybiAtRU5YSU87XG4mIzQzO1xuJiM0MztcdHZlcnNpb25fbWFqb3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHJlcy5hMSk7XG4mIzQzO1x0dmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmExKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJlcy5hMCAhPSBSTUlfU1VDQ0VTUykge1xuJiM0MztcdFx0dW5zaWduZWQgc2hvcnQgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3I7XG4mIzQzO1xuJiM0MztcdFx0aGlnaF92ZXJzaW9uX21ham9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUihyZXMuYTIpO1xuJiM0MztcdFx0aGlnaF92ZXJzaW9uX21pbm9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NSU5PUihyZXMuYTIpO1xuJiM0MztcbiYjNDM7XHRcdHByX2VycihcJiMzNDtVbnN1cHBvcnRlZCBSTUkgQUJJICh2JWQuJWQgLSB2JWQuJWQpIHdlIHdhbnQgdiVkLiVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IsXG4mIzQzO1x0XHQgICAgICAgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3IsXG4mIzQzO1x0XHQgICAgICAgUk1JX0FCSV9NQUpPUl9WRVJTSU9OLFxuJiM0MztcdFx0ICAgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7XG4mIzQzO1x0XHRyZXR1cm4gLUVOWElPO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cHJfaW5mbyhcJiMzNDtSTUkgQUJJIHZlcnNpb24gJWQuJWRcXG5cJiMzNDssIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfcmVhZF9mZWF0dXJlcyh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBTaW5jZSB3ZSYjMzk7dmUgbmVnb3RpYXRlZCBhIGNvbXBhdGlibGUgdmVyc2lvbiB0aGVzZSBmZWF0dXJlIHJlZ2lzdGVyc1xuJiM0MztcdCAqIHNob3VsZCBhbHdheXMgYmUgYXZhaWxhYmxlXG4mIzQzO1x0ICovXG4mIzQzO1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIFJNSV9GRUFUX1JFR19DT1VOVDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChXQVJOX09OKHJtaV9mZWF0dXJlcyhpLCBcdTAwMjZybWlfZmVhdF9yZWdfY2FjaGVbaV0pKSlcbiYjNDM7XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfY29uZmlndXJlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHJldDtcbiYjNDM7XHRzdHJ1Y3Qgcm1tX2NvbmZpZyAqY29uZmlnIF9fZnJlZShmcmVlX3BhZ2UpID0gKHN0cnVjdCBybW1fY29uZmlnICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpO1xuJiM0MztcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8gX19mcmVlKGtmcmVlKSA9IChzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqKWttYWxsb2Nfb2JqKCpzcm8pO1xuJiM0MztcbiYjNDM7XHRpZiAoIWNvbmZpZyB8fCAhc3JvKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAoUEFHRV9TSVpFKSB7XG4mIzQzO1x0Y2FzZSBTWl80SzpcbiYjNDM7XHRcdGNvbmZpZy1cdTAwM2VybWlfZ3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV80S0I7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRjYXNlIFNaXzE2SzpcbiYjNDM7XHRcdGNvbmZpZy1cdTAwM2VybWlfZ3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV8xNktCO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBTWl82NEs6XG4mIzQzO1x0XHRjb25maWctXHUwMDNlcm1pX2dyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNjRLQjtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGRlZmF1bHQ6XG4mIzQzO1x0XHRCVUlMRF9CVUcoKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogRm9yIG5vdyB3ZSBzZXQgdGhlIHRyYWNraW5nX3JlZ2lvbl9zaXplIHRvIDAgd2hpY2ggaXMgdGhlIG9ubHkgb3B0aW9uXG4mIzQzO1x0ICogZm9yIDRLQiBQQUdFX1NJWkUgKDFHQiBmb3IgNEtCIFBBR0VfU0laRSwgMzJNQi81MTJNQiBmb3IgMTZLQi82NEtCKS5cbiYjNDM7XHQgKiBUT0RPOiBTdXBwb3J0IG90aGVyIHRyYWNraW5nIHNpemVzIHZpYSBLY29uZmlnIG9wdGlvbiBmb3Igb3RoZXJcbiYjNDM7XHQgKiBQQUdFX1NJWkVTXG4mIzQzO1x0ICovXG4mIzQzO1x0Y29uZmlnLVx1MDAzZXRyYWNraW5nX3JlZ2lvbl9zaXplID0gMDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX3JtbV9jb25maWdfc2V0KHZpcnRfdG9fcGh5cyhjb25maWcpKTtcbiYjNDM7XHRpZiAocmV0KSB7XG4mIzQzO1x0XHRwcl9lcnIoXCYjMzQ7Uk1NIGNvbmZpZyBzZXQgZmFpbGVkXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX3JtbV9hY3RpdmF0ZShzcm8pO1xuJiM0MztcdGlmIChyZXQpIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDtSTU0gYWN0aXZhdGUgZmFpbGVkXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiAtRU5YSU87XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogTWFrZSBzdXJlIHRoZSBhcmVhIGlzIHRyYWNrZWQgYnkgUk1NIGF0IEZJTkUgZ3JhbnVsYXJpdHkuXG4mIzQzOyAqIFdlIGRvIG5vdCBzdXBwb3J0IGNoYW5naW5nIHRoZSB0cmFja2luZyB5ZXQuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IHJtaV92ZXJpZnlfbWVtb3J5X3RyYWNraW5nKHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpXG4mIzQzO3tcbiYjNDM7XHR3aGlsZSAoc3RhcnQgXHUwMDNjIGVuZCkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyByZXQsIGNhdGVnb3J5LCBzdGF0ZSwgbmV4dDtcbiYjNDM7XG4mIzQzO1x0XHRyZXQgPSBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQoc3RhcnQsIGVuZCwgXHUwMDI2Y2F0ZWdvcnksIFx1MDAyNnN0YXRlLCBcdTAwMjZuZXh0KTtcbiYjNDM7XHRcdGlmIChyZXQgIT0gUk1JX1NVQ0NFU1MgfHxcbiYjNDM7XHRcdCAgICBzdGF0ZSAhPSBSTUlfVFJBQ0tJTkdfRklORSB8fFxuJiM0MztcdFx0ICAgIGNhdGVnb3J5ICE9IFJNSV9NRU1fQ0FURUdPUllfQ09OVkVOVElPTkFMKSB7XG4mIzQzO1x0XHRcdC8qIFRPRE86IFNldCBncmFudWxlIHRyYWNraW5nIGluIHRoaXMgY2FzZSAqL1xuJiM0MztcdFx0XHRwcl9lcnIoXCYjMzQ7R3JhbnVsZSB0cmFja2luZyBmb3IgcmVnaW9uIGlzbiYjMzk7dCBmaW5lL2NvbnZlbnRpb25hbDogJWxseFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgIHN0YXJ0KTtcbiYjNDM7XHRcdFx0cmV0dXJuIC1FTk9ERVY7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRzdGFydCA9IG5leHQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfY3JlYXRlX2dwdHMocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm87XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBsMGdwdF9zejtcbiYjNDM7XG4mIzQzO1x0c3JvID0ga21hbGxvY19vYmooKnNybywgR0ZQX0tFUk5FTCk7XG4mIzQzO1x0aWYgKCFzcm8pXG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XG4mIzQzO1x0bDBncHRfc3ogPSAxVUwgXHUwMDNjXHUwMDNjICgzMCAmIzQzOyBGSUVMRF9HRVQoUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9MMEdQVFNaLFxuJiM0MztcdFx0XHRcdFx0ICBybWlfZmVhdF9yZWcoMSkpKTtcbiYjNDM7XHRzdGFydCA9IEFMSUdOX0RPV04oc3RhcnQsIGwwZ3B0X3N6KTtcbiYjNDM7XHRlbmQgPSBBTElHTihlbmQsIGwwZ3B0X3N6KTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKHN0YXJ0IFx1MDAzYyBlbmQpIHtcbiYjNDM7XHRcdGludCByZXQgPSBybWlfZ3B0X2wxX2NyZWF0ZShzdGFydCwgc3JvLCBHRlBfS0VSTkVMKTtcbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogTWFrZSBzdXJlIHRoZSBMMSBHUFQgdGFibGVzIGFyZSBjcmVhdGVkIGZvciB0aGUgcmVnaW9uLlxuJiM0MztcdFx0ICogUk1JX0VSUk9SX0dQVCBpbmRpY2F0ZXMgdGhlIEwxIHRhYmxlIGFscmVhZHkgZXhpc3RzLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAocmV0ICE9IFJNSV9TVUNDRVNTIFx1MDAyNlx1MDAyNiBSTUlfUkVUVVJOX1NUQVRVUyhyZXQpICE9IFJNSV9FUlJPUl9HUFQpIHtcbiYjNDM7XHRcdFx0cHJfZXJyKFwmIzM0O0dQVCBMZXZlbDEgdGFibGUgbWlzc2luZyBmb3IgJWxseFxcblwmIzM0Oywgc3RhcnQpO1xuJiM0MztcdFx0XHRrZnJlZShzcm8pO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHN0YXJ0ICYjNDM7PSBsMGdwdF9zejtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtmcmVlKHNybyk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcm1pX2luaXRfbWV0YWRhdGEodm9pZClcbiYjNDM7e1xuJiM0MztcdHBoeXNfYWRkcl90IHN0YXJ0LCBlbmQ7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcjtcbiYjNDM7XG4mIzQzO1x0Zm9yX2VhY2hfbWVtX3JlZ2lvbihyKSB7XG4mIzQzO1x0XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRcdHN0YXJ0ID0gbWVtYmxvY2tfcmVnaW9uX21lbW9yeV9iYXNlX3BmbihyKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiYjNDM7XHRcdGVuZCA9IG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfZW5kX3BmbihyKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiYjNDM7XHRcdHJldCA9IHJtaV92ZXJpZnlfbWVtb3J5X3RyYWNraW5nKHN0YXJ0LCBlbmQpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdHJldCA9IHJtaV9jcmVhdGVfZ3B0cyhzdGFydCwgZW5kKTtcbiYjNDM7XHRcdGlmIChyZXQpXG4mIzQzO1x0XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7Ym9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gYXJtNjRfcm1pX2lzX2F2YWlsYWJsZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBfX2luaXQgYXJtNjRfaW5pdF9ybWkodm9pZClcbiYjNDM7e1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdC8qIENvbnRpbnVlIHdpdGhvdXQgcmVhbG0gc3VwcG9ydCBpZiB3ZSBjYW4mIzM5O3QgYWdyZWUgb24gYSB2ZXJzaW9uICovXG4mIzQzO1x0cmV0ID0gcm1pX2NoZWNrX3ZlcnNpb24oKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX3JlYWRfZmVhdHVyZXMoKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX2NvbmZpZ3VyZSgpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfaW5pdF9tZXRhZGF0YSgpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRhcm02NF9ybWlfaXNfYXZhaWxhYmxlID0gdHJ1ZTtcbiYjNDM7XHRwcl9pbmZvKFwmIzM0O1JNSSBjb25maWd1cmVkXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIE5vdGUgYXJtNjRfaW5pdF9ybWkoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUga3ZtX2luaXRfcm1pKCkgb3RoZXJ3aXNlIEtWTVxuJiM0MzsgKiB3aWxsIG5vdCBzdXBwb3J0IHJlYWxtIGd1ZXN0cy4gc3Vic3lzX2luaXRjYWxsKCkgaXMgY2FsbGVkIGJlZm9yZVxuJiM0MzsgKiBtb2R1bGVfaW5pdCgpICh1c2VkIGZvciBLVk0pIHNvIHRoaXMgaXMgT0suXG4mIzQzOyAqL1xuJiM0MztzdWJzeXNfaW5pdGNhbGwoYXJtNjRfaW5pdF9ybWkpO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmggYi9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjEzODk4M2FiNGUzYzIyXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oXG5AQCAtMCwwICYjNDM7MSwyMDUgQEBcbiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbiYjNDM7LypcbiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDI2IEFSTSBMdGQuXG4mIzQzOyAqL1xuJiM0MztcbiYjNDM7I2lmbmRlZiBfX0xJTlVYX0FSTV9STUlfQ01EU19IX1xuJiM0MzsjZGVmaW5lIF9fTElOVVhfQVJNX1JNSV9DTURTX0hfXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9hcm0tc21jY2Mtcm1pLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYnVnLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvdHlwZXMuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYXNtL3BhZ2UuaFx1MDAzZVxuJiM0MztcbiYjNDM7c3RydWN0IHJ0dF9lbnRyeSB7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB3YWxrX2xldmVsO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZGVzYztcbiYjNDM7XHRpbnQgc3RhdGU7XG4mIzQzO1x0aW50IHJpcGFzO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfTUFYX0FERFJfTElTVFx0MjU2XG4mIzQzO1xuJiM0MztzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSB7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgYWRkcl9jb3VudDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFkZHJfbGlzdFtSTUlfTUFYX0FERFJfTElTVF07XG4mIzQzO307XG4mIzQzO1xuJiM0Mzt1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZyh1bnNpZ25lZCBsb25nIGlkKTtcbiYjNDM7XG4mIzQzO2ludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplLFxuJiM0MztcdFx0ICAgICAgIHBoeXNfYWRkcl90ICpvdXRfcGh5cyk7XG4mIzQzO2ludCBybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUpO1xuJiM0MztpbnQgZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzX2FkZHJfdCBwaHlzKTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9kZWxlZ2F0ZV9wYWdlKHBoeXNfYWRkcl90IHBoeXMpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIFBBR0VfU0laRSwgTlVMTCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBQQUdFX1NJWkUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mztib29sIGlzX3JtaV9hdmFpbGFibGUodm9pZCk7XG4mIzQzO1xuJiM0Mzt1bnNpZ25lZCBsb25nIHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sIGdmcF90IGdmcCk7XG4mIzQzO3ZvaWQgcm1pX3Nyb19mcmVlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pO1xuJiM0Mzt1bnNpZ25lZCBsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKTtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIGdmcCwgLi4uKSAoe1x0XHRcdFx0XFxcbiYjNDM7XHRzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqX19zcm8gPSAoc3JvKTtcdFx0XHRcdFxcXG4mIzQzO1x0Kl9fc3JvID0gKHN0cnVjdCBybWlfc3JvX3N0YXRlKXsgLnJlZ3MgPSB7X19WQV9BUkdTX199IH07XHRcXFxuJiM0MztcdGludCBfX3JldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKF9fc3JvLCBnZnApO1x0XHRcXFxuJiM0MztcdHJtaV9zcm9fZnJlZShfX3Nybyk7XHRcdFx0XHRcdFx0XFxcbiYjNDM7XHRfX3JldDtcdFx0XHRcdFx0XHRcdFx0XFxcbiYjNDM7fSlcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcm1tX2NvbmZpZ19zZXQoKSAtIENvbmZpZ3VyZSB0aGUgUk1NXG4mIzQzOyAqIEBjZmdfcHRyOiBQQSBvZiBhIHN0cnVjdCBybW1fY29uZmlnXG4mIzQzOyAqXG4mIzQzOyAqIFNldHMgY29uZmlndXJhdGlvbiBvcHRpb25zIG9uIHRoZSBSTU0uXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcm1tX2NvbmZpZ19zZXQodW5zaWduZWQgbG9uZyBjZmdfcHRyKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xuJiM0MztcbiYjNDM7XHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1JNTV9DT05GSUdfU0VULCBjZmdfcHRyLCBcdTAwMjZyZXMpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmVzLmEwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3JtbV9hY3RpdmF0ZSgpIC0gQWN0aXZhdGUgdGhlIFJNTVxuJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3JtbV9hY3RpdmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JNTV9BQ1RJVkFURSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQoKSAtIEdldCBjb25maWd1cmF0aW9uIG9mIGEgR3JhbnVsZSB0cmFja2luZyByZWdpb25cbiYjNDM7ICogQHN0YXJ0OiBCYXNlIFBBIG9mIHRoZSB0cmFja2luZyByZWdpb25cbiYjNDM7ICogQGVuZDogRW5kIG9mIHRoZSBQQSByZWdpb25cbiYjNDM7ICogQG91dF9jYXRlZ29yeTogTWVtb3J5IGNhdGVnb3J5XG4mIzQzOyAqIEBvdXRfc3RhdGU6IFRyYWNraW5nIHJlZ2lvbiBzdGF0ZVxuJiM0MzsgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBtZW1vcnkgcmVnaW9uXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQodW5zaWduZWQgbG9uZyBzdGFydCxcbiYjNDM7XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgZW5kLFxuJiM0MztcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X2NhdGVnb3J5LFxuJiM0MztcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3N0YXRlLFxuJiM0MztcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbiYjNDM7XG4mIzQzO1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX0dFVCwgc3RhcnQsIGVuZCwgXHUwMDI2cmVzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKG91dF9jYXRlZ29yeSlcbiYjNDM7XHRcdCpvdXRfY2F0ZWdvcnkgPSByZXMuYTE7XG4mIzQzO1x0aWYgKG91dF9zdGF0ZSlcbiYjNDM7XHRcdCpvdXRfc3RhdGUgPSByZXMuYTI7XG4mIzQzO1x0aWYgKG91dF90b3ApXG4mIzQzO1x0XHQqb3V0X3RvcCA9IHJlcy5hMztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJlcy5hMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ncHRfbDFfY3JlYXRlKCkgLSBDcmVhdGUgYSBMZXZlbCAxIEdQVFxuJiM0MzsgKiBAYWRkcjogQmFzZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lvbiBkZXNjcmliZWQgYnkgdGhlIEwxR1BUXG4mIzQzOyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXG4mIzQzOyAqIEBnZnA6IEFsbG9jYXRpb24gZmxhZ3MgZm9yIFNSTyBtZW1vcnkgZG9uYXRpb24gcmVxdWVzdHNcbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ncHRfbDFfY3JlYXRlKHVuc2lnbmVkIGxvbmcgYWRkcixcbiYjNDM7XHRcdFx0XHQgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyxcbiYjNDM7XHRcdFx0XHQgICAgZ2ZwX3QgZ2ZwKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBnZnAsIFNNQ19STUlfR1BUX0wxX0NSRUFURSwgYWRkcik7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfZmVhdHVyZXMoKSAtIFJlYWQgZmVhdHVyZSByZWdpc3RlclxuJiM0MzsgKiBAaW5kZXg6IEZlYXR1cmUgcmVnaXN0ZXIgaW5kZXhcbiYjNDM7ICogQG91dDogRmVhdHVyZSByZWdpc3RlciB2YWx1ZSBpcyB3cml0dGVuIHRvIHRoaXMgcG9pbnRlclxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2ZlYXR1cmVzKHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgKm91dClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbiYjNDM7XG4mIzQzO1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9GRUFUVVJFUywgaW5kZXgsIFx1MDAyNnJlcyk7XG4mIzQzO1xuJiM0MztcdGlmIChvdXQpXG4mIzQzO1x0XHQqb3V0ID0gcmVzLmExO1xuJiM0MztcdHJldHVybiByZXMuYTA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSgpIC0gRGVsZWdhdGUgZ3JhbnVsZXNcbiYjNDM7ICogQGJhc2U6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG9mIHRoZSByYW5nZVxuJiM0MzsgKiBAdG9wOiBQQSBvZiB0aGUgZmlyc3QgZ3JhbnVsZSBhZnRlciB0aGUgcmFuZ2VcbiYjNDM7ICogQG91dF90b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG5vdCBkZWxlZ2F0ZWRcbiYjNDM7ICpcbiYjNDM7ICogRGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlIGZvciB1c2UgYnkgdGhlIHJlYWxtIHdvcmxkLiBJZiB0aGUgZW50aXJlIHJhbmdlXG4mIzQzOyAqIHdhcyBkZWxlZ2F0ZWQgdGhlbiBAb3V0X3RvcCA9PSBAdG9wLCBvdGhlcndpc2UgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbiYjNDM7ICogYWdhaW4gd2l0aCBAYmFzZSA9PSBAb3V0X3RvcC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4mIzQzO1x0XHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX0dSQU5VTEVfUkFOR0VfREVMRUdBVEUsIGJhc2UsIHRvcFxuJiM0MztcdH07XG4mIzQzO1x0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKG91dF90b3ApXG4mIzQzO1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKCkgLSBVbmRlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZXNcbiYjNDM7ICogQGJhc2U6IEJhc2UgUEEgb2YgdGhlIHRhcmdldCByYW5nZVxuJiM0MzsgKiBAdG9wOiBUb3AgUEEgb2YgdGhlIHRhcmdldCByYW5nZVxuJiM0MzsgKiBAb3V0X3RvcDogUmV0dXJucyB0aGUgdG9wIFBBIG9mIHJhbmdlIHdob3NlIHN0YXRlIGlzIHVuZGVsZWdhdGVkXG4mIzQzOyAqXG4mIzQzOyAqIFVuZGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlcyB0byBhbGxvdyB1c2UgYnkgdGhlIG5vcm1hbCB3b3JsZC4gV2lsbCBmYWlsIGlmXG4mIzQzOyAqIHRoZSBncmFudWxlcyBhcmUgaW4gdXNlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfR1JBTlVMRV9SQU5HRV9VTkRFTEVHQVRFLCBiYXNlLCB0b3BcbiYjNDM7XHR9O1xuJiM0MztcdGludCByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChvdXRfdG9wKVxuJiM0MztcdFx0Km91dF90b3AgPSByZWdzLmExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsjZW5kaWZcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaCBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLmM5NjVlODg2NzUxOGYzXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaFxuQEAgLTAsMCAmIzQzOzEsNDk5IEBAXG4mIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4mIzQzOy8qXG4mIzQzOyAqIENvcHlyaWdodCAoQykgMjAyMy0yMDI2IEFSTSBMdGQuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSB2YWx1ZXMgYW5kIHN0cnVjdHVyZXMgaW4gdGhpcyBmaWxlIGFyZSBmcm9tIHRoZSBSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3JcbiYjNDM7ICogc3BlY2lmaWNhdGlvbiAoREVOMDEzNykgdmVyc2lvbiAyLjAtYmV0MjpcbiYjNDM7ICogaHR0cHM6Ly9kZXZlbG9wZXIuYXJtLmNvbS9kb2N1bWVudGF0aW9uL2RlbjAxMzcvMi0wYmV0Mi9cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaWZuZGVmIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IX1xuJiM0MzsjZGVmaW5lIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IX1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYXJtLXNtY2NjLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYml0ZmllbGQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYnVpbGRfYnVnLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc2l6ZXMuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYXNtL3BhZ2UuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20vc3lzcmVnLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9DQUxMKGZ1bmMpXHRcdFx0XHRcXFxuJiM0MztcdEFSTV9TTUNDQ19DQUxMX1ZBTChBUk1fU01DQ0NfRkFTVF9DQUxMLFx0XHRcXFxuJiM0MztcdFx0XHQgICBBUk1fU01DQ0NfU01DXzY0LFx0XHRcXFxuJiM0MztcdFx0XHQgICBBUk1fU01DQ0NfT1dORVJfU1RBTkRBUkQsXHRcXFxuJiM0MztcdFx0XHQgICAoZnVuYykpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkVSU0lPTlx0XHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1MClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9NQVBfSU5JVFx0XHRTTUNfUk1JX0NBTEwoMHgwMTUzKVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQUxNX0FDVElWQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1NylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQUxNX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNTgpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1OSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQ19DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTVhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVDX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTViKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVDX0VOVEVSXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1YylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTVkKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTVlKVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9SRUFEX0VOVFJZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2MSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1ZBTElEQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxNjMpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU0NJX0NPTVBMRVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2NClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0ZFQVRVUkVTXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2NSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9GT0xEXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2NilcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfSU5JVF9SSVBBU1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjgpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1JJUEFTXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2OSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNmEpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WU01NVV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2YilcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9STU1fQ09ORklHX1NFVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNmUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9JUlFfTk9USUZZXHRcdFNNQ19STUlfQ0FMTCgweDAxNmYpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9BVFRFU1RfUExBVF9UT0tFTl9SRUZSRVNIXHRTTUNfUk1JX0NBTEwoMHgwMTcwKVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQUJPUlRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTc0KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9DT01NVU5JQ0FURVx0XHRTTUNfUk1JX0NBTEwoMHgwMTc1KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTc2KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3NylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfR0VUX1NUQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3OClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUkVGUkVTSFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TRVRfUFVCS0VZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3YilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RPUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxN2MpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxN2QpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdlKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9GT0xEXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3ZilcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0FCT1JUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4NSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfQ09NTVVOSUNBVEVcdFx0U01DX1JNSV9DQUxMKDB4MDE4NilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4NylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODgpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9TVEFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODkpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX1VOTE9DS1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxOGEpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1MyQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMThiKVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfR0VUX0lOVEVSRkFDRV9SRVBPUlRcdFNNQ19STUlfQ0FMTCgweDAxZDApXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9NRUFTVVJFTUVOVFNcdFx0U01DX1JNSV9DQUxMKDB4MDFkMSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfTE9DS1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxZDIpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX1NUQVJUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkMylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfUDJQX0JJTkRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWQ0KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9QMlBfVU5CSU5EXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkNSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0VWRU5UX0hBTkRMRVx0XHRTTUNfUk1JX0NBTEwoMHgwMWQ2KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfQUNUSVZBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWQ3KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfREVBQ1RJVkFURVx0XHRTTUNfUk1JX0NBTEwoMHgwMWQ4KVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX1NUX0wyX0NSRUFURVx0XHRTTUNfUk1JX0NBTEwoMHgwMWRiKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfREVTVFJPWVx0XHRTTUNfUk1JX0NBTEwoMHgwMWRjKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfRFBUX0wwX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZGQpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9EUFRfTDBfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZGUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9EUFRfTDFfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkZilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0RQVF9MMV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlMClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfR0VUXHRcdFNNQ19STUlfQ0FMTCgweDAxZTEpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19TRVRcdFx0U01DX1JNSV9DQUxMKDB4MDFlMylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0NNRU1fQUREX1BERVZcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWU0KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfQ01FTV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWU1KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfQ01FTV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlNilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0NNRU1fUE9QVUxBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWU3KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfQ01FTV9SRU1PVkVfUERFVlx0XHRTTUNfUk1JX0NBTEwoMHgwMWU4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfQ01FTV9TVEFSVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZTkpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9DTUVNX1NUT1BcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWVhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfQ01FTV9VTlBPUFVMQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlYilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9DT05GSUdfR0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlYylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfTUVDX1JFRlJFU0hcdFx0U01DX1JNSV9DQUxMKDB4MDFlZClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9TVEFURV9HRVRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWVlKVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX0VWRU5UX0NPTlNVTUVcdFx0U01DX1JNSV9DQUxMKDB4MDFmMClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfUkFOR0VfREVMRUdBVEVcdFx0U01DX1JNSV9DQUxMKDB4MDFmMSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfUkFOR0VfVU5ERUxFR0FURVx0U01DX1JNSV9DQUxMKDB4MDFmMilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0dQVF9MMV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWYzKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfR1BUX0wxX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWY0KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmNSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX1VOTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmNilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9ERVZfTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmNylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9ERVZfVU5NQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWY4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FSQ0hfREVWX01BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWY5KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FSQ0hfREVWX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmEpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX01BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZmIpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmMpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1BST1RfTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmQpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1BST1RfVU5NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmZSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX01BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZmKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9VTlBST1RfVU5NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDIwMClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQUxNX1RFUk1JTkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMDEpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9STU1fQUNUSVZBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAyKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfQ09OVElOVUVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAzKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fQ09OTkVDVFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA0KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fRElTQ09OTkVDVFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA1KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fQ09NUExFVEVcdFx0U01DX1JNSV9DQUxMKDB4MDIwNilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0tFWV9QVVJHRVx0XHRTTUNfUk1JX0NBTEwoMHgwMjA3KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfTUVNX0RPTkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMDgpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9PUF9NRU1fUkVDTEFJTVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMDkpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9PUF9DQU5DRUxcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfRkVBVFVSRVNcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBiKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0dFVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMGMpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WU01NVV9DTURfQ09NUExFVEVcdFx0U01DX1JNSV9DQUxMKDB4MDIwZClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX0lORk9cdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBlKVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfQUJJX01BSk9SX1ZFUlNJT05cdDJcbiYjNDM7I2RlZmluZSBSTUlfQUJJX01JTk9SX1ZFUlNJT05cdDBcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUih2ZXJzaW9uKSAoKHZlcnNpb24pIFx1MDAzZVx1MDAzZSAxNilcbiYjNDM7I2RlZmluZSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHZlcnNpb24pICgodmVyc2lvbikgXHUwMDI2IDB4RkZGRilcbiYjNDM7I2RlZmluZSBSTUlfQUJJX1ZFUlNJT04obWFqb3IsIG1pbm9yKSAgICAgICgoKG1ham9yKSBcdTAwM2NcdTAwM2MgMTYpIHwgKG1pbm9yKSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9TVEFUVVNfTUFTS1x0XHQoMHhGRlVMKVxuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fSU5ERVhfTUFTS1x0XHQoMHhGRlVMIFx1MDAzY1x1MDAzYyA4KVxuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRX01BU0tcdFx0KDB4M1VMIFx1MDAzY1x1MDAzYyA4KVxuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLXHQoMHgxVUwgXHUwMDNjXHUwMDNjIDEwKVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVUyhyZXQpXHRcdEZJRUxEX0dFVChSTUlfUkVUVVJOX1NUQVRVU19NQVNLLCByZXQpXG4mIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9JTkRFWChyZXQpXHRcdEZJRUxEX0dFVChSTUlfUkVUVVJOX0lOREVYX01BU0ssIHJldClcbiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX01FTVJFUShyZXQpXHRcdEZJRUxEX0dFVChSTUlfUkVUVVJOX01FTVJFUV9NQVNLLCByZXQpXG4mIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJldClcdEZJRUxEX0dFVChSTUlfUkVUVVJOX0NBTl9DQU5DRUxfTUFTSywgcmV0KVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfU1VDQ0VTU1x0XHRcdDBcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfSU5QVVRcdFx0XHQxXG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JFQUxNXHRcdFx0MlxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9SRUNcdFx0XHQzXG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JUVFx0XHRcdDRcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfTk9UX1NVUFBPUlRFRFx0XHQ1XG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0RFVklDRVx0XHQ2XG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JUVF9BVVhcdFx0N1xuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9QU01NVV9TVFx0XHQ4XG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0RQVFx0XHRcdDlcbiYjNDM7I2RlZmluZSBSTUlfQlVTWVx0XHRcdDEwXG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0dMT0JBTFx0XHQxMVxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9UUkFDS0lOR1x0XHQxMlxuJiM0MzsjZGVmaW5lIFJNSV9JTkNPTVBMRVRFXHRcdFx0MTNcbiYjNDM7I2RlZmluZSBSTUlfQkxPQ0tFRFx0XHRcdDE0XG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0dQVFx0XHRcdDE1XG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0dSQU5VTEVcdFx0MTZcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkdcdFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9DT05USU5VRV9TVE9QXHRcdDFcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX09QX01FTV9SRVFfTk9ORVx0XHQwXG4mIzQzOyNkZWZpbmUgUk1JX09QX01FTV9SRVFfRE9OQVRFXHRcdDFcbiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX1JFUV9SRUNMQUlNXHRcdDJcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TSVpFX01BU0tcdFx0M1VMXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVF9NQVNLXHRcdEdFTk1BU0soMTUsIDIpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT05USUdfTUFTS1x0XHRCSVQoMTYpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURV9NQVNLXHRcdEJJVCgxNylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TSVpFKHJlcSlcdFx0RklFTERfR0VUKFJNSV9ET05BVEVfU0laRV9NQVNLLCByZXEpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVChyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPVU5UX01BU0ssIHJlcSlcbiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJRyhyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPTlRJR19NQVNLLCByZXEpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURShyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX1NUQVRFX01BU0ssIHJlcSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX09QX01FTV9ERUxFR0FURURcdFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9PUF9NRU1fVU5ERUxFR0FURURcdFx0MVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9UWVBFX05PTkVcdFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1RZUEVfU0lOR0xFXHRcdDFcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9UWVBFX0xJU1RcdFx0MlxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TSVpFX01BU0tcdEdFTk1BU0soMSwgMClcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLXHRHRU5NQVNLKFBBR0VfU0hJRlQgLSAxLCAyKVxuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFJfTUFTS1x0KFBBR0VfTUFTSyBcdTAwMjYgR0VOTUFTSyg1MSwgMCkpXG4mIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTS1x0QklUKDYzKVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TSVpFKGFyKVx0XHQoRklFTERfR0VUKFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTSywgXFxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgKGFyKSkpXG4mIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlQoYXIpXHQoRklFTERfR0VUKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIFxcXG4mIzQzO1x0XHRcdFx0XHRcdCAgIChhcikpKVxuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFIoYXIpXHRcdCgoYXIpIFx1MDAyNiBSTUlfQUREUl9SQU5HRV9BRERSX01BU0spXG4mIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU1RBVEUoYXIpXHQoRklFTERfR0VUKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFxcXG4mIzQzO1x0XHRcdFx0XHRcdCAgIChhcikpKVxuJiM0MztcbiYjNDM7ZW51bSBybWlfcmlwYXMge1xuJiM0MztcdFJNSV9FTVBUWSA9IDAsXG4mIzQzO1x0Uk1JX1JBTSA9IDEsXG4mIzQzO1x0Uk1JX0RFU1RST1lFRCA9IDIsXG4mIzQzO1x0Uk1JX0RFViA9IDMsXG4mIzQzO307XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9OT19NRUFTVVJFX0NPTlRFTlRcdDBcbiYjNDM7I2RlZmluZSBSTUlfTUVBU1VSRV9DT05URU5UXHQxXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUzJTWlx0XHRHRU5NQVNLKDcsIDApXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9MUEEyXHRcdEJJVCg4KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFXHRcdEJJVCg5KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFX1ZMXHRcdEdFTk1BU0soMTMsIDEwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTlVNX0JQU1x0XHRHRU5NQVNLKDE5LCAxNClcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX05VTV9XUFNcdFx0R0VOTUFTSygyNSwgMjApXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVcdFx0QklUKDI2KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUE1VX05VTV9DVFJTXHRHRU5NQVNLKDMxLCAyNylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl80S0JcdEJJVCgwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfMTZLQlx0QklUKDEpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl82NEtCXHRCSVQoMilcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzI1Nlx0QklUKDMpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8zODRcdEJJVCg0KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfNTEyXHRCSVQoNSlcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX01BWF9SRUNTX09SREVSXHRHRU5NQVNLKDksIDYpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9MMEdQVFNaXHRcdEdFTk1BU0soMTMsIDEwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUFBTXHRcdEdFTk1BU0soMTYsIDE0KVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0RBXHRcdEJJVCgwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfREFfQ09IXHRcdEJJVCgxKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVlNNTVVcdFx0QklUKDIpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9BVFNcdFx0QklUKDMpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9NQVhfVkRFVlNfT1JERVJcdEdFTk1BU0soNywgNClcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1ZERVZfS1JPVVx0QklUKDgpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9OT05fVEVFX1NUUkVBTVx0QklUKDkpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9QMlBcdFx0QklUKDEwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQ01FTV9DWExcdFx0QklUKDExKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfTUFYX0NNRU1cdFx0R0VOTUFTSygxOSwgMTIpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9DTUVNX1RTRV9SRVFcdEJJVCgyMClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19NQVhfTlVNX0FVWF9QTEFORVNcdEdFTk1BU0soMywgMClcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9QTEFORVx0XHRHRU5NQVNLKDUsIDQpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19SVFRfUzJBUF9JTkRJUkVDVFx0QklUKDYpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzRfTUVDX0NPVU5UXHRcdEdFTk1BU0soNjMsIDApXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfQ09OVkVOVElPTkFMXHRcdDBcbiYjNDM7I2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0RFVl9OQ09IXHRcdDFcbiYjNDM7I2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0RFVl9DT0hcdFx0MlxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfUkVTRVJWRURcdFx0XHQwXG4mIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX05PTkVcdFx0XHQxXG4mIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX0ZJTkVcdFx0XHQyXG4mIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX0NPQVJTRVx0XHRcdDNcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV80S0JcdDBcbiYjNDM7I2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzE2S0JcdDFcbiYjNDM7I2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzY0S0JcdDJcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIE5vdGUgbWFueSBvZiB0aGVzZSBmaWVsZHMgYXJlIHNtYWxsZXIgdGhhbiB1NjQgYnV0IGFsbCBmaWVsZHMgaGF2ZSB1NjRcbiYjNDM7ICogYWxpZ25tZW50LCBzbyB1c2UgdTY0IHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudC5cbiYjNDM7ICovXG4mIzQzO3N0cnVjdCBybW1fY29uZmlnIHtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTY0IHRyYWNraW5nX3JlZ2lvbl9zaXplO1xuJiM0MztcdFx0XHR1NjQgcm1pX2dyYW51bGVfc2l6ZTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBzaXplcltTWl80S107XG4mIzQzO1x0fTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBybW1fY29uZmlnKSA9PSBTWl80Syk7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0xQQTJcdFx0QklUKDApXG4mIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfU1ZFXHRcdEJJVCgxKVxuJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX1BNVVx0XHRCSVQoMilcbiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19EQVx0XHRcdEJJVCgzKVxuJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0xGQV9QT0xJQ1lcdFx0R0VOTUFTSyg2LCA1KVxuJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX01FQ19QT0xJQ1lcdFx0R0VOTUFTSyg4LCA3KVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfSEFTSF9TSEFfMjU2XHRcdFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9IQVNIX1NIQV81MTJcdFx0XHQxXG4mIzQzOyNkZWZpbmUgUk1JX0hBU0hfU0hBXzM4NFx0XHRcdDJcbiYjNDM7XG4mIzQzO3N0cnVjdCByZWFsbV9wYXJhbXMge1xuJiM0MztcdHVuaW9uIHsgLyogMHgwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1NjQgZmxhZ3MwO1xuJiM0MztcdFx0XHR1NjQgczJzejtcbiYjNDM7XHRcdFx0dTY0IHN2ZV92bDtcbiYjNDM7XHRcdFx0dTY0IG51bV9icHM7XG4mIzQzO1x0XHRcdHU2NCBudW1fd3BzO1xuJiM0MztcdFx0XHR1NjQgcG11X251bV9jdHJzO1xuJiM0MztcdFx0XHR1NjQgaGFzaF9hbGdvO1xuJiM0MztcdFx0XHR1NjQgbnVtX2F1eF9wbGFuZXM7XG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0dTggcGFkZGluZzBbMHg0MDBdO1xuJiM0MztcdH07XG4mIzQzO1x0dW5pb24geyAvKiAweDQwMCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTggcnB2WzY0XTtcbiYjNDM7XHRcdFx0dTY0IGF0c19wbGFuZTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nMVsweDQwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4ODAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1NjQgcGFkZGluZztcbiYjNDM7XHRcdFx0dTY0IHJ0dF9iYXNlO1xuJiM0MztcdFx0XHRzNjQgcnR0X2xldmVsX3N0YXJ0O1xuJiM0MztcdFx0XHR1NjQgcnR0X251bV9zdGFydDtcbiYjNDM7XHRcdFx0dTY0IGZsYWdzMTtcbiYjNDM7XHRcdFx0dTY0IGF1eF9ydHRfYmFzZVszXTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nMlsweDgwMF07XG4mIzQzO1x0fTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWFsbV9wYXJhbXMpID09IFNaXzRLKTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSBudW1iZXIgb2YgR1BScyAoc3RhcnRpbmcgZnJvbSBYMCkgdGhhdCBhcmVcbiYjNDM7ICogY29uZmlndXJlZCBieSB0aGUgaG9zdCB3aGVuIGEgUkVDIGlzIGNyZWF0ZWQuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIFJFQ19DUkVBVEVfTlJfR1BSU1x0XHQ4XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJFQ19QQVJBTVNfRkxBR19SVU5OQUJMRVx0QklUX1VMTCgwKVxuJiM0MztcbiYjNDM7c3RydWN0IHJlY19wYXJhbXMge1xuJiM0MztcdHVuaW9uIHsgLyogMHgwICovXG4mIzQzO1x0XHR1NjQgZmxhZ3M7XG4mIzQzO1x0XHR1OCBwYWRkaW5nMFsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MTAwICovXG4mIzQzO1x0XHR1NjQgbXBpZHI7XG4mIzQzO1x0XHR1OCBwYWRkaW5nMVsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MjAwICovXG4mIzQzO1x0XHR1NjQgcGM7XG4mIzQzO1x0XHR1OCBwYWRkaW5nMlsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MzAwICovXG4mIzQzO1x0XHR1NjQgZ3Byc1tSRUNfQ1JFQVRFX05SX0dQUlNdO1xuJiM0MztcdFx0dTggcGFkZGluZzNbMHhkMDBdO1xuJiM0MztcdH07XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3BhcmFtcykgPT0gU1pfNEspO1xuJiM0MztcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19FTVVMQVRFRF9NTUlPXHRCSVQoMClcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19JTkpFQ1RfU0VBXHRCSVQoMSlcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGSVx0XHRCSVQoMilcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGRVx0XHRCSVQoMylcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19SSVBBU19SRVNQT05TRVx0QklUKDQpXG4mIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfUzJBUF9SRVNQT05TRVx0QklUKDUpXG4mIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfREVWX01FTV9SRVNQT05TRVx0QklUKDYpXG4mIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfRk9SQ0VfUDBcdFx0QklUKDcpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJFQ19SVU5fR1BSU1x0XHRcdDMxXG4mIzQzOyNkZWZpbmUgUkVDX01BWF9HSUNfTlVNX0xSU1x0XHQxNlxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfUEVSTUlUVEVEX0dJQ1YzX0hDUl9CSVRTXHQoSUNIX0hDUl9FTDJfVUlFIHxcdFx0XFxcbiYjNDM7XHRcdFx0XHRcdCBJQ0hfSENSX0VMMl9MUkVOUElFIHxcdFx0XFxcbiYjNDM7XHRcdFx0XHRcdCBJQ0hfSENSX0VMMl9OUElFIHxcdFx0XFxcbiYjNDM7XHRcdFx0XHRcdCBJQ0hfSENSX0VMMl9WR3JwMEVJRSB8XHRcdFxcXG4mIzQzO1x0XHRcdFx0XHQgSUNIX0hDUl9FTDJfVkdycDBESUUgfFx0XHRcXFxuJiM0MztcdFx0XHRcdFx0IElDSF9IQ1JfRUwyX1ZHcnAxRUlFIHxcdFx0XFxcbiYjNDM7XHRcdFx0XHRcdCBJQ0hfSENSX0VMMl9WR3JwMURJRSB8XHRcdFxcXG4mIzQzO1x0XHRcdFx0XHQgSUNIX0hDUl9FTDJfVERJUilcbiYjNDM7XG4mIzQzO3N0cnVjdCByZWNfZW50ZXIge1xuJiM0MztcdHVuaW9uIHsgLyogMHgwMDAgKi9cbiYjNDM7XHRcdHU2NCBmbGFncztcbiYjNDM7XHRcdHU4IHBhZGRpbmcwWzB4MjAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHgyMDAgKi9cbiYjNDM7XHRcdHU2NCBncHJzW1JFQ19SVU5fR1BSU107XG4mIzQzO1x0XHR1OCBwYWRkaW5nMVsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1OCBwYWRkaW5nM1sweDUwMF07XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2VudGVyKSA9PSBTWl8ySyk7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1NZTkNcdFx0XHQweDAwXG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfSVJRXHRcdFx0MHgwMVxuJiM0MzsjZGVmaW5lIFJNSV9FWElUX0ZJUVx0XHRcdDB4MDJcbiYjNDM7I2RlZmluZSBSTUlfRVhJVF9QU0NJXHRcdFx0MHgwM1xuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1JJUEFTX0NIQU5HRVx0XHQweDA0XG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfSE9TVF9DQUxMXHRcdDB4MDVcbiYjNDM7I2RlZmluZSBSTUlfRVhJVF9TRVJST1JcdFx0XHQweDA2XG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfUzJBUF9DSEFOR0VcdFx0MHgwN1xuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1ZERVZfVkFMSURBVEVfTUFQUElOR1x0MHgwOFxuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1ZTTU1VX0NPTU1BTkRcdFx0MHgwYVxuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1ZERVZfUDJQX0JJTkRJTkdcdDB4MGJcbiYjNDM7XG4mIzQzO3N0cnVjdCByZWNfZXhpdCB7XG4mIzQzO1x0dW5pb24geyAvKiAweDAwMCAqL1xuJiM0MztcdFx0dTggZXhpdF9yZWFzb247XG4mIzQzO1x0XHR1OCBwYWRkaW5nMFsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MTAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1NjQgZXNyO1xuJiM0MztcdFx0XHR1NjQgZmFyO1xuJiM0MztcdFx0XHR1NjQgaHBmYXI7XG4mIzQzO1x0XHRcdHU2NCBydHRfdHJlZTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nMVsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MjAwICovXG4mIzQzO1x0XHR1NjQgZ3Byc1tSRUNfUlVOX0dQUlNdO1xuJiM0MztcdFx0dTggcGFkZGluZzJbMHgxMDBdO1xuJiM0MztcdH07XG4mIzQzO1x0dW5pb24geyAvKiAweDMwMCAqL1xuJiM0MztcdFx0dTggcGFkZGluZzNbMHgxMDBdO1xuJiM0MztcdH07XG4mIzQzO1x0dW5pb24geyAvKiAweDQwMCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTY0IGNudHBfY3RsO1xuJiM0MztcdFx0XHR1NjQgY250cF9jdmFsO1xuJiM0MztcdFx0XHR1NjQgY250dl9jdGw7XG4mIzQzO1x0XHRcdHU2NCBjbnR2X2N2YWw7XG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0dTggcGFkZGluZzRbMHgxMDBdO1xuJiM0MztcdH07XG4mIzQzO1x0dW5pb24geyAvKiAweDUwMCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTY0IHJpcGFzX2Jhc2U7XG4mIzQzO1x0XHRcdHU2NCByaXBhc190b3A7XG4mIzQzO1x0XHRcdHU4IHJpcGFzX3ZhbHVlO1xuJiM0MztcdFx0XHR1OCBwYWRkaW5nOFsxNV07XG4mIzQzO1x0XHRcdHU2NCBzMmFwX2Jhc2U7XG4mIzQzO1x0XHRcdHU2NCBzMmFwX3RvcDtcbiYjNDM7XHRcdFx0dTY0IHZkZXZfaWRfMTtcbiYjNDM7XHRcdFx0dTY0IHZkZXZfaWRfMjtcbiYjNDM7XHRcdFx0dTY0IGRldl9tZW1fYmFzZTtcbiYjNDM7XHRcdFx0dTY0IGRldl9tZW1fdG9wO1xuJiM0MztcdFx0XHR1NjQgZGV2X21lbV9wYTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nNVsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4NjAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1MTYgaW1tO1xuJiM0MztcdFx0XHR1MTYgcGFkZGluZzk7XG4mIzQzO1x0XHRcdHU2NCBwbGFuZTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nNlsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4NzAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1OCBwbXVfb3ZmX3N0YXR1cztcbiYjNDM7XHRcdFx0dTggcGFkZGluZzEwWzE1XTtcbiYjNDM7XHRcdFx0dTY0IHZzbW11O1xuJiM0MztcdFx0fTtcbiYjNDM7XHRcdHU4IHBhZGRpbmc3WzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19leGl0KSA9PSBTWl8ySyk7XG4mIzQzO1xuJiM0MztzdHJ1Y3QgcmVjX3J1biB7XG4mIzQzO1x0c3RydWN0IHJlY19lbnRlciBlbnRlcjtcbiYjNDM7XHRzdHJ1Y3QgcmVjX2V4aXQgZXhpdDtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfcnVuKSA9PSBTWl80Syk7XG4mIzQzO1xuJiM0MzsvKiBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi9cbiYjNDM7I2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfT0FERFJfVFlQRVx0R0VOTUFTSygxLCAwKVxuJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UXHRHRU5NQVNLKDE1LCAyKVxuJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19NRU1BVFRSXHRHRU5NQVNLKDE4LCAxNilcbiYjNDM7I2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfUzJBUFx0XHRHRU5NQVNLKDIyLCAxOSlcbiYjNDM7XG4mIzQzOy8qIFJNSV9SVFRfREFUQV9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi9cbiYjNDM7I2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX09BRERSX1RZUEVcdEdFTk1BU0soMSwgMClcbiYjNDM7I2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX0xJU1RfQ09VTlRcdEdFTk1BU0soMTUsIDIpXG4mIzQzO1xuJiM0MzsvKiBTMkFQIERpcmVjdCBFbmNvZGluZ3MsIHVzZWQgaW4gUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX1MyQVAgKi9cbiYjNDM7I2RlZmluZSBSTUlfUzJBUF9ESVJFQ1RfV1JJVEVcdFx0XHRCSVQoMClcbiYjNDM7I2RlZmluZSBSTUlfUzJBUF9ESVJFQ1RfUkVBRFx0XHRcdEJJVCgxKVxuJiM0MztcbiYjNDM7I2VuZGlmIC8qIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IXyAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDIxOjI5PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgaG9zdC1zaWRlIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIGxpYnJhcnkgZnVuY3Rpb25zIGFuZCBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gZm9yIEtWTSB0byB1c2UuIEhvd2V2ZXIsIEtWTSBzdXBwb3J0IGZvciBSZWFsbXMgaXMgbm90IGluY2x1ZGVkIGluIHRoaXMgcGF0Y2gsIG1ha2luZyB0aGUgZXhwb3J0ZWQgbGlicmFyeSBmdW5jdGlvbnMgdW5yZWFjaGFibGUgZnJvbSB1c2VyLXNwYWNlLiBGdXJ0aGVybW9yZSwgdGhlIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiByZXF1aXJlcyBzcGVjaWZpYyBoYXJkd2FyZS9maXJtd2FyZSAoUk1NKSBzdXBwb3J0IHRoYXQgaXMgbm90IHByZXNlbnQgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLCBhbmQgaXQgd2lsbCBzaW1wbHkgYmFpbCBvdXQgZWFybHkuIFRoZXJlIGFyZSBubyBzeXNjYWxscywgaW9jdGxzLCBvciBvdGhlciB1c2VyLXNwYWNlIGludGVyZmFjZXMgaW50cm9kdWNlZCB0aGF0IHN5emthbGxlciBjb3VsZCBmdXp6LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLApldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXQKICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LAogICBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgOWNhMzQ3NDQ1YzZjYWNjOWJhMGM4MDgxMTZmYmNkOGRjMDc5MDExOQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBXZWQgSnVsIDE1IDIxOjI5OjUyIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29uZmlnCmluZGV4IGIzYWZlMDY4ODkxOWJkLi4wZjE5NTZlZGYxMzA3YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQvS2NvbmZpZwpAQCAtMzgsNiAmIzQzOzM4LDcgQEAgY29uZmlnIEFSTTY0CiAJc2VsZWN0IEFSQ0hfSEFTX01FTUJBUlJJRVJfU1lOQ19DT1JFCiAJc2VsZWN0IEFSQ0hfSEFTX01FTV9FTkNSWVBUCiAJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNFQUxfU1lTVEVNX01BUFBJTkdTCiYjNDM7CXNlbGVjdCBBUkNIX1NVUFBPUlRTX1JNTQogCXNlbGVjdCBBUkNIX0hBU19OTUlfU0FGRV9USElTX0NQVV9PUFMKIAlzZWxlY3QgQVJDSF9IQVNfTk9OX09WRVJMQVBQSU5HX0FERFJFU1NfU1BBQ0UKIAlzZWxlY3QgQVJDSF9IQVNfTk9OTEVBRl9QTURfWU9VTkcgaWYgQVJNNjRfSEFGVApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi5mMTNlY2RiNDBkZWQ0MQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaApAQCAtMCwwICYjNDM7MSw0NTkgQEAKJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLwomIzQzOy8qCiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC4KJiM0MzsgKi8KJiM0MzsKJiM0MzsjaWZuZGVmIF9fQVNNX1JNSV9DTURTX0gKJiM0MzsjZGVmaW5lIF9fQVNNX1JNSV9DTURTX0gKJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYXJtLXJtaS1jbWRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2FybS1zbWNjYy1ybWkuaCZndDsKJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X2RhdGFfbWFwX2luaXQoKSAtIENyZWF0ZSBhIHByb3RlY3RlZCBtYXBwaW5nIHdpdGggZGF0YSBjb250ZW50cwomIzQzOyAqIEByZDogUEEgb2YgdGhlIFJECiYjNDM7ICogQGRhdGE6IFBBIG9mIHRoZSB0YXJnZXQgZ3JhbnVsZQomIzQzOyAqIEBpcGE6IElQQSBhdCB3aGljaCB0aGUgZ3JhbnVsZSB3aWxsIGJlIG1hcHBlZCBpbiB0aGUgZ3Vlc3QKJiM0MzsgKiBAc3JjOiBQQSBvZiB0aGUgc291cmNlIGdyYW51bGUKJiM0MzsgKiBAZmxhZ3M6IFJNSV9NRUFTVVJFX0NPTlRFTlQgaWYgdGhlIGNvbnRlbnRzIHNob3VsZCBiZSBtZWFzdXJlZAomIzQzOyAqCiYjNDM7ICogQ3JlYXRlIGEgbWFwcGluZyBmcm9tIFByb3RlY3RlZCBJUEEgc3BhY2UgdG8gY29udmVudGlvbmFsIG1lbW9yeSwgY29weWluZwomIzQzOyAqIGNvbnRlbnRzIGZyb20gYSBOb24tc2VjdXJlIEdyYW51bGUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9kYXRhX21hcF9pbml0KHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgZGF0YSwKJiM0MzsJCQkJCXVuc2lnbmVkIGxvbmcgaXBhLCB1bnNpZ25lZCBsb25nIHNyYywKJiM0MzsJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9EQVRBX01BUF9JTklULCByZCwgZGF0YSwgaXBhLCBzcmMsIGZsYWdzCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJldHVybiBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3J0dF9kYXRhX21hcCgpIC0gQ3JlYXRlIG1hcHBpbmdzIGluIHByb3RlY3RlZCBJUEEgd2l0aCB1bmtub3duIGNvbnRlbnRzCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAYmFzZTogQmFzZSBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZQomIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZQomIzQzOyAqIEBmbGFnczogRmxhZ3MKJiM0MzsgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yCiYjNDM7ICogQG91dF90b3A6IFRvcCBhZGRyZXNzIG9mIHJhbmdlIHdoaWNoIHdhcyBwcm9jZXNzZWQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm4gUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9kYXRhX21hcCh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nIGJhc2UsCiYjNDM7CQkJCSAgIHVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nIG9hZGRyLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfREFUQV9NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkcgomIzQzOwl9OwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlyZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKG91dF90b3ApCiYjNDM7CQkqb3V0X3RvcCA9IHJlZ3MuYTE7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfZGF0YV91bm1hcCgpIC0gUmVtb3ZlIG1hcHBpbmdzIHRvIGNvbnZlbnRpb25hbCBtZW1vcnkKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCBSZWFsbQomIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlCiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlCiYjNDM7ICogQGZsYWdzOiBGbGFncwomIzQzOyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3IKJiM0MzsgKiBAb3V0X3RvcDogUmV0dXJucyB0b3AgSVBBIG9mIHJhbmdlIHdoaWNoIGhhcyBiZWVuIHVubWFwcGVkCiYjNDM7ICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2UKJiM0MzsgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0CiYjNDM7ICoKJiM0MzsgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIGNvbnZlbnRpb24gbWVtb3J5IHdpdGggYSB0YXJnZXQgUHJvdGVjdGVkIElQQSByYW5nZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9kYXRhX3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsCiYjNDM7CQkJCSAgICAgdW5zaWduZWQgbG9uZyBiYXNlLAomIzQzOwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiYjNDM7CQkJCSAgICAgdW5zaWduZWQgbG9uZyBvYWRkciwKJiM0MzsJCQkJICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wLAomIzQzOwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9yYW5nZSwKJiM0MzsJCQkJICAgICB1bnNpZ25lZCBsb25nICpvdXRfY291bnQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9EQVRBX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHIKJiM0MzsJfTsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChvdXRfdG9wKQomIzQzOwkJKm91dF90b3AgPSByZWdzLmExOwomIzQzOwlpZiAob3V0X3JhbmdlKQomIzQzOwkJKm91dF9yYW5nZSA9IHJlZ3MuYTI7CiYjNDM7CWlmIChvdXRfY291bnQpCiYjNDM7CQkqb3V0X2NvdW50ID0gcmVncy5hMzsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3BzY2lfY29tcGxldGUoKSAtIENvbXBsZXRlIHBlbmRpbmcgUFNDSSBjb21tYW5kCiYjNDM7ICogQGNhbGxpbmdfcmVjOiBQQSBvZiB0aGUgY2FsbGluZyBSRUMKJiM0MzsgKiBAc3RhdHVzOiBTdGF0dXMgb2YgdGhlIFBTQ0kgcmVxdWVzdAomIzQzOyAqCiYjNDM7ICogQ29tcGxldGVzIGEgcGVuZGluZyBQU0NJIGNvbW1hbmQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9wc2NpX2NvbXBsZXRlKHVuc2lnbmVkIGxvbmcgY2FsbGluZ19yZWMsCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nIHN0YXR1cykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfcmVzIHJlczsKJiM0MzsKJiM0MzsJYXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9QU0NJX0NPTVBMRVRFLCBjYWxsaW5nX3JlYywgc3RhdHVzLCAmYW1wO3Jlcyk7CiYjNDM7CiYjNDM7CXJldHVybiByZXMuYTA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9yZWFsbV9hY3RpdmF0ZSgpIC0gQWN0aXZlIGEgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqCiYjNDM7ICogTWFyayBhIHJlYWxtIGFzIEFjdGl2ZSBzaWduYWxsaW5nIHRoYXQgY3JlYXRpb24gaXMgY29tcGxldGUgYW5kIGFsbG93aW5nCiYjNDM7ICogZXhlY3V0aW9uIG9mIHRoZSByZWFsbS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX2FjdGl2YXRlKHVuc2lnbmVkIGxvbmcgcmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7CiYjNDM7CiYjNDM7CWFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUkVBTE1fQUNUSVZBVEUsIHJkLCAmYW1wO3Jlcyk7CiYjNDM7CiYjNDM7CXJldHVybiByZXMuYTA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9yZWFsbV9jcmVhdGUoKSAtIENyZWF0ZSBhIHJlYWxtCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAcGFyYW1zOiBQQSBvZiByZWFsbSBwYXJhbWV0ZXJzCiYjNDM7ICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWQKJiM0MzsgKgomIzQzOyAqIENyZWF0ZSBhIG5ldyByZWFsbSB1c2luZyB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHBhcmFtcywKJiM0MzsJCQkJICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybykKJiM0Mzt7CiYjNDM7CXJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwKJiM0MzsJCQkJICAgU01DX1JNSV9SRUFMTV9DUkVBVEUsIHJkLCBwYXJhbXMpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcmVhbG1fdGVybWluYXRlKCkgLSBUZXJtaW5hdGUgYSByZWFsbQomIzQzOyAqIEByZDogUEEgb2YgdGhlIFJECiYjNDM7ICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWQKJiM0MzsgKgomIzQzOyAqIFRlcm1pbmF0ZXMgYSByZWFsbSwgbW92aW5nIGl0IGludG8gYSBaT01CSUUgc3RhdGUKJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX3Rlcm1pbmF0ZSh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgICAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKQomIzQzO3sKJiM0MzsJcmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLAomIzQzOwkJCQkgICBTTUNfUk1JX1JFQUxNX1RFUk1JTkFURSwgcmQpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcmVhbG1fZGVzdHJveSgpIC0gRGVzdHJveSBhIHJlYWxtCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZAomIzQzOyAqCiYjNDM7ICogRGVzdHJveXMgYSByZWFsbSwgYWxsIG9iamVjdHMgYmVsb25naW5nIHRvIHRoZSByZWFsbSBtdXN0IGJlIGRlc3Ryb3llZCBmaXJzdC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX2Rlc3Ryb3kodW5zaWduZWQgbG9uZyByZCwKJiM0MzsJCQkJICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsCiYjNDM7CQkJCSAgIFNNQ19STUlfUkVBTE1fREVTVFJPWSwgcmQpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcmVjX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgUkVDCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQwomIzQzOyAqIEBwYXJhbXM6IFBBIG9mIFJFQyBwYXJhbWV0ZXJzCiYjNDM7ICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWQKJiM0MzsgKgomIzQzOyAqIENyZWF0ZSBhIFJFQyB1c2luZyB0aGUgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdCByZWNfcGFyYW1zIHBvaW50ZWQKJiM0MzsgKiB0byBieSBAcGFyYW1zLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcmVjX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgdW5zaWduZWQgbG9uZyByZWMsCiYjNDM7CQkJCSB1bnNpZ25lZCBsb25nIHBhcmFtcywKJiM0MzsJCQkJIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pCiYjNDM7ewomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwkqc3JvID0gKHN0cnVjdCBybWlfc3JvX3N0YXRlKXsucmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUkVDX0NSRUFURSwgcmQsIHJlYywgcGFyYW1zCiYjNDM7CX19OwomIzQzOwlyZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzcm8sIEdGUF9LRVJORUwpOwomIzQzOwlybWlfc3JvX2ZyZWUoc3JvKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3JlY19kZXN0cm95KCkgLSBEZXN0cm95IGEgUkVDCiYjNDM7ICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUMKJiM0MzsgKiBAc3JvOiBBbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZAomIzQzOyAqCiYjNDM7ICogRGVzdHJveXMgYSBSRUMuIFRoZSBSRUMgbXVzdCBub3QgYmUgcnVubmluZy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3JlY19kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmVjLAomIzQzOwkJCQkgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUkVDX0RFU1RST1ksIHJlYyk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9yZWNfZW50ZXIoKSAtIEVudGVyIGEgUkVDCiYjNDM7ICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUMKJiM0MzsgKiBAcnVuX3B0cjogUEEgb2YgUmVjUnVuIHN0cnVjdHVyZQomIzQzOyAqCiYjNDM7ICogU3RhcnRzIChvciBjb250aW51ZXMpIGV4ZWN1dGlvbiB3aXRoaW4gYSBSRUMuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9yZWNfZW50ZXIodW5zaWduZWQgbG9uZyByZWMsIHVuc2lnbmVkIGxvbmcgcnVuX3B0cikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfcmVzIHJlczsKJiM0MzsKJiM0MzsJYXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9SRUNfRU5URVIsIHJlYywgcnVuX3B0ciwgJmFtcDtyZXMpOwomIzQzOwomIzQzOwlyZXR1cm4gcmVzLmEwOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X2NyZWF0ZSgpIC0gQ3JlYXRlcyBhbiBSVFQKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBydHQ6IFBBIG9mIHRoZSB0YXJnZXQgUlRUCiYjNDM7ICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUCiYjNDM7ICogQGxldmVsOiBEZXB0aCBvZiB0aGUgUlRUIHdpdGhpbiB0aGUgdHJlZQomIzQzOyAqCiYjNDM7ICogQ3JlYXRlcyBhbiBSVFQgKFJlYWxtIFRyYW5zbGF0aW9uIFRhYmxlKSBhdCB0aGUgc3BlY2lmaWVkIGxldmVsIGZvciB0aGUKJiM0MzsgKiB0cmFuc2xhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGFkZHJlc3Mgd2l0aGluIHRoZSByZWFsbS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9jcmVhdGUodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBydHQsCiYjNDM7CQkJCSB1bnNpZ25lZCBsb25nIGlwYSwgbG9uZyBsZXZlbCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUlRUX0NSRUFURSwgcmQsIHJ0dCwgaXBhLCBsZXZlbAomIzQzOwl9OwomIzQzOwomIzQzOwlyZXR1cm4gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfZGVzdHJveSgpIC0gRGVzdHJveSBhbiBSVFQKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCByZWFsbQomIzQzOyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVAomIzQzOyAqIEBsZXZlbDogUlRUIGxldmVsCiYjNDM7ICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZAomIzQzOyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRoZSB0b3AgSVBBIG9mIG5vbi1saXZlIFJUVCBlbnRyaWVzLCBmcm9tIGVudHJ5CiYjNDM7ICogYXQgd2hpY2ggdGhlIFJUVCB3YWxrIHRlcm1pbmF0ZWQuCiYjNDM7ICoKJiM0MzsgKiBEZXN0cm95cyBhbiBSVFQuIFRoZSBSVFQgbXVzdCBiZSBub24tbGl2ZSwgaS5lLiBub25lIG9mIHRoZSBlbnRyaWVzIGluIHRoZQomIzQzOyAqIHRhYmxlIGFyZSBpbiBBU1NJR05FRCBvciBUQUJMRSBzdGF0ZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgIHVuc2lnbmVkIGxvbmcgaXBhLAomIzQzOwkJCQkgIGxvbmcgbGV2ZWwsCiYjNDM7CQkJCSAgdW5zaWduZWQgbG9uZyAqb3V0X3J0dCwKJiM0MzsJCQkJICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfREVTVFJPWSwgcmQsIGlwYSwgbGV2ZWwKJiM0MzsJfTsKJiM0MzsJaW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAob3V0X3J0dCkKJiM0MzsJCSpvdXRfcnR0ID0gcmVncy5hMTsKJiM0MzsJaWYgKG91dF90b3ApCiYjNDM7CQkqb3V0X3RvcCA9IHJlZ3MuYTI7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfZm9sZCgpIC0gRm9sZCBhbiBSVFQKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVAomIzQzOyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWUKJiM0MzsgKiBAb3V0X3J0dDogUG9pbnRlciB0byB3cml0ZSB0aGUgUEEgb2YgdGhlIFJUVCB3aGljaCB3YXMgZGVzdHJveWVkCiYjNDM7ICoKJiM0MzsgKiBGb2xkcyBhbiBSVFQuIElmIGFsbCBlbnRyaWVzIHdpdGggdGhlIFJUVCBhcmUgJiMzOTtob21vZ2VuZW91cyYjMzk7IHRoZSBSVFQgY2FuIGJlCiYjNDM7ICogZm9sZGVkIGludG8gdGhlIHBhcmVudCBhbmQgdGhlIFJUVCBkZXN0cm95ZWQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZm9sZCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGlwYSwKJiM0MzsJCQkgICAgICAgbG9uZyBsZXZlbCwgdW5zaWduZWQgbG9uZyAqb3V0X3J0dCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUlRUX0ZPTEQsIHJkLCBpcGEsIGxldmVsCiYjNDM7CX07CiYjNDM7CWludCByZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKG91dF9ydHQpCiYjNDM7CQkqb3V0X3J0dCA9IHJlZ3MuYTE7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfaW5pdF9yaXBhcygpIC0gU2V0IFJJUEFTIGZvciBuZXcgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRhcmdldCBJUEEgcmVnaW9uCiYjNDM7ICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uCiYjNDM7ICogQG91dF90b3A6IFRvcCBJUEEgb2YgcmFuZ2Ugd2hvc2UgUklQQVMgd2FzIG1vZGlmaWVkCiYjNDM7ICoKJiM0MzsgKiBTZXRzIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEEgcmFuZ2UgdG8gUkFNLCBmb3IgYSByZWFsbSBpbiB0aGUgTkVXIHN0YXRlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2luaXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBiYXNlLAomIzQzOwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdG9wLCB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfSU5JVF9SSVBBUywgcmQsIGJhc2UsIHRvcAomIzQzOwl9OwomIzQzOwlpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChvdXRfdG9wKQomIzQzOwkJKm91dF90b3AgPSByZWdzLmExOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X3VucHJvdF9tYXAoKSAtIE1hcCB1bnByb3RlY3RlZCBncmFudWxlcyBpbnRvIGEgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBiYXNlOiBCYXNlIElQQSBvZiB0aGUgbWFwcGluZwomIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZQomIzQzOyAqIEBmbGFnczogRmxhZ3MKJiM0MzsgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yCiYjNDM7ICogQG91dF90b3A6IFRvcCBJUEEgb2YgcmFuZ2Ugd2hpY2ggaGFzIGJlZW4gbWFwcGVkCiYjNDM7ICoKJiM0MzsgKiBDcmVhdGUgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfdW5wcm90X21hcCh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSwKJiM0MzsJCQkJICAgICB1bnNpZ25lZCBsb25nIHRvcCwKJiM0MzsJCQkJICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLAomIzQzOwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb2FkZHIsCiYjNDM7CQkJCSAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUlRUX1VOUFJPVF9NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkcgomIzQzOwl9OwomIzQzOwlpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChvdXRfdG9wKQomIzQzOwkJKm91dF90b3AgPSByZWdzLmExOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X3NldF9yaXBhcygpIC0gU2V0IFJJUEFTIGZvciBhbiBydW5uaW5nIHJlYWxtCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgUkVDIG1ha2luZyB0aGUgcmVxdWVzdAomIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRhcmdldCBJUEEgcmVnaW9uCiYjNDM7ICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uCiYjNDM7ICogQG91dF90b3A6IFBvaW50ZXIgdG8gd3JpdGUgdG9wIElQQSBvZiByYW5nZSB3aG9zZSBSSVBBUyB3YXMgbW9kaWZpZWQKJiM0MzsgKgomIzQzOyAqIENvbXBsZXRlcyBhIHJlcXVlc3QgbWFkZSBieSB0aGUgcmVhbG0gdG8gY2hhbmdlIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEEKJiM0MzsgKiByYW5nZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9zZXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyByZWMsCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUlRUX1NFVF9SSVBBUywgcmQsIHJlYywgYmFzZSwgdG9wCiYjNDM7CX07CiYjNDM7CWludCByZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKG91dF90b3ApCiYjNDM7CQkqb3V0X3RvcCA9IHJlZ3MuYTE7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfdW5wcm90X3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3Mgd2l0aGluIGFuIHVucHJvdGVjdGVkIElQQSByYW5nZQomIzQzOyAqIEByZDogUEEgb2YgdGhlIFJECiYjNDM7ICogQGJhc2U6IEJhc2UgSVBBIG9mIHRoZSBtYXBwaW5nCiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlCiYjNDM7ICogQGZsYWdzOiBGbGFncwomIzQzOyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3IKJiM0MzsgKiBAb3V0X3RvcDogVG9wIElQQSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZAomIzQzOyAqIEBvdXRfcmFuZ2U6IE91dHB1dCBhZGRyZXNzIHJhbmdlCiYjNDM7ICogQG91dF9jb3VudDogTnVtYmVyIG9mIGVudHJpZXMgaW4gb3V0cHV0IGFkZHJlc3MgbGlzdAomIzQzOyAqCiYjNDM7ICogUmVtb3ZlcyBtYXBwaW5ncyB0byBtZW1vcnkgd2l0aGluIGEgdGFyZ2V0IHVucHJvdGVjdGVkIElQQSByYW5nZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF91bnByb3RfdW5tYXAodW5zaWduZWQgbG9uZyByZCwKJiM0MzsJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSwKJiM0MzsJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywKJiM0MzsJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgb2FkZHIsCiYjNDM7CQkJCSAgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wLAomIzQzOwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3JhbmdlLAomIzQzOwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X2NvdW50KQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHIKJiM0MzsJfTsKJiM0MzsJaW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAob3V0X3RvcCkKJiM0MzsJCSpvdXRfdG9wID0gcmVncy5hMTsKJiM0MzsJaWYgKG91dF9yYW5nZSkKJiM0MzsJCSpvdXRfcmFuZ2UgPSByZWdzLmEyOwomIzQzOwlpZiAob3V0X2NvdW50KQomIzQzOwkJKm91dF9jb3VudCA9IHJlZ3MuYTM7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOyNlbmRpZiAvKiBfX0FTTV9STUlfQ01EU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMKaW5kZXggOWEyMmRmMGM1MTIwZjMuLjRhZTYzYzg5Y2RhOTdkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jCkBAIC0yOTMsNiAmIzQzOzI5Myw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRpc2FyM1tdID0gewogc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NHBmcjBbXSA9IHsKIAlBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0NTVjNfU0hJRlQsIDQsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQ1NWMl9TSElGVCwgNCwgMCksCiYjNDM7CUFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfUk1FX1NISUZULCA0LCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfVklTSUJMRSwgRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9ESVRfU0hJRlQsIDQsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQU1VX1NISUZULCA0LCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX01QQU1fU0hJRlQsIDQsIDApLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnCmluZGV4IDEyZGM3MDI1NDg0MmNlLi41NTU0Mjg3OWZiYjhhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZwpAQCAtMzAxLDUgJiM0MzszMDEsNiBAQCBzb3VyY2UgJiMzNDtkcml2ZXJzL2Zpcm13YXJlL3NhbXN1bmcvS2NvbmZpZyYjMzQ7CiBzb3VyY2UgJiMzNDtkcml2ZXJzL2Zpcm13YXJlL3NtY2NjL0tjb25maWcmIzM0Owogc291cmNlICYjMzQ7ZHJpdmVycy9maXJtd2FyZS90ZWdyYS9LY29uZmlnJiMzNDsKIHNvdXJjZSAmIzM0O2RyaXZlcnMvZmlybXdhcmUveGlsaW54L0tjb25maWcmIzM0OwomIzQzO3NvdXJjZSAmIzM0O2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnJiMzNDsKIAogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUKaW5kZXggNGRkZWMyODIwYzk2ZmEuLjA3ZThjYTE3ODliNDllIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUKQEAgLTM4LDMgJiM0MzszOCw0IEBAIG9iai15CQkJCSYjNDM7PSBzYW1zdW5nLwogb2JqLXkJCQkJJiM0Mzs9IHNtY2NjLwogb2JqLXkJCQkJJiM0Mzs9IHRlZ3JhLwogb2JqLXkJCQkJJiM0Mzs9IHhpbGlueC8KJiM0MztvYmoteQkJCQkmIzQzOz0gYXJtX3JtbS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLmQyMjRhNzJjY2E5MDg5Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWcKQEAgLTAsMCAmIzQzOzEsMjIgQEAKJiM0MzsKJiM0Mztjb25maWcgQVJDSF9TVVBQT1JUU19STU0KJiM0MzsJYm9vbAomIzQzOwomIzQzO2NvbmZpZyBBUk1fUk1NCiYjNDM7CWJvb2wgJiMzNDtSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3IgKFJNTSkgU3VwcG9ydCYjMzQ7CiYjNDM7CWRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19STU0KJiM0MzsJZGVmYXVsdCB5CiYjNDM7CWhlbHAKJiM0MzsJICBTdXBwb3J0IHRoZSBSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3IgKFJNTSkgb24gQXJtIHN5c3RlbXMgdGhhdAomIzQzOwkgIGltcGxlbWVudCB0aGUgUmVhbG0gTWFuYWdlbWVudCBFeHRlbnNpb24gKFJNRSksIGFzIGRlZmluZWQgYnkgdGhlCiYjNDM7CSAgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZS4KJiM0MzsKJiM0MzsJICBUaGUgUk1NIHJ1bnMgaW4gdGhlIFJlYWxtIHdvcmxkIGFuZCBwcm92aWRlcyB0aGUgUmVhbG0gTWFuYWdlbWVudAomIzQzOwkgIEludGVyZmFjZSAoUk1JKSB1c2VkIGJ5IGEgTm9ybWFsIFdvcmxkIGhvc3QgdG8gY3JlYXRlLCBtYW5hZ2UgYW5kIHJ1bgomIzQzOwkgIHByb3RlY3RlZCB2aXJ0dWFsIG1hY2hpbmVzIGNhbGxlZCBSZWFsbXMuIFRoaXMgb3B0aW9uIGJ1aWxkcyB0aGUKJiM0MzsJICBob3N0LXNpZGUgUk1JIHN1cHBvcnQgdXNlZCBieSBLVk0gdG8gZGV0ZWN0IGEgY29tcGF0aWJsZSBSTU0sCiYjNDM7CSAgY29uZmlndXJlIGl0LCBtYW5hZ2UgZGVsZWdhdGVkIG1lbW9yeSBhbmQgZW5hYmxlIFJlYWxtIGd1ZXN0cy4KJiM0MzsKJiM0MzsJICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gZG9lcyBub3QgYnkgaXRzZWxmIG1ha2UgUmVhbG0gZ3Vlc3RzIGF2YWlsYWJsZToKJiM0MzsJICB0aGUgc3lzdGVtIG11c3QgYWxzbyBwcm92aWRlIFJNRS1jYXBhYmxlIGhhcmR3YXJlIGFuZCBmaXJtd2FyZSB3aXRoIGEKJiM0MzsJICBjb21wYXRpYmxlIFJNTSBpbXBsZW1lbnRhdGlvbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uNTFhZWY1Y2MwNGIwMmMKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGUKQEAgLTAsMCAmIzQzOzEsMiBAQAomIzQzOwomIzQzO29iai0kKENPTkZJR19BUk1fUk1NKQk9IHJtaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLmQwYzA4M2JkZjI1MWY0Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jCkBAIC0wLDAgJiM0MzsxLDcyNCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLgomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9jcHVmZWF0dXJlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21lbWJsb2NrLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2FybS1ybWktY21kcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9wcm9jZXNzb3IuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc2xhYi5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDthc20vbWVtb3J5LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9wZ3RhYmxlLWh3ZGVmLmgmZ3Q7CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgYXJtNjRfcm1pX2lzX2F2YWlsYWJsZTsKJiM0MzsKJiM0MzsvKiBDdXJyZW50bHkgb25seSB0aGUgZmlyc3QgMiByZWdpc3RlcnMgYXJlIHVzZWQgYnkgTGludXggKi8KJiM0MzsjZGVmaW5lIFJNSV9GRUFUX1JFR19DT1VOVAkyCiYjNDM7c3RhdGljIF9fcm9fYWZ0ZXJfaW5pdCB1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZ19jYWNoZVtSTUlfRkVBVF9SRUdfQ09VTlRdOwomIzQzOwomIzQzO3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaWQpCiYjNDM7ewomIzQzOwlpZiAoV0FSTl9PTihpZCAmZ3Q7PSBSTUlfRkVBVF9SRUdfQ09VTlQpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXJldHVybiBybWlfZmVhdF9yZWdfY2FjaGVbaWRdOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfZmVhdF9yZWcpOwomIzQzOwomIzQzO2ludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywKJiM0MzsJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsCiYjNDM7CQkgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyByZXQgPSAwOwomIzQzOwl1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgJiM0Mzsgc2l6ZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBvdXRfdG9wOwomIzQzOwomIzQzOwl3aGlsZSAocGh5cyAmbHQ7IHRvcCkgewomIzQzOwkJcmV0ID0gcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUocGh5cywgdG9wLCAmYW1wO291dF90b3ApOwomIzQzOwkJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUykKJiM0MzsJCQlwaHlzID0gb3V0X3RvcDsKJiM0MzsJCWVsc2UgaWYgKHJldCA9PSBSTUlfQlVTWSB8fCByZXQgPT0gUk1JX0JMT0NLRUQpCiYjNDM7CQkJY3B1X3JlbGF4KCk7CiYjNDM7CQllbHNlCiYjNDM7CQkJYnJlYWs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG91dF9waHlzKQomIzQzOwkJKm91dF9waHlzID0gcGh5czsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX2RlbGVnYXRlX3JhbmdlKTsKJiM0MzsKJiM0MztpbnQgcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywKJiM0MzsJCQkgdW5zaWduZWQgbG9uZyBzaXplKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyByZXQgPSAwOwomIzQzOwl1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgJiM0Mzsgc2l6ZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBvdXRfdG9wOwomIzQzOwomIzQzOwl3aGlsZSAocGh5cyAmbHQ7IHRvcCkgewomIzQzOwkJcmV0ID0gcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZShwaHlzLCB0b3AsICZhbXA7b3V0X3RvcCk7CiYjNDM7CQlpZiAocmV0ID09IFJNSV9TVUNDRVNTKQomIzQzOwkJCXBoeXMgPSBvdXRfdG9wOwomIzQzOwkJZWxzZSBpZiAocmV0ID09IFJNSV9CVVNZIHx8IHJldCA9PSBSTUlfQkxPQ0tFRCkKJiM0MzsJCQljcHVfcmVsYXgoKTsKJiM0MzsJCWVsc2UKJiM0MzsJCQlicmVhazsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfdW5kZWxlZ2F0ZV9yYW5nZSk7CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgZG9uYXRlX3JlcV90b19zaXplKHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTsKJiM0MzsKJiM0MzsJcmV0dXJuIEJJVChBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUKDMgLSB1bml0X3NpemUpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcm1pX3NtY2NjX2ludm9rZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzX2luLAomIzQzOwkJCSAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVnc19vdXQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSAqcmVnc19pbjsKJiM0MzsJdW5zaWduZWQgbG9uZyBzdGF0dXM7CiYjNDM7CiYjNDM7CXdoaWxlICgxKSB7CiYjNDM7CQlhcm1fc21jY2NfMV8yX2ludm9rZSgmYW1wO3JlZ3MsIHJlZ3Nfb3V0KTsKJiM0MzsJCXN0YXR1cyA9IFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3Nfb3V0LSZndDthMCk7CiYjNDM7CQlpZiAoc3RhdHVzICE9IFJNSV9CVVNZICZhbXA7JmFtcDsgc3RhdHVzICE9IFJNSV9CTE9DS0VEKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJY3B1X3JlbGF4KCk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX2NvbnRpbnVlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBmbGFncywKJiM0MzsJCQkgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX09QX0NPTlRJTlVFLCBzcm9faGFuZGxlLCBmbGFncwomIzQzOwl9OwomIzQzOwomIzQzOwlybWlfc21jY2NfaW52b2tlKCZhbXA7cmVncywgb3V0X3JlZ3MpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBybWlfb3BfY2FuY2VsKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwKJiM0MzsJCQkgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9PUF9DQU5DRUwsIHNyb19oYW5kbGUKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3JlZ3MsIG91dF9yZWdzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX21lbV9kb25hdGUodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLCB1bnNpZ25lZCBsb25nIGxpc3RfYWRkciwKJiM0MzsJCQkgICAgICB1bnNpZ25lZCBsb25nIGxpc3RfY291bnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiYjNDM7CQkJICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX09QX01FTV9ET05BVEUsIHNyb19oYW5kbGUsIGxpc3RfYWRkciwgbGlzdF9jb3VudCwgZmxhZ3MKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3JlZ3MsIG91dF9yZWdzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX21lbV9yZWNsYWltKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwKJiM0MzsJCQkgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsCiYjNDM7CQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9jb3VudCwKJiM0MzsJCQkgICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnQKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3JlZ3MsIG91dF9yZWdzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cykKJiM0Mzt7CiYjNDM7CWlmIChXQVJOX09OX09OQ0Uocm1pX3VuZGVsZWdhdGVfcGFnZShwaHlzKSkpIHsKJiM0MzsJCS8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovCiYjNDM7CQlyZXR1cm4gLUVCVVNZOwomIzQzOwl9CiYjNDM7CiYjNDM7CWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQocGh5cykpOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwoZnJlZV9kZWxlZ2F0ZWRfcGFnZSk7CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nIGNvdW50KQomIzQzO3sKJiM0MzsJaWYgKFdBUk5fT05fT05DRShzcm8tJmd0O2FkZHJfY291bnQgJmd0OyBSTUlfTUFYX0FERFJfTElTVCkpCiYjNDM7CQlyZXR1cm4gLUVPVkVSRkxPVzsKJiM0MzsKJiM0MzsJaWYgKGNvdW50ICZndDsgUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tJmd0O2FkZHJfY291bnQpCiYjNDM7CQlyZXR1cm4gLUVOT1NQQzsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sCiYjNDM7CQkJCSB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsCiYjNDM7CQkJCSB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSwKJiM0MzsJCQkJIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLAomIzQzOwkJCQkgZ2ZwX3QgZ2ZwKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyB1bml0X3NpemVfYnl0ZXMgPSBkb25hdGVfcmVxX3RvX3NpemUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzaXplID0gdW5pdF9zaXplX2J5dGVzICogY291bnQ7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYWRkcl9yYW5nZTsKJiM0MzsJaW50IHJldDsKJiM0MzsJdm9pZCAqdmlydDsKJiM0MzsJcGh5c19hZGRyX3QgcGh5czsKJiM0MzsKJiM0MzsJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBzcm8tJmd0O2FkZHJfY291bnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLSZndDthZGRyX2xpc3RbaV07CiYjNDM7CiYjNDM7CQlpZiAoUk1JX0FERFJfUkFOR0VfU0laRShlbnRyeSkgPT0gdW5pdF9zaXplICZhbXA7JmFtcDsKJiM0MzsJCSAgICBSTUlfQUREUl9SQU5HRV9DT1VOVChlbnRyeSkgPT0gY291bnQgJmFtcDsmYW1wOwomIzQzOwkJICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgSVNfQUxJR05FRChSTUlfQUREUl9SQU5HRV9BRERSKGVudHJ5KSwgc2l6ZSkpIHsKJiM0MzsJCQlzcm8tJmd0O2FkZHJfY291bnQtLTsKJiM0MzsJCQlzd2FwKHNyby0mZ3Q7YWRkcl9saXN0W3Nyby0mZ3Q7YWRkcl9jb3VudF0sCiYjNDM7CQkJICAgICBzcm8tJmd0O2FkZHJfbGlzdFtpXSk7CiYjNDM7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gcm1pX3Nyb19lbnN1cmVfY2FwYWNpdHkoc3JvLCAxKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXZpcnQgPSBhbGxvY19wYWdlc19leGFjdChzaXplLCBnZnApOwomIzQzOwlpZiAoIXZpcnQpCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsJcGh5cyA9IHZpcnRfdG9fcGh5cyh2aXJ0KTsKJiM0MzsKJiM0MzsJaWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7CiYjNDM7CQlwaHlzX2FkZHJfdCBkZWxlZ2F0ZWRfcGh5czsKJiM0MzsKJiM0MzsJCWlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgc2l6ZSwgJmFtcDtkZWxlZ2F0ZWRfcGh5cykpIHsKJiM0MzsJCQlpZiAoIXJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIGRlbGVnYXRlZF9waHlzIC0gcGh5cykpCiYjNDM7CQkJCWZyZWVfcGFnZXNfZXhhY3QodmlydCwgc2l6ZSk7CiYjNDM7CQkJcmV0dXJuIC1FTlhJTzsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlhZGRyX3JhbmdlID0gcGh5cyAmYW1wOyBSTUlfQUREUl9SQU5HRV9BRERSX01BU0s7CiYjNDM7CUZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TSVpFX01BU0ssICZhbXA7YWRkcl9yYW5nZSwgdW5pdF9zaXplKTsKJiM0MzsJRklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssICZhbXA7YWRkcl9yYW5nZSwgY291bnQpOwomIzQzOwlGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTSywgJmFtcDthZGRyX3JhbmdlLCBzdGF0ZSk7CiYjNDM7CiYjNDM7CXNyby0mZ3Q7YWRkcl9saXN0W3Nyby0mZ3Q7YWRkcl9jb3VudF0gPSBhZGRyX3JhbmdlOwomIzQzOwomIzQzO291dDoKJiM0MzsJcm1pX29wX21lbV9kb25hdGUoc3JvX2hhbmRsZSwKJiM0MzsJCQkgIHZpcnRfdG9fcGh5cygmYW1wO3Nyby0mZ3Q7YWRkcl9saXN0W3Nyby0mZ3Q7YWRkcl9jb3VudF0pLCAxLAomIzQzOwkJCSAgMCwgb3V0X3JlZ3MpOwomIzQzOwomIzQzOwl1bnNpZ25lZCBsb25nIGRvbmF0ZWRfZ3JhbnVsZXMgPSBvdXRfcmVncy0mZ3Q7YTE7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplID0gZG9uYXRlZF9ncmFudWxlcyAmbHQ7Jmx0OyBQQUdFX1NISUZUOwomIzQzOwomIzQzOwlpZiAoZG9uYXRlZF9ncmFudWxlcyA9PSAwKSB7CiYjNDM7CQkvKiBObyBwYWdlcyB1c2VkIGJ5IHRoZSBSTU0gKi8KJiM0MzsJCXNyby0mZ3Q7YWRkcl9jb3VudCYjNDM7JiM0Mzs7CiYjNDM7CX0gZWxzZSBpZiAoZG9uYXRlZF9zaXplICZsdDsgc2l6ZSkgewomIzQzOwkJcGh5cyA9IHNyby0mZ3Q7YWRkcl9saXN0W3Nyby0mZ3Q7YWRkcl9jb3VudF0gJmFtcDsgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLOwomIzQzOwomIzQzOwkJLyogTm90IGFsbCBncmFudWxlcyB1c2VkIGJ5IHRoZSBSTU0sIGZyZWUgdGhlIHJlbWFpbmluZyBwYWdlcyAqLwomIzQzOwkJZm9yIChsb25nIGkgPSBkb25hdGVkX3NpemU7IGkgJmx0OyBzaXplOyBpICYjNDM7PSBQQUdFX1NJWkUpIHsKJiM0MzsJCQlpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpCiYjNDM7CQkJCWZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyAmIzQzOyBpKTsKJiM0MzsJCQllbHNlCiYjNDM7CQkJCV9fZnJlZV9wYWdlKHBoeXNfdG9fcGFnZShwaHlzICYjNDM7IGkpKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfc3JvX2RvbmF0ZV9ub25jb250aWcoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLAomIzQzOwkJCQkgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MsCiYjNDM7CQkJCSAgICBnZnBfdCBnZnApCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9ET05BVEVfU0laRShkb25hdGVyZXEpOwomIzQzOwl1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZV9ieXRlcyA9IGRvbmF0ZV9yZXFfdG9fc2l6ZShkb25hdGVyZXEpOwomIzQzOwl1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0RPTkFURV9DT1VOVChkb25hdGVyZXEpOwomIzQzOwl1bnNpZ25lZCBsb25nIHN0YXRlID0gUk1JX0RPTkFURV9TVEFURShkb25hdGVyZXEpOwomIzQzOwl1bnNpZ25lZCBsb25nIGZvdW5kID0gMDsKJiM0MzsJdW5zaWduZWQgbG9uZyBhZGRyX2xpc3Rfc3RhcnQgPSBzcm8tJmd0O2FkZHJfY291bnQ7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWZvciAoaW50IGkgPSAwOyBpICZsdDsgYWRkcl9saXN0X3N0YXJ0ICZhbXA7JmFtcDsgZm91bmQgJmx0OyBjb3VudDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tJmd0O2FkZHJfbGlzdFtpXTsKJiM0MzsKJiM0MzsJCWlmIChSTUlfQUREUl9SQU5HRV9TSVpFKGVudHJ5KSA9PSB1bml0X3NpemUgJmFtcDsmYW1wOwomIzQzOwkJICAgIFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KSA9PSAxICZhbXA7JmFtcDsKJiM0MzsJCSAgICBSTUlfQUREUl9SQU5HRV9TVEFURShlbnRyeSkgPT0gc3RhdGUpIHsKJiM0MzsJCQlhZGRyX2xpc3Rfc3RhcnQtLTsKJiM0MzsJCQlzd2FwKHNyby0mZ3Q7YWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydF0sCiYjNDM7CQkJICAgICBzcm8tJmd0O2FkZHJfbGlzdFtpXSk7CiYjNDM7CQkJZm91bmQmIzQzOyYjNDM7OwomIzQzOwkJCWktLTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIGNvdW50IC0gZm91bmQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJd2hpbGUgKGZvdW5kICZsdDsgY291bnQpIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkcl9yYW5nZTsKJiM0MzsJCXZvaWQgKnZpcnQgPSBhbGxvY19wYWdlc19leGFjdCh1bml0X3NpemVfYnl0ZXMsIGdmcCk7CiYjNDM7CQlwaHlzX2FkZHJfdCBwaHlzOwomIzQzOwomIzQzOwkJaWYgKCF2aXJ0KQomIzQzOwkJCXJldHVybiAtRU5PTUVNOwomIzQzOwomIzQzOwkJcGh5cyA9IHZpcnRfdG9fcGh5cyh2aXJ0KTsKJiM0MzsKJiM0MzsJCWlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCkgewomIzQzOwkJCXBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzOwomIzQzOwomIzQzOwkJCWlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgdW5pdF9zaXplX2J5dGVzLAomIzQzOwkJCQkJICAgICAgICZhbXA7ZGVsZWdhdGVkX3BoeXMpKSB7CiYjNDM7CQkJCWlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSkKJiM0MzsJCQkJCWZyZWVfcGFnZXNfZXhhY3QodmlydCwgdW5pdF9zaXplX2J5dGVzKTsKJiM0MzsJCQkJcmV0dXJuIC1FTlhJTzsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlhZGRyX3JhbmdlID0gcGh5cyAmYW1wOyBSTUlfQUREUl9SQU5HRV9BRERSX01BU0s7CiYjNDM7CQlGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCAmYW1wO2FkZHJfcmFuZ2UsIHVuaXRfc2l6ZSk7CiYjNDM7CQlGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTSywgJmFtcDthZGRyX3JhbmdlLCAxKTsKJiM0MzsJCUZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCAmYW1wO2FkZHJfcmFuZ2UsIHN0YXRlKTsKJiM0MzsKJiM0MzsJCXNyby0mZ3Q7YWRkcl9saXN0W3Nyby0mZ3Q7YWRkcl9jb3VudCYjNDM7JiM0MztdID0gYWRkcl9yYW5nZTsKJiM0MzsJCWZvdW5kJiM0MzsmIzQzOzsKJiM0MzsJfQomIzQzOwomIzQzOwlybWlfb3BfbWVtX2RvbmF0ZShzcm9faGFuZGxlLAomIzQzOwkJCSAgdmlydF90b19waHlzKCZhbXA7c3JvLSZndDthZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSksCiYjNDM7CQkJICBmb3VuZCwgMCwgb3V0X3JlZ3MpOwomIzQzOwomIzQzOwl1bnNpZ25lZCBsb25nIGRvbmF0ZWRfZ3JhbnVsZXMgPSBvdXRfcmVncy0mZ3Q7YTE7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZ3JhbnVsZXNfcGVyX3VuaXQgPSB1bml0X3NpemVfYnl0ZXMgJmd0OyZndDsgUEFHRV9TSElGVDsKJiM0MzsJdW5zaWduZWQgbG9uZyBjb25zdW1lZF91bml0czsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIFJNTSBzaG91bGRuJiMzOTt0IHJlcG9ydCBtb3JlIGdyYW51bGVzIHRoYW4gd2UgcHJvdmlkZWQsIGJ1dCBjbGFtcAomIzQzOwkgKiBqdXN0IGluIGNhc2UuCiYjNDM7CSAqLwomIzQzOwlpZiAoV0FSTl9PTl9PTkNFKGRvbmF0ZWRfZ3JhbnVsZXMgJmd0OyBmb3VuZCAqIGdyYW51bGVzX3Blcl91bml0KSkKJiM0MzsJCWRvbmF0ZWRfZ3JhbnVsZXMgPSBmb3VuZCAqIGdyYW51bGVzX3Blcl91bml0OwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgUk1NIHJlcG9ydHMgdGhlIGNvbnN1bWVkIG1lbW9yeSBpbiB0ZXJtcyBvZiBncmFudWxlcywgYnV0IHdlCiYjNDM7CSAqIHRyYWNrIGluIHRoZSBhZGRyZXNzIGxpc3RzIGluIHVuaXQtc2l6ZWQgcmFuZ2VzLiBTbyBkaXZpZGUgdG8gZ2V0CiYjNDM7CSAqIHRoZSBudW1iZXIgb2YgKGNvbXBsZXRlKSBjb25zdW1lZCB1bml0cy4KJiM0MzsJICovCiYjNDM7CWNvbnN1bWVkX3VuaXRzID0gZG9uYXRlZF9ncmFudWxlcyAvIGdyYW51bGVzX3Blcl91bml0OwomIzQzOwlpZiAoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl91bml0KSB7CiYjNDM7CQkvKgomIzQzOwkJICogQSB1bml0IGhhcyBiZWVuIHBhcnRpYWxseSBjb25zdW1lZCwgdGhlIHN0YXJ0IGlzIG93bmVkIGJ5CiYjNDM7CQkgKiB0aGUgUk1NLCB0aGUgdGFpbCBpcyBvd25lZCBieSB0aGUgaG9zdAomIzQzOwkJICovCiYjNDM7CQl1bnNpZ25lZCBsb25nIGVudHJ5ID0KJiM0MzsJCQlzcm8tJmd0O2FkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgJiM0MzsgY29uc3VtZWRfdW5pdHNdOwomIzQzOwkJcGh5c19hZGRyX3QgcGh5cyA9IFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpOwomIzQzOwkJdW5zaWduZWQgbG9uZyBkb25hdGVkX3NpemUgPQomIzQzOwkJCShkb25hdGVkX2dyYW51bGVzICUgZ3JhbnVsZXNfcGVyX3VuaXQpICZsdDsmbHQ7IFBBR0VfU0hJRlQ7CiYjNDM7CiYjNDM7CQkvKiBGcmVlIHRoZSB0YWlsIGJhY2sgKi8KJiM0MzsJCWZvciAodW5zaWduZWQgbG9uZyBpID0gZG9uYXRlZF9zaXplOyBpICZsdDsgdW5pdF9zaXplX2J5dGVzOwomIzQzOwkJICAgICBpICYjNDM7PSBQQUdFX1NJWkUpIHsKJiM0MzsJCQlpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpCiYjNDM7CQkJCWZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyAmIzQzOyBpKTsKJiM0MzsJCQllbHNlCiYjNDM7CQkJCV9fZnJlZV9wYWdlKHBoeXNfdG9fcGFnZShwaHlzICYjNDM7IGkpKTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiBUaGlzIHVuaXQgaXMgbm93IGZ1bGx5ICYjMzk7Y29uc3VtZWQmIzM5OyAoZWl0aGVyIGhlbGQgYnkgdGhlIFJNTSBvcgomIzQzOwkJICogZnJlZWQpCiYjNDM7CQkgKi8KJiM0MzsJCWNvbnN1bWVkX3VuaXRzJiM0MzsmIzQzOzsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBLZWVwIGp1c3QgdGhlIHVuaXRzIHRoZSBSTU0gZGlkbiYjMzk7dCB1c2UgaW4gYWRkcl9saXN0ICovCiYjNDM7CWZvciAodW5zaWduZWQgbG9uZyBpID0gY29uc3VtZWRfdW5pdHM7IGkgJmx0OyBmb3VuZDsgaSYjNDM7JiM0MzspCiYjNDM7CQlzcm8tJmd0O2FkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgJiM0MzsgaSAtIGNvbnN1bWVkX3VuaXRzXSA9CiYjNDM7CQkJc3JvLSZndDthZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0ICYjNDM7IGldOwomIzQzOwomIzQzOwlzcm8tJmd0O2FkZHJfY291bnQgLT0gY29uc3VtZWRfdW5pdHM7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sCiYjNDM7CQkJICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsCiYjNDM7CQkJICB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSwKJiM0MzsJCQkgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MsCiYjNDM7CQkJICBnZnBfdCBnZnApCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0RPTkFURV9DT1VOVChkb25hdGVyZXEpOwomIzQzOwomIzQzOwlpZiAoV0FSTl9PTl9PTkNFKCFjb3VudCkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJaWYgKFJNSV9ET05BVEVfQ09OVElHKGRvbmF0ZXJlcSkpIHsKJiM0MzsJCXJldHVybiBybWlfc3JvX2RvbmF0ZV9jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsCiYjNDM7CQkJCQkgICAgIHJlZ3MsIGdmcCk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlyZXR1cm4gcm1pX3Nyb19kb25hdGVfbm9uY29udGlnKHNybywgc3JvX2hhbmRsZSwgZG9uYXRlcmVxLAomIzQzOwkJCQkJCXJlZ3MsIGdmcCk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfc3JvX3JlY2xhaW0oc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywKJiM0MzsJCQkgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsCiYjNDM7CQkJICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIGNhcGFjaXR5OwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcm1pX3Nyb19mcmVlKHNybyk7CiYjNDM7CiYjNDM7CWNhcGFjaXR5ID0gUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tJmd0O2FkZHJfY291bnQ7CiYjNDM7CiYjNDM7CXJtaV9vcF9tZW1fcmVjbGFpbShzcm9faGFuZGxlLAomIzQzOwkJCSAgIHZpcnRfdG9fcGh5cygmYW1wO3Nyby0mZ3Q7YWRkcl9saXN0W3Nyby0mZ3Q7YWRkcl9jb3VudF0pLAomIzQzOwkJCSAgIGNhcGFjaXR5LCBvdXRfcmVncyk7CiYjNDM7CiYjNDM7CWlmIChXQVJOX09OX09OQ0Uob3V0X3JlZ3MtJmd0O2ExICZndDsgY2FwYWNpdHkpKQomIzQzOwkJb3V0X3JlZ3MtJmd0O2ExID0gY2FwYWNpdHk7CiYjNDM7CiYjNDM7CXNyby0mZ3Q7YWRkcl9jb3VudCAmIzQzOz0gb3V0X3JlZ3MtJmd0O2ExOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCBybWlfc3JvX2ZyZWUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybykKJiM0Mzt7CiYjNDM7CWZvciAoaW50IGkgPSAwOyBpICZsdDsgc3JvLSZndDthZGRyX2NvdW50OyBpJiM0MzsmIzQzOykgewomIzQzOwkJdW5zaWduZWQgbG9uZyBlbnRyeSA9IHNyby0mZ3Q7YWRkcl9saXN0W2ldOwomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyID0gUk1JX0FERFJfUkFOR0VfQUREUihlbnRyeSk7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9BRERSX1JBTkdFX1NJWkUoZW50cnkpOwomIzQzOwkJdW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgc3RhdGUgPSBSTUlfQUREUl9SQU5HRV9TVEFURShlbnRyeSk7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHNpemUgPSBkb25hdGVfcmVxX3RvX3NpemUodW5pdF9zaXplKSAqIGNvdW50OwomIzQzOwomIzQzOwkJaWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7CiYjNDM7CQkJaWYgKFdBUk5fT05fT05DRShybWlfdW5kZWxlZ2F0ZV9yYW5nZShhZGRyLCBzaXplKSkpIHsKJiM0MzsJCQkJLyogTGVhayB0aGUgcGFnZXMgKi8KJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwkJZnJlZV9wYWdlc19leGFjdChwaHlzX3RvX3ZpcnQoYWRkciksIHNpemUpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXNyby0mZ3Q7YWRkcl9jb3VudCA9IDA7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fZnJlZSk7CiYjNDM7CiYjNDM7dW5zaWduZWQgbG9uZyBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLCBnZnBfdCBnZnApCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIHNyb19oYW5kbGU7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MgPSAmYW1wO3Nyby0mZ3Q7cmVnczsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZShyZWdzLCByZWdzKTsKJiM0MzsKJiM0MzsJc3JvX2hhbmRsZSA9IHJlZ3MtJmd0O2ExOwomIzQzOwomIzQzOwl3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy0mZ3Q7YTApID09IFJNSV9JTkNPTVBMRVRFKSB7CiYjNDM7CQlib29sIGNhbl9jYW5jZWwgPSBSTUlfUkVUVVJOX0NBTl9DQU5DRUwocmVncy0mZ3Q7YTApOwomIzQzOwkJaW50IHJldCA9IDA7CiYjNDM7CiYjNDM7CQlzd2l0Y2ggKFJNSV9SRVRVUk5fTUVNUkVRKHJlZ3MtJmd0O2EwKSkgewomIzQzOwkJY2FzZSBSTUlfT1BfTUVNX1JFUV9OT05FOgomIzQzOwkJCXJtaV9vcF9jb250aW51ZShzcm9faGFuZGxlLCBSTUlfQ09OVElOVUVfS0VFUF9HT0lORywKJiM0MzsJCQkJCXJlZ3MpOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSBSTUlfT1BfTUVNX1JFUV9ET05BVEU6CiYjNDM7CQkJcmV0ID0gcm1pX3Nyb19kb25hdGUoc3JvLCBzcm9faGFuZGxlLCByZWdzLSZndDthMiwgcmVncywKJiM0MzsJCQkJCSAgICAgZ2ZwKTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCWNhc2UgUk1JX09QX01FTV9SRVFfUkVDTEFJTToKJiM0MzsJCQlyZXQgPSBybWlfc3JvX3JlY2xhaW0oc3JvLCBzcm9faGFuZGxlLCByZWdzKTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCWRlZmF1bHQ6CiYjNDM7CQkJcmV0ID0gV0FSTl9PTl9PTkNFKDEpOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJfQomIzQzOwomIzQzOwkJaWYgKHJldCkgewomIzQzOwkJCWlmIChjYW5fY2FuY2VsKQomIzQzOwkJCQlybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpOwomIzQzOwomIzQzOwkJCWlmIChXQVJOX09OX09OQ0UoUk1JX1JFVFVSTl9TVEFUVVMocmVncy0mZ3Q7YTApICE9IFJNSV9JTkNPTVBMRVRFKSkKJiM0MzsJCQkJcmV0dXJuIHJldDsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gcmVncy0mZ3Q7YTA7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKTsKJiM0MzsKJiM0MzsvKiBGb3IgUk1JIGNvbW1hbmRzIHRoYXQgYXJlIHN0YXRlZnVsIGJ1dCBub3QgbWVtb3J5LXRyYW5zZmVycmluZyAqLwomIzQzO3Vuc2lnbmVkIGxvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIHNyb19oYW5kbGU7CiYjNDM7CiYjNDM7CXJtaV9zbWNjY19pbnZva2UocmVncywgcmVncyk7CiYjNDM7CiYjNDM7CXNyb19oYW5kbGUgPSByZWdzLSZndDthMTsKJiM0MzsKJiM0MzsJd2hpbGUgKFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3MtJmd0O2EwKSA9PSBSTUlfSU5DT01QTEVURSkgewomIzQzOwkJYm9vbCBjYW5fY2FuY2VsID0gUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJlZ3MtJmd0O2EwKTsKJiM0MzsKJiM0MzsJCXN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy0mZ3Q7YTApKSB7CiYjNDM7CQljYXNlIFJNSV9PUF9NRU1fUkVRX05PTkU6CiYjNDM7CQkJcm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLAomIzQzOwkJCQkJcmVncyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlkZWZhdWx0OgomIzQzOwkJCVdBUk5fT05fT05DRSgxKTsKJiM0MzsJCQlpZiAoIWNhbl9jYW5jZWwpCiYjNDM7CQkJCXJldHVybiByZWdzLSZndDthMDsKJiM0MzsKJiM0MzsJCQlybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiByZWdzLSZndDthMDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19leGVjdXRlKTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9jaGVja192ZXJzaW9uKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7CiYjNDM7CXVuc2lnbmVkIHNob3J0IHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3I7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaG9zdF92ZXJzaW9uID0gUk1JX0FCSV9WRVJTSU9OKFJNSV9BQklfTUFKT1JfVkVSU0lPTiwKJiM0MzsJCQkJCQkgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYWE2NHBmcjAgPSByZWFkX3Nhbml0aXNlZF9mdHJfcmVnKFNZU19JRF9BQTY0UEZSMF9FTDEpOwomIzQzOwomIzQzOwkvKiBJZiBSTUUgaXNuJiMzOTt0IHN1cHBvcnRlZCwgdGhlbiBSTUkgY2FuJiMzOTt0IGJlICovCiYjNDM7CWlmIChjcHVpZF9mZWF0dXJlX2V4dHJhY3RfdW5zaWduZWRfZmllbGQoYWE2NHBmcjAsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQpID09IDApCiYjNDM7CQlyZXR1cm4gLUVOWElPOwomIzQzOwomIzQzOwlhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1ZFUlNJT04sIGhvc3RfdmVyc2lvbiwgJmFtcDtyZXMpOwomIzQzOwomIzQzOwlpZiAocmVzLmEwID09IFNNQ0NDX1JFVF9OT1RfU1VQUE9SVEVEKQomIzQzOwkJcmV0dXJuIC1FTlhJTzsKJiM0MzsKJiM0MzsJdmVyc2lvbl9tYWpvciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IocmVzLmExKTsKJiM0MzsJdmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmExKTsKJiM0MzsKJiM0MzsJaWYgKHJlcy5hMCAhPSBSTUlfU1VDQ0VTUykgewomIzQzOwkJdW5zaWduZWQgc2hvcnQgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3I7CiYjNDM7CiYjNDM7CQloaWdoX3ZlcnNpb25fbWFqb3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHJlcy5hMik7CiYjNDM7CQloaWdoX3ZlcnNpb25fbWlub3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHJlcy5hMik7CiYjNDM7CiYjNDM7CQlwcl9lcnIoJiMzNDtVbnN1cHBvcnRlZCBSTUkgQUJJICh2JWQuJWQgLSB2JWQuJWQpIHdlIHdhbnQgdiVkLiVkXG4mIzM0OywKJiM0MzsJCSAgICAgICB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yLAomIzQzOwkJICAgICAgIGhpZ2hfdmVyc2lvbl9tYWpvciwgaGlnaF92ZXJzaW9uX21pbm9yLAomIzQzOwkJICAgICAgIFJNSV9BQklfTUFKT1JfVkVSU0lPTiwKJiM0MzsJCSAgICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pOwomIzQzOwkJcmV0dXJuIC1FTlhJTzsKJiM0MzsJfQomIzQzOwomIzQzOwlwcl9pbmZvKCYjMzQ7Uk1JIEFCSSB2ZXJzaW9uICVkLiVkXG4mIzM0OywgdmVyc2lvbl9tYWpvciwgdmVyc2lvbl9taW5vcik7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9yZWFkX2ZlYXR1cmVzKHZvaWQpCiYjNDM7ewomIzQzOwkvKgomIzQzOwkgKiBTaW5jZSB3ZSYjMzk7dmUgbmVnb3RpYXRlZCBhIGNvbXBhdGlibGUgdmVyc2lvbiB0aGVzZSBmZWF0dXJlIHJlZ2lzdGVycwomIzQzOwkgKiBzaG91bGQgYWx3YXlzIGJlIGF2YWlsYWJsZQomIzQzOwkgKi8KJiM0MzsJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBSTUlfRkVBVF9SRUdfQ09VTlQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoV0FSTl9PTihybWlfZmVhdHVyZXMoaSwgJmFtcDtybWlfZmVhdF9yZWdfY2FjaGVbaV0pKSkKJiM0MzsJCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfY29uZmlndXJlKHZvaWQpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIHJldDsKJiM0MzsJc3RydWN0IHJtbV9jb25maWcgKmNvbmZpZyBfX2ZyZWUoZnJlZV9wYWdlKSA9IChzdHJ1Y3Qgcm1tX2NvbmZpZyAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKJiM0MzsJc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyBfX2ZyZWUoa2ZyZWUpID0gKHN0cnVjdCBybWlfc3JvX3N0YXRlICopa21hbGxvY19vYmooKnNybyk7CiYjNDM7CiYjNDM7CWlmICghY29uZmlnIHx8ICFzcm8pCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJc3dpdGNoIChQQUdFX1NJWkUpIHsKJiM0MzsJY2FzZSBTWl80SzoKJiM0MzsJCWNvbmZpZy0mZ3Q7cm1pX2dyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNEtCOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgU1pfMTZLOgomIzQzOwkJY29uZmlnLSZndDtybWlfZ3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV8xNktCOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgU1pfNjRLOgomIzQzOwkJY29uZmlnLSZndDtybWlfZ3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV82NEtCOwomIzQzOwkJYnJlYWs7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlCVUlMRF9CVUcoKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBGb3Igbm93IHdlIHNldCB0aGUgdHJhY2tpbmdfcmVnaW9uX3NpemUgdG8gMCB3aGljaCBpcyB0aGUgb25seSBvcHRpb24KJiM0MzsJICogZm9yIDRLQiBQQUdFX1NJWkUgKDFHQiBmb3IgNEtCIFBBR0VfU0laRSwgMzJNQi81MTJNQiBmb3IgMTZLQi82NEtCKS4KJiM0MzsJICogVE9ETzogU3VwcG9ydCBvdGhlciB0cmFja2luZyBzaXplcyB2aWEgS2NvbmZpZyBvcHRpb24gZm9yIG90aGVyCiYjNDM7CSAqIFBBR0VfU0laRVMKJiM0MzsJICovCiYjNDM7CWNvbmZpZy0mZ3Q7dHJhY2tpbmdfcmVnaW9uX3NpemUgPSAwOwomIzQzOwomIzQzOwlyZXQgPSBybWlfcm1tX2NvbmZpZ19zZXQodmlydF90b19waHlzKGNvbmZpZykpOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlwcl9lcnIoJiMzNDtSTU0gY29uZmlnIHNldCBmYWlsZWRcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IHJtaV9ybW1fYWN0aXZhdGUoc3JvKTsKJiM0MzsJaWYgKHJldCkgewomIzQzOwkJcHJfZXJyKCYjMzQ7Uk1NIGFjdGl2YXRlIGZhaWxlZFxuJiMzNDspOwomIzQzOwkJcmV0dXJuIC1FTlhJTzsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBNYWtlIHN1cmUgdGhlIGFyZWEgaXMgdHJhY2tlZCBieSBSTU0gYXQgRklORSBncmFudWxhcml0eS4KJiM0MzsgKiBXZSBkbyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aGUgdHJhY2tpbmcgeWV0LgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZCkKJiM0Mzt7CiYjNDM7CXdoaWxlIChzdGFydCAmbHQ7IGVuZCkgewomIzQzOwkJdW5zaWduZWQgbG9uZyByZXQsIGNhdGVnb3J5LCBzdGF0ZSwgbmV4dDsKJiM0MzsKJiM0MzsJCXJldCA9IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldChzdGFydCwgZW5kLCAmYW1wO2NhdGVnb3J5LCAmYW1wO3N0YXRlLCAmYW1wO25leHQpOwomIzQzOwkJaWYgKHJldCAhPSBSTUlfU1VDQ0VTUyB8fAomIzQzOwkJICAgIHN0YXRlICE9IFJNSV9UUkFDS0lOR19GSU5FIHx8CiYjNDM7CQkgICAgY2F0ZWdvcnkgIT0gUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUwpIHsKJiM0MzsJCQkvKiBUT0RPOiBTZXQgZ3JhbnVsZSB0cmFja2luZyBpbiB0aGlzIGNhc2UgKi8KJiM0MzsJCQlwcl9lcnIoJiMzNDtHcmFudWxlIHRyYWNraW5nIGZvciByZWdpb24gaXNuJiMzOTt0IGZpbmUvY29udmVudGlvbmFsOiAlbGx4XG4mIzM0OywKJiM0MzsJCQkgICAgICAgc3RhcnQpOwomIzQzOwkJCXJldHVybiAtRU5PREVWOwomIzQzOwkJfQomIzQzOwkJc3RhcnQgPSBuZXh0OwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9jcmVhdGVfZ3B0cyhwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKQomIzQzO3sKJiM0MzsJc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybzsKJiM0MzsJdW5zaWduZWQgbG9uZyBsMGdwdF9zejsKJiM0MzsKJiM0MzsJc3JvID0ga21hbGxvY19vYmooKnNybywgR0ZQX0tFUk5FTCk7CiYjNDM7CWlmICghc3JvKQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiYjNDM7CWwwZ3B0X3N6ID0gMVVMICZsdDsmbHQ7ICgzMCAmIzQzOyBGSUVMRF9HRVQoUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9MMEdQVFNaLAomIzQzOwkJCQkJICBybWlfZmVhdF9yZWcoMSkpKTsKJiM0MzsJc3RhcnQgPSBBTElHTl9ET1dOKHN0YXJ0LCBsMGdwdF9zeik7CiYjNDM7CWVuZCA9IEFMSUdOKGVuZCwgbDBncHRfc3opOwomIzQzOwomIzQzOwl3aGlsZSAoc3RhcnQgJmx0OyBlbmQpIHsKJiM0MzsJCWludCByZXQgPSBybWlfZ3B0X2wxX2NyZWF0ZShzdGFydCwgc3JvLCBHRlBfS0VSTkVMKTsKJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiBNYWtlIHN1cmUgdGhlIEwxIEdQVCB0YWJsZXMgYXJlIGNyZWF0ZWQgZm9yIHRoZSByZWdpb24uCiYjNDM7CQkgKiBSTUlfRVJST1JfR1BUIGluZGljYXRlcyB0aGUgTDEgdGFibGUgYWxyZWFkeSBleGlzdHMuCiYjNDM7CQkgKi8KJiM0MzsJCWlmIChyZXQgIT0gUk1JX1NVQ0NFU1MgJmFtcDsmYW1wOyBSTUlfUkVUVVJOX1NUQVRVUyhyZXQpICE9IFJNSV9FUlJPUl9HUFQpIHsKJiM0MzsJCQlwcl9lcnIoJiMzNDtHUFQgTGV2ZWwxIHRhYmxlIG1pc3NpbmcgZm9yICVsbHhcbiYjMzQ7LCBzdGFydCk7CiYjNDM7CQkJa2ZyZWUoc3JvKTsKJiM0MzsJCQlyZXR1cm4gLUVOT01FTTsKJiM0MzsJCX0KJiM0MzsJCXN0YXJ0ICYjNDM7PSBsMGdwdF9zejsKJiM0MzsJfQomIzQzOwomIzQzOwlrZnJlZShzcm8pOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfaW5pdF9tZXRhZGF0YSh2b2lkKQomIzQzO3sKJiM0MzsJcGh5c19hZGRyX3Qgc3RhcnQsIGVuZDsKJiM0MzsJY29uc3Qgc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcjsKJiM0MzsKJiM0MzsJZm9yX2VhY2hfbWVtX3JlZ2lvbihyKSB7CiYjNDM7CQlpbnQgcmV0OwomIzQzOwomIzQzOwkJc3RhcnQgPSBtZW1ibG9ja19yZWdpb25fbWVtb3J5X2Jhc2VfcGZuKHIpICZsdDsmbHQ7IFBBR0VfU0hJRlQ7CiYjNDM7CQllbmQgPSBtZW1ibG9ja19yZWdpb25fbWVtb3J5X2VuZF9wZm4ocikgJmx0OyZsdDsgUEFHRV9TSElGVDsKJiM0MzsJCXJldCA9IHJtaV92ZXJpZnlfbWVtb3J5X3RyYWNraW5nKHN0YXJ0LCBlbmQpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwkJcmV0ID0gcm1pX2NyZWF0ZV9ncHRzKHN0YXJ0LCBlbmQpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0Mztib29sIGlzX3JtaV9hdmFpbGFibGUodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBhcm02NF9ybWlfaXNfYXZhaWxhYmxlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IF9faW5pdCBhcm02NF9pbml0X3JtaSh2b2lkKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJLyogQ29udGludWUgd2l0aG91dCByZWFsbSBzdXBwb3J0IGlmIHdlIGNhbiYjMzk7dCBhZ3JlZSBvbiBhIHZlcnNpb24gKi8KJiM0MzsJcmV0ID0gcm1pX2NoZWNrX3ZlcnNpb24oKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IHJtaV9yZWFkX2ZlYXR1cmVzKCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBybWlfY29uZmlndXJlKCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBybWlfaW5pdF9tZXRhZGF0YSgpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJYXJtNjRfcm1pX2lzX2F2YWlsYWJsZSA9IHRydWU7CiYjNDM7CXByX2luZm8oJiMzNDtSTUkgY29uZmlndXJlZCYjMzQ7KTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogTm90ZSBhcm02NF9pbml0X3JtaSgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBrdm1faW5pdF9ybWkoKSBvdGhlcndpc2UgS1ZNCiYjNDM7ICogd2lsbCBub3Qgc3VwcG9ydCByZWFsbSBndWVzdHMuIHN1YnN5c19pbml0Y2FsbCgpIGlzIGNhbGxlZCBiZWZvcmUKJiM0MzsgKiBtb2R1bGVfaW5pdCgpICh1c2VkIGZvciBLVk0pIHNvIHRoaXMgaXMgT0suCiYjNDM7ICovCiYjNDM7c3Vic3lzX2luaXRjYWxsKGFybTY0X2luaXRfcm1pKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmggYi9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi4xMzg5ODNhYjRlM2MyMgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmgKQEAgLTAsMCAmIzQzOzEsMjA1IEBACiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KJiM0MzsvKgomIzQzOyAqIENvcHlyaWdodCAoQykgMjAyNiBBUk0gTHRkLgomIzQzOyAqLwomIzQzOwomIzQzOyNpZm5kZWYgX19MSU5VWF9BUk1fUk1JX0NNRFNfSF8KJiM0MzsjZGVmaW5lIF9fTElOVVhfQVJNX1JNSV9DTURTX0hfCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2FybS1zbWNjYy1ybWkuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnVnLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9wYWdlLmgmZ3Q7CiYjNDM7CiYjNDM7c3RydWN0IHJ0dF9lbnRyeSB7CiYjNDM7CXVuc2lnbmVkIGxvbmcgd2Fsa19sZXZlbDsKJiM0MzsJdW5zaWduZWQgbG9uZyBkZXNjOwomIzQzOwlpbnQgc3RhdGU7CiYjNDM7CWludCByaXBhczsKJiM0Mzt9OwomIzQzOwomIzQzOyNkZWZpbmUgUk1JX01BWF9BRERSX0xJU1QJMjU2CiYjNDM7CiYjNDM7c3RydWN0IHJtaV9zcm9fc3RhdGUgewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3M7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYWRkcl9jb3VudDsKJiM0MzsJdW5zaWduZWQgbG9uZyBhZGRyX2xpc3RbUk1JX01BWF9BRERSX0xJU1RdOwomIzQzO307CiYjNDM7CiYjNDM7dW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWcodW5zaWduZWQgbG9uZyBpZCk7CiYjNDM7CiYjNDM7aW50IHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUsCiYjNDM7CQkgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKTsKJiM0MztpbnQgcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplKTsKJiM0MztpbnQgZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzX2FkZHJfdCBwaHlzKTsKJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfZGVsZWdhdGVfcGFnZShwaHlzX2FkZHJfdCBwaHlzKQomIzQzO3sKJiM0MzsJcmV0dXJuIHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCBQQUdFX1NJWkUsIE5VTEwpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfdW5kZWxlZ2F0ZV9wYWdlKHBoeXNfYWRkcl90IHBoeXMpCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7Ym9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpOwomIzQzOwomIzQzO3Vuc2lnbmVkIGxvbmcgcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywgZ2ZwX3QgZ2ZwKTsKJiM0Mzt2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKTsKJiM0Mzt1bnNpZ25lZCBsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKTsKJiM0MzsKJiM0MzsjZGVmaW5lIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBnZnAsIC4uLikgKHsJCQkJXAomIzQzOwlzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqX19zcm8gPSAoc3JvKTsJCQkJXAomIzQzOwkqX19zcm8gPSAoc3RydWN0IHJtaV9zcm9fc3RhdGUpeyAucmVncyA9IHtfX1ZBX0FSR1NfX30gfTsJXAomIzQzOwlpbnQgX19yZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShfX3NybywgZ2ZwKTsJCVwKJiM0MzsJcm1pX3Nyb19mcmVlKF9fc3JvKTsJCQkJCQlcCiYjNDM7CV9fcmV0OwkJCQkJCQkJXAomIzQzO30pCiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3JtbV9jb25maWdfc2V0KCkgLSBDb25maWd1cmUgdGhlIFJNTQomIzQzOyAqIEBjZmdfcHRyOiBQQSBvZiBhIHN0cnVjdCBybW1fY29uZmlnCiYjNDM7ICoKJiM0MzsgKiBTZXRzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiB0aGUgUk1NLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcm1tX2NvbmZpZ19zZXQodW5zaWduZWQgbG9uZyBjZmdfcHRyKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY19yZXMgcmVzOwomIzQzOwomIzQzOwlhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1JNTV9DT05GSUdfU0VULCBjZmdfcHRyLCAmYW1wO3Jlcyk7CiYjNDM7CiYjNDM7CXJldHVybiByZXMuYTA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ybW1fYWN0aXZhdGUoKSAtIEFjdGl2YXRlIHRoZSBSTU0KJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZAomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcm1tX2FjdGl2YXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUk1NX0FDVElWQVRFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KCkgLSBHZXQgY29uZmlndXJhdGlvbiBvZiBhIEdyYW51bGUgdHJhY2tpbmcgcmVnaW9uCiYjNDM7ICogQHN0YXJ0OiBCYXNlIFBBIG9mIHRoZSB0cmFja2luZyByZWdpb24KJiM0MzsgKiBAZW5kOiBFbmQgb2YgdGhlIFBBIHJlZ2lvbgomIzQzOyAqIEBvdXRfY2F0ZWdvcnk6IE1lbW9yeSBjYXRlZ29yeQomIzQzOyAqIEBvdXRfc3RhdGU6IFRyYWNraW5nIHJlZ2lvbiBzdGF0ZQomIzQzOyAqIEBvdXRfdG9wOiBUb3Agb2YgdGhlIG1lbW9yeSByZWdpb24KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KHVuc2lnbmVkIGxvbmcgc3RhcnQsCiYjNDM7CQkJCQkgICB1bnNpZ25lZCBsb25nIGVuZCwKJiM0MzsJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm91dF9jYXRlZ29yeSwKJiM0MzsJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm91dF9zdGF0ZSwKJiM0MzsJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7CiYjNDM7CiYjNDM7CWFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVQsIHN0YXJ0LCBlbmQsICZhbXA7cmVzKTsKJiM0MzsKJiM0MzsJaWYgKG91dF9jYXRlZ29yeSkKJiM0MzsJCSpvdXRfY2F0ZWdvcnkgPSByZXMuYTE7CiYjNDM7CWlmIChvdXRfc3RhdGUpCiYjNDM7CQkqb3V0X3N0YXRlID0gcmVzLmEyOwomIzQzOwlpZiAob3V0X3RvcCkKJiM0MzsJCSpvdXRfdG9wID0gcmVzLmEzOwomIzQzOwomIzQzOwlyZXR1cm4gcmVzLmEwOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfZ3B0X2wxX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgTGV2ZWwgMSBHUFQKJiM0MzsgKiBAYWRkcjogQmFzZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lvbiBkZXNjcmliZWQgYnkgdGhlIEwxR1BUCiYjNDM7ICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWQKJiM0MzsgKiBAZ2ZwOiBBbGxvY2F0aW9uIGZsYWdzIGZvciBTUk8gbWVtb3J5IGRvbmF0aW9uIHJlcXVlc3RzCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ncHRfbDFfY3JlYXRlKHVuc2lnbmVkIGxvbmcgYWRkciwKJiM0MzsJCQkJICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sCiYjNDM7CQkJCSAgICBnZnBfdCBnZnApCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIGdmcCwgU01DX1JNSV9HUFRfTDFfQ1JFQVRFLCBhZGRyKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX2ZlYXR1cmVzKCkgLSBSZWFkIGZlYXR1cmUgcmVnaXN0ZXIKJiM0MzsgKiBAaW5kZXg6IEZlYXR1cmUgcmVnaXN0ZXIgaW5kZXgKJiM0MzsgKiBAb3V0OiBGZWF0dXJlIHJlZ2lzdGVyIHZhbHVlIGlzIHdyaXR0ZW4gdG8gdGhpcyBwb2ludGVyCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9mZWF0dXJlcyh1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nICpvdXQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7CiYjNDM7CiYjNDM7CWFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfRkVBVFVSRVMsIGluZGV4LCAmYW1wO3Jlcyk7CiYjNDM7CiYjNDM7CWlmIChvdXQpCiYjNDM7CQkqb3V0ID0gcmVzLmExOwomIzQzOwlyZXR1cm4gcmVzLmEwOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSgpIC0gRGVsZWdhdGUgZ3JhbnVsZXMKJiM0MzsgKiBAYmFzZTogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgb2YgdGhlIHJhbmdlCiYjNDM7ICogQHRvcDogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgYWZ0ZXIgdGhlIHJhbmdlCiYjNDM7ICogQG91dF90b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG5vdCBkZWxlZ2F0ZWQKJiM0MzsgKgomIzQzOyAqIERlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZSBmb3IgdXNlIGJ5IHRoZSByZWFsbSB3b3JsZC4gSWYgdGhlIGVudGlyZSByYW5nZQomIzQzOyAqIHdhcyBkZWxlZ2F0ZWQgdGhlbiBAb3V0X3RvcCA9PSBAdG9wLCBvdGhlcndpc2UgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQKJiM0MzsgKiBhZ2FpbiB3aXRoIEBiYXNlID09IEBvdXRfdG9wLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsCiYjNDM7CQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkJICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFLCBiYXNlLCB0b3AKJiM0MzsJfTsKJiM0MzsJaW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAob3V0X3RvcCkKJiM0MzsJCSpvdXRfdG9wID0gcmVncy5hMTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSgpIC0gVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzCiYjNDM7ICogQGJhc2U6IEJhc2UgUEEgb2YgdGhlIHRhcmdldCByYW5nZQomIzQzOyAqIEB0b3A6IFRvcCBQQSBvZiB0aGUgdGFyZ2V0IHJhbmdlCiYjNDM7ICogQG91dF90b3A6IFJldHVybnMgdGhlIHRvcCBQQSBvZiByYW5nZSB3aG9zZSBzdGF0ZSBpcyB1bmRlbGVnYXRlZAomIzQzOyAqCiYjNDM7ICogVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzIHRvIGFsbG93IHVzZSBieSB0aGUgbm9ybWFsIHdvcmxkLiBXaWxsIGZhaWwgaWYKJiM0MzsgKiB0aGUgZ3JhbnVsZXMgYXJlIGluIHVzZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsCiYjNDM7CQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB0b3AsCiYjNDM7CQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfR1JBTlVMRV9SQU5HRV9VTkRFTEVHQVRFLCBiYXNlLCB0b3AKJiM0MzsJfTsKJiM0MzsJaW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAob3V0X3RvcCkKJiM0MzsJCSpvdXRfdG9wID0gcmVncy5hMTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7I2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaCBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi5jOTY1ZTg4Njc1MThmMwotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oCkBAIC0wLDAgJiM0MzsxLDQ5OSBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCiYjNDM7LyoKJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLgomIzQzOyAqCiYjNDM7ICogVGhlIHZhbHVlcyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgYXJlIGZyb20gdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvcgomIzQzOyAqIHNwZWNpZmljYXRpb24gKERFTjAxMzcpIHZlcnNpb24gMi4wLWJldDI6CiYjNDM7ICogaHR0cHM6Ly9kZXZlbG9wZXIuYXJtLmNvbS9kb2N1bWVudGF0aW9uL2RlbjAxMzcvMi0wYmV0Mi8KJiM0MzsgKi8KJiM0MzsKJiM0MzsjaWZuZGVmIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IXwomIzQzOyNkZWZpbmUgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2FybS1zbWNjYy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9iaXRmaWVsZC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9iaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J1aWxkX2J1Zy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zaXplcy5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDthc20vcGFnZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDthc20vc3lzcmVnLmgmZ3Q7CiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX0NBTEwoZnVuYykJCQkJXAomIzQzOwlBUk1fU01DQ0NfQ0FMTF9WQUwoQVJNX1NNQ0NDX0ZBU1RfQ0FMTCwJCVwKJiM0MzsJCQkgICBBUk1fU01DQ0NfU01DXzY0LAkJXAomIzQzOwkJCSAgIEFSTV9TTUNDQ19PV05FUl9TVEFOREFSRCwJXAomIzQzOwkJCSAgIChmdW5jKSkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkVSU0lPTgkJCQlTTUNfUk1JX0NBTEwoMHgwMTUwKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9NQVBfSU5JVAkJU01DX1JNSV9DQUxMKDB4MDE1MykKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVBTE1fQUNUSVZBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTU3KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTU4KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE1OSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVDX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxNWEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQ19ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE1YikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVDX0VOVEVSCQkJU01DX1JNSV9DQUxMKDB4MDE1YykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxNWQpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE1ZSkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1JFQURfRU5UUlkJCQlTTUNfUk1JX0NBTEwoMHgwMTYxKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1ZBTElEQVRFCQlTTUNfUk1JX0NBTEwoMHgwMTYzKQomIzQzOyNkZWZpbmUgU01DX1JNSV9QU0NJX0NPTVBMRVRFCQkJU01DX1JNSV9DQUxMKDB4MDE2NCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfRkVBVFVSRVMJCQlTTUNfUk1JX0NBTEwoMHgwMTY1KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfRk9MRAkJCVNNQ19STUlfQ0FMTCgweDAxNjYpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9JTklUX1JJUEFTCQkJU01DX1JNSV9DQUxMKDB4MDE2OCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9SSVBBUwkJCVNNQ19STUlfQ0FMTCgweDAxNjkpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxNmEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMTZiKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9STU1fQ09ORklHX1NFVAkJCVNNQ19STUlfQ0FMTCgweDAxNmUpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX0lSUV9OT1RJRlkJCVNNQ19STUlfQ0FMTCgweDAxNmYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0FUVEVTVF9QTEFUX1RPS0VOX1JFRlJFU0gJU01DX1JNSV9DQUxMKDB4MDE3MCkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9BQk9SVAkJCVNNQ19STUlfQ0FMTCgweDAxNzQpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQ09NTVVOSUNBVEUJCVNNQ19STUlfQ0FMTCgweDAxNzUpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQ1JFQVRFCQkJU01DX1JNSV9DQUxMKDB4MDE3NikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE3NykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9HRVRfU1RBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTc4KQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUkVGUkVTSAkJU01DX1JNSV9DQUxMKDB4MDE3YSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TRVRfUFVCS0VZCQkJU01DX1JNSV9DQUxMKDB4MDE3YikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVE9QCQkJU01DX1JNSV9DQUxMKDB4MDE3YykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTdkKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMTdlKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0ZPTEQJCQlTTUNfUk1JX0NBTEwoMHgwMTdmKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0FCT1JUCQkJU01DX1JNSV9DQUxMKDB4MDE4NSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9DT01NVU5JQ0FURQkJU01DX1JNSV9DQUxMKDB4MDE4NikKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTg3KQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMTg4KQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9TVEFURQkJCVNNQ19STUlfQ0FMTCgweDAxODkpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfVU5MT0NLCQkJU01DX1JNSV9DQUxMKDB4MDE4YSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9TMkFQCQkJU01DX1JNSV9DQUxMKDB4MDE4YikKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfSU5URVJGQUNFX1JFUE9SVAlTTUNfUk1JX0NBTEwoMHgwMWQwKQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9NRUFTVVJFTUVOVFMJCVNNQ19STUlfQ0FMTCgweDAxZDEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfTE9DSwkJCVNNQ19STUlfQ0FMTCgweDAxZDIpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfU1RBUlQJCQlTTUNfUk1JX0NBTEwoMHgwMWQzKQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX1AyUF9CSU5ECQkJU01DX1JNSV9DQUxMKDB4MDFkNCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9QMlBfVU5CSU5ECQkJU01DX1JNSV9DQUxMKDB4MDFkNSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfRVZFTlRfSEFORExFCQlTTUNfUk1JX0NBTEwoMHgwMWQ2KQomIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9BQ1RJVkFURQkJCVNNQ19STUlfQ0FMTCgweDAxZDcpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX0RFQUNUSVZBVEUJCVNNQ19STUlfQ0FMTCgweDAxZDgpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX1NUX0wyX0NSRUFURQkJU01DX1JNSV9DQUxMKDB4MDFkYikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfREVTVFJPWQkJU01DX1JNSV9DQUxMKDB4MDFkYykKJiM0MzsjZGVmaW5lIFNNQ19STUlfRFBUX0wwX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxZGQpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0RQVF9MMF9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDFkZSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfRFBUX0wxX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxZGYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0RQVF9MMV9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDFlMCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVQJCVNNQ19STUlfQ0FMTCgweDAxZTEpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfU0VUCQlTTUNfUk1JX0NBTEwoMHgwMWUzKQomIzQzOyNkZWZpbmUgU01DX1JNSV9DTUVNX0FERF9QREVWCQkJU01DX1JNSV9DQUxMKDB4MDFlNCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfQ01FTV9DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMWU1KQomIzQzOyNkZWZpbmUgU01DX1JNSV9DTUVNX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMWU2KQomIzQzOyNkZWZpbmUgU01DX1JNSV9DTUVNX1BPUFVMQVRFCQkJU01DX1JNSV9DQUxMKDB4MDFlNykKJiM0MzsjZGVmaW5lIFNNQ19STUlfQ01FTV9SRU1PVkVfUERFVgkJU01DX1JNSV9DQUxMKDB4MDFlOCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfQ01FTV9TVEFSVAkJCVNNQ19STUlfQ0FMTCgweDAxZTkpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0NNRU1fU1RPUAkJCVNNQ19STUlfQ0FMTCgweDAxZWEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0NNRU1fVU5QT1BVTEFURQkJCVNNQ19STUlfQ0FMTCgweDAxZWIpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9DT05GSUdfR0VUCQkJU01DX1JNSV9DQUxMKDB4MDFlYykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9NRUNfUkVGUkVTSAkJU01DX1JNSV9DQUxMKDB4MDFlZCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUk1NX1NUQVRFX0dFVAkJCVNNQ19STUlfQ0FMTCgweDAxZWUpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX0VWRU5UX0NPTlNVTUUJCVNNQ19STUlfQ0FMTCgweDAxZjApCiYjNDM7I2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfUkFOR0VfREVMRUdBVEUJCVNNQ19STUlfQ0FMTCgweDAxZjEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfUkFOR0VfVU5ERUxFR0FURQlTTUNfUk1JX0NBTEwoMHgwMWYyKQomIzQzOyNkZWZpbmUgU01DX1JNSV9HUFRfTDFfQ1JFQVRFCQkJU01DX1JNSV9DQUxMKDB4MDFmMykKJiM0MzsjZGVmaW5lIFNNQ19STUlfR1BUX0wxX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMWY0KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9NQVAJCQlTTUNfUk1JX0NBTEwoMHgwMWY1KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9VTk1BUAkJCVNNQ19STUlfQ0FMTCgweDAxZjYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9ERVZfTUFQCQkJU01DX1JNSV9DQUxMKDB4MDFmNykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9VTk1BUAkJCVNNQ19STUlfQ0FMTCgweDAxZjgpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9NQVAJCVNNQ19STUlfQ0FMTCgweDAxZjkpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9VTk1BUAkJU01DX1JNSV9DQUxMKDB4MDFmYSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1VOUFJPVF9NQVAJCQlTTUNfUk1JX0NBTEwoMHgwMWZiKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQCQlTTUNfUk1JX0NBTEwoMHgwMWZjKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1BST1RfTUFQCQlTTUNfUk1JX0NBTEwoMHgwMWZkKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1BST1RfVU5NQVAJCVNNQ19STUlfQ0FMTCgweDAxZmUpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX01BUAkJU01DX1JNSV9DQUxMKDB4MDFmZikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9VTlBST1RfVU5NQVAJCVNNQ19STUlfQ0FMTCgweDAyMDApCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQUxNX1RFUk1JTkFURQkJCVNNQ19STUlfQ0FMTCgweDAyMDEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9BQ1RJVkFURQkJCVNNQ19STUlfQ0FMTCgweDAyMDIpCiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX0NPTlRJTlVFCQkJU01DX1JNSV9DQUxMKDB4MDIwMykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fQ09OTkVDVAkJU01DX1JNSV9DQUxMKDB4MDIwNCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fRElTQ09OTkVDVAkJU01DX1JNSV9DQUxMKDB4MDIwNSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fQ09NUExFVEUJCVNNQ19STUlfQ0FMTCgweDAyMDYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0tFWV9QVVJHRQkJU01DX1JNSV9DQUxMKDB4MDIwNykKJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfTUVNX0RPTkFURQkJCVNNQ19STUlfQ0FMTCgweDAyMDgpCiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX01FTV9SRUNMQUlNCQkJU01DX1JNSV9DQUxMKDB4MDIwOSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfQ0FOQ0VMCQkJU01DX1JNSV9DQUxMKDB4MDIwYSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfRkVBVFVSRVMJCQlTTUNfUk1JX0NBTEwoMHgwMjBiKQomIzQzOyNkZWZpbmUgU01DX1JNSV9WU01NVV9DTURfR0VUCQkJU01DX1JNSV9DQUxMKDB4MDIwYykKJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0NPTVBMRVRFCQlTTUNfUk1JX0NBTEwoMHgwMjBkKQomIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9JTkZPCQkJU01DX1JNSV9DQUxMKDB4MDIwZSkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9BQklfTUFKT1JfVkVSU0lPTgkyCiYjNDM7I2RlZmluZSBSTUlfQUJJX01JTk9SX1ZFUlNJT04JMAomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUih2ZXJzaW9uKSAoKHZlcnNpb24pICZndDsmZ3Q7IDE2KQomIzQzOyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OX0dFVF9NSU5PUih2ZXJzaW9uKSAoKHZlcnNpb24pICZhbXA7IDB4RkZGRikKJiM0MzsjZGVmaW5lIFJNSV9BQklfVkVSU0lPTihtYWpvciwgbWlub3IpICAgICAgKCgobWFqb3IpICZsdDsmbHQ7IDE2KSB8IChtaW5vcikpCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVU19NQVNLCQkoMHhGRlVMKQomIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9JTkRFWF9NQVNLCQkoMHhGRlVMICZsdDsmbHQ7IDgpCiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX01FTVJFUV9NQVNLCQkoMHgzVUwgJmx0OyZsdDsgOCkKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLCSgweDFVTCAmbHQ7Jmx0OyAxMCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fU1RBVFVTKHJldCkJCUZJRUxEX0dFVChSTUlfUkVUVVJOX1NUQVRVU19NQVNLLCByZXQpCiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX0lOREVYKHJldCkJCUZJRUxEX0dFVChSTUlfUkVUVVJOX0lOREVYX01BU0ssIHJldCkKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRKHJldCkJCUZJRUxEX0dFVChSTUlfUkVUVVJOX01FTVJFUV9NQVNLLCByZXQpCiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX0NBTl9DQU5DRUwocmV0KQlGSUVMRF9HRVQoUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMX01BU0ssIHJldCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9TVUNDRVNTCQkJMAomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0lOUFVUCQkJMQomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JFQUxNCQkJMgomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JFQwkJCTMKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9SVFQJCQk0CiYjNDM7I2RlZmluZSBSTUlfRVJST1JfTk9UX1NVUFBPUlRFRAkJNQomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0RFVklDRQkJNgomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JUVF9BVVgJCTcKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9QU01NVV9TVAkJOAomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0RQVAkJCTkKJiM0MzsjZGVmaW5lIFJNSV9CVVNZCQkJMTAKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9HTE9CQUwJCTExCiYjNDM7I2RlZmluZSBSTUlfRVJST1JfVFJBQ0tJTkcJCTEyCiYjNDM7I2RlZmluZSBSTUlfSU5DT01QTEVURQkJCTEzCiYjNDM7I2RlZmluZSBSTUlfQkxPQ0tFRAkJCTE0CiYjNDM7I2RlZmluZSBSTUlfRVJST1JfR1BUCQkJMTUKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9HUkFOVUxFCQkxNgomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkcJCTAKJiM0MzsjZGVmaW5lIFJNSV9DT05USU5VRV9TVE9QCQkxCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX1JFUV9OT05FCQkwCiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX1JFUV9ET05BVEUJCTEKJiM0MzsjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU0JCTIKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfU0laRV9NQVNLCQkzVUwKJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfQ09VTlRfTUFTSwkJR0VOTUFTSygxNSwgMikKJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfQ09OVElHX01BU0sJCUJJVCgxNikKJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfU1RBVEVfTUFTSwkJQklUKDE3KQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TSVpFKHJlcSkJCUZJRUxEX0dFVChSTUlfRE9OQVRFX1NJWkVfTUFTSywgcmVxKQomIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVChyZXEpCQlGSUVMRF9HRVQoUk1JX0RPTkFURV9DT1VOVF9NQVNLLCByZXEpCiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJRyhyZXEpCQlGSUVMRF9HRVQoUk1JX0RPTkFURV9DT05USUdfTUFTSywgcmVxKQomIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURShyZXEpCQlGSUVMRF9HRVQoUk1JX0RPTkFURV9TVEFURV9NQVNLLCByZXEpCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX0RFTEVHQVRFRAkJMAomIzQzOyNkZWZpbmUgUk1JX09QX01FTV9VTkRFTEVHQVRFRAkJMQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0FERFJfVFlQRV9OT05FCQkwCiYjNDM7I2RlZmluZSBSTUlfQUREUl9UWVBFX1NJTkdMRQkJMQomIzQzOyNkZWZpbmUgUk1JX0FERFJfVFlQRV9MSVNUCQkyCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TSVpFX01BU0sJR0VOTUFTSygxLCAwKQomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTSwlHRU5NQVNLKFBBR0VfU0hJRlQgLSAxLCAyKQomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLCShQQUdFX01BU0sgJmFtcDsgR0VOTUFTSyg1MSwgMCkpCiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLCUJJVCg2MykKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NJWkUoYXIpCQkoRklFTERfR0VUKFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTSywgXAomIzQzOwkJCQkJCSAgIChhcikpKQomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlQoYXIpCShGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTSywgXAomIzQzOwkJCQkJCSAgIChhcikpKQomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQUREUihhcikJCSgoYXIpICZhbXA7IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSykKJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NUQVRFKGFyKQkoRklFTERfR0VUKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFwKJiM0MzsJCQkJCQkgICAoYXIpKSkKJiM0MzsKJiM0MztlbnVtIHJtaV9yaXBhcyB7CiYjNDM7CVJNSV9FTVBUWSA9IDAsCiYjNDM7CVJNSV9SQU0gPSAxLAomIzQzOwlSTUlfREVTVFJPWUVEID0gMiwKJiM0MzsJUk1JX0RFViA9IDMsCiYjNDM7fTsKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9OT19NRUFTVVJFX0NPTlRFTlQJMAomIzQzOyNkZWZpbmUgUk1JX01FQVNVUkVfQ09OVEVOVAkxCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1MyU1oJCUdFTk1BU0soNywgMCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTFBBMgkJQklUKDgpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1NWRQkJQklUKDkpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1NWRV9WTAkJR0VOTUFTSygxMywgMTApCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX05VTV9CUFMJCUdFTk1BU0soMTksIDE0KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9OVU1fV1BTCQlHRU5NQVNLKDI1LCAyMCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUE1VCQlCSVQoMjYpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1BNVV9OVU1fQ1RSUwlHRU5NQVNLKDMxLCAyNykKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNEtCCUJJVCgwKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl8xNktCCUJJVCgxKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl82NEtCCUJJVCgyKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8yNTYJQklUKDMpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzM4NAlCSVQoNCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfNTEyCUJJVCg1KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9NQVhfUkVDU19PUkRFUglHRU5NQVNLKDksIDYpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1oJCUdFTk1BU0soMTMsIDEwKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9QUFMJCUdFTk1BU0soMTYsIDE0KQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9EQQkJQklUKDApCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0RBX0NPSAkJQklUKDEpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1ZTTU1VCQlCSVQoMikKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQVRTCQlCSVQoMykKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfTUFYX1ZERVZTX09SREVSCUdFTk1BU0soNywgNCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVkRFVl9LUk9VCUJJVCg4KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9OT05fVEVFX1NUUkVBTQlCSVQoOSkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfUDJQCQlCSVQoMTApCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0NNRU1fQ1hMCQlCSVQoMTEpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX01BWF9DTUVNCQlHRU5NQVNLKDE5LCAxMikKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQ01FTV9UU0VfUkVRCUJJVCgyMCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfTUFYX05VTV9BVVhfUExBTkVTCUdFTk1BU0soMywgMCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfUlRUX1BMQU5FCQlHRU5NQVNLKDUsIDQpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9TMkFQX0lORElSRUNUCUJJVCg2KQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfNF9NRUNfQ09VTlQJCUdFTk1BU0soNjMsIDApCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0NPTlZFTlRJT05BTAkJMAomIzQzOyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9ERVZfTkNPSAkJMQomIzQzOyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9ERVZfQ09ICQkyCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfUkVTRVJWRUQJCQkwCiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfTk9ORQkJCTEKJiM0MzsjZGVmaW5lIFJNSV9UUkFDS0lOR19GSU5FCQkJMgomIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX0NPQVJTRQkJCTMKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9HUkFOVUxFX1NJWkVfNEtCCTAKJiM0MzsjZGVmaW5lIFJNSV9HUkFOVUxFX1NJWkVfMTZLQgkxCiYjNDM7I2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzY0S0IJMgomIzQzOwomIzQzOy8qCiYjNDM7ICogTm90ZSBtYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc21hbGxlciB0aGFuIHU2NCBidXQgYWxsIGZpZWxkcyBoYXZlIHU2NAomIzQzOyAqIGFsaWdubWVudCwgc28gdXNlIHU2NCB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQuCiYjNDM7ICovCiYjNDM7c3RydWN0IHJtbV9jb25maWcgewomIzQzOwl1bmlvbiB7IC8qIDB4MCAqLwomIzQzOwkJc3RydWN0IHsKJiM0MzsJCQl1NjQgdHJhY2tpbmdfcmVnaW9uX3NpemU7CiYjNDM7CQkJdTY0IHJtaV9ncmFudWxlX3NpemU7CiYjNDM7CQl9OwomIzQzOwkJdTggc2l6ZXJbU1pfNEtdOwomIzQzOwl9OwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJtbV9jb25maWcpID09IFNaXzRLKTsKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0xQQTIJCUJJVCgwKQomIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfU1ZFCQlCSVQoMSkKJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX1BNVQkJQklUKDIpCiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19EQQkJCUJJVCgzKQomIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfTEZBX1BPTElDWQkJR0VOTUFTSyg2LCA1KQomIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfTUVDX1BPTElDWQkJR0VOTUFTSyg4LCA3KQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0hBU0hfU0hBXzI1NgkJCTAKJiM0MzsjZGVmaW5lIFJNSV9IQVNIX1NIQV81MTIJCQkxCiYjNDM7I2RlZmluZSBSTUlfSEFTSF9TSEFfMzg0CQkJMgomIzQzOwomIzQzO3N0cnVjdCByZWFsbV9wYXJhbXMgewomIzQzOwl1bmlvbiB7IC8qIDB4MCAqLwomIzQzOwkJc3RydWN0IHsKJiM0MzsJCQl1NjQgZmxhZ3MwOwomIzQzOwkJCXU2NCBzMnN6OwomIzQzOwkJCXU2NCBzdmVfdmw7CiYjNDM7CQkJdTY0IG51bV9icHM7CiYjNDM7CQkJdTY0IG51bV93cHM7CiYjNDM7CQkJdTY0IHBtdV9udW1fY3RyczsKJiM0MzsJCQl1NjQgaGFzaF9hbGdvOwomIzQzOwkJCXU2NCBudW1fYXV4X3BsYW5lczsKJiM0MzsJCX07CiYjNDM7CQl1OCBwYWRkaW5nMFsweDQwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHg0MDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTggcnB2WzY0XTsKJiM0MzsJCQl1NjQgYXRzX3BsYW5lOwomIzQzOwkJfTsKJiM0MzsJCXU4IHBhZGRpbmcxWzB4NDAwXTsKJiM0MzsJfTsKJiM0MzsJdW5pb24geyAvKiAweDgwMCAqLwomIzQzOwkJc3RydWN0IHsKJiM0MzsJCQl1NjQgcGFkZGluZzsKJiM0MzsJCQl1NjQgcnR0X2Jhc2U7CiYjNDM7CQkJczY0IHJ0dF9sZXZlbF9zdGFydDsKJiM0MzsJCQl1NjQgcnR0X251bV9zdGFydDsKJiM0MzsJCQl1NjQgZmxhZ3MxOwomIzQzOwkJCXU2NCBhdXhfcnR0X2Jhc2VbM107CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzJbMHg4MDBdOwomIzQzOwl9OwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlYWxtX3BhcmFtcykgPT0gU1pfNEspOwomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIG51bWJlciBvZiBHUFJzIChzdGFydGluZyBmcm9tIFgwKSB0aGF0IGFyZQomIzQzOyAqIGNvbmZpZ3VyZWQgYnkgdGhlIGhvc3Qgd2hlbiBhIFJFQyBpcyBjcmVhdGVkLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgUkVDX0NSRUFURV9OUl9HUFJTCQk4CiYjNDM7CiYjNDM7I2RlZmluZSBSRUNfUEFSQU1TX0ZMQUdfUlVOTkFCTEUJQklUX1VMTCgwKQomIzQzOwomIzQzO3N0cnVjdCByZWNfcGFyYW1zIHsKJiM0MzsJdW5pb24geyAvKiAweDAgKi8KJiM0MzsJCXU2NCBmbGFnczsKJiM0MzsJCXU4IHBhZGRpbmcwWzB4MTAwXTsKJiM0MzsJfTsKJiM0MzsJdW5pb24geyAvKiAweDEwMCAqLwomIzQzOwkJdTY0IG1waWRyOwomIzQzOwkJdTggcGFkZGluZzFbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4MjAwICovCiYjNDM7CQl1NjQgcGM7CiYjNDM7CQl1OCBwYWRkaW5nMlsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHgzMDAgKi8KJiM0MzsJCXU2NCBncHJzW1JFQ19DUkVBVEVfTlJfR1BSU107CiYjNDM7CQl1OCBwYWRkaW5nM1sweGQwMF07CiYjNDM7CX07CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3BhcmFtcykgPT0gU1pfNEspOwomIzQzOwomIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfRU1VTEFURURfTU1JTwlCSVQoMCkKJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0lOSkVDVF9TRUEJQklUKDEpCiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGSQkJQklUKDIpCiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGRQkJQklUKDMpCiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19SSVBBU19SRVNQT05TRQlCSVQoNCkKJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1MyQVBfUkVTUE9OU0UJQklUKDUpCiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19ERVZfTUVNX1JFU1BPTlNFCUJJVCg2KQomIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfRk9SQ0VfUDAJCUJJVCg3KQomIzQzOwomIzQzOyNkZWZpbmUgUkVDX1JVTl9HUFJTCQkJMzEKJiM0MzsjZGVmaW5lIFJFQ19NQVhfR0lDX05VTV9MUlMJCTE2CiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfUEVSTUlUVEVEX0dJQ1YzX0hDUl9CSVRTCShJQ0hfSENSX0VMMl9VSUUgfAkJXAomIzQzOwkJCQkJIElDSF9IQ1JfRUwyX0xSRU5QSUUgfAkJXAomIzQzOwkJCQkJIElDSF9IQ1JfRUwyX05QSUUgfAkJXAomIzQzOwkJCQkJIElDSF9IQ1JfRUwyX1ZHcnAwRUlFIHwJCVwKJiM0MzsJCQkJCSBJQ0hfSENSX0VMMl9WR3JwMERJRSB8CQlcCiYjNDM7CQkJCQkgSUNIX0hDUl9FTDJfVkdycDFFSUUgfAkJXAomIzQzOwkJCQkJIElDSF9IQ1JfRUwyX1ZHcnAxRElFIHwJCVwKJiM0MzsJCQkJCSBJQ0hfSENSX0VMMl9URElSKQomIzQzOwomIzQzO3N0cnVjdCByZWNfZW50ZXIgewomIzQzOwl1bmlvbiB7IC8qIDB4MDAwICovCiYjNDM7CQl1NjQgZmxhZ3M7CiYjNDM7CQl1OCBwYWRkaW5nMFsweDIwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHgyMDAgKi8KJiM0MzsJCXU2NCBncHJzW1JFQ19SVU5fR1BSU107CiYjNDM7CQl1OCBwYWRkaW5nMVsweDEwMF07CiYjNDM7CX07CiYjNDM7CXU4IHBhZGRpbmczWzB4NTAwXTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfZW50ZXIpID09IFNaXzJLKTsKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9FWElUX1NZTkMJCQkweDAwCiYjNDM7I2RlZmluZSBSTUlfRVhJVF9JUlEJCQkweDAxCiYjNDM7I2RlZmluZSBSTUlfRVhJVF9GSVEJCQkweDAyCiYjNDM7I2RlZmluZSBSTUlfRVhJVF9QU0NJCQkJMHgwMwomIzQzOyNkZWZpbmUgUk1JX0VYSVRfUklQQVNfQ0hBTkdFCQkweDA0CiYjNDM7I2RlZmluZSBSTUlfRVhJVF9IT1NUX0NBTEwJCTB4MDUKJiM0MzsjZGVmaW5lIFJNSV9FWElUX1NFUlJPUgkJCTB4MDYKJiM0MzsjZGVmaW5lIFJNSV9FWElUX1MyQVBfQ0hBTkdFCQkweDA3CiYjNDM7I2RlZmluZSBSTUlfRVhJVF9WREVWX1ZBTElEQVRFX01BUFBJTkcJMHgwOAomIzQzOyNkZWZpbmUgUk1JX0VYSVRfVlNNTVVfQ09NTUFORAkJMHgwYQomIzQzOyNkZWZpbmUgUk1JX0VYSVRfVkRFVl9QMlBfQklORElORwkweDBiCiYjNDM7CiYjNDM7c3RydWN0IHJlY19leGl0IHsKJiM0MzsJdW5pb24geyAvKiAweDAwMCAqLwomIzQzOwkJdTggZXhpdF9yZWFzb247CiYjNDM7CQl1OCBwYWRkaW5nMFsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHgxMDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTY0IGVzcjsKJiM0MzsJCQl1NjQgZmFyOwomIzQzOwkJCXU2NCBocGZhcjsKJiM0MzsJCQl1NjQgcnR0X3RyZWU7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzFbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4MjAwICovCiYjNDM7CQl1NjQgZ3Byc1tSRUNfUlVOX0dQUlNdOwomIzQzOwkJdTggcGFkZGluZzJbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4MzAwICovCiYjNDM7CQl1OCBwYWRkaW5nM1sweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHg0MDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTY0IGNudHBfY3RsOwomIzQzOwkJCXU2NCBjbnRwX2N2YWw7CiYjNDM7CQkJdTY0IGNudHZfY3RsOwomIzQzOwkJCXU2NCBjbnR2X2N2YWw7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzRbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4NTAwICovCiYjNDM7CQlzdHJ1Y3QgewomIzQzOwkJCXU2NCByaXBhc19iYXNlOwomIzQzOwkJCXU2NCByaXBhc190b3A7CiYjNDM7CQkJdTggcmlwYXNfdmFsdWU7CiYjNDM7CQkJdTggcGFkZGluZzhbMTVdOwomIzQzOwkJCXU2NCBzMmFwX2Jhc2U7CiYjNDM7CQkJdTY0IHMyYXBfdG9wOwomIzQzOwkJCXU2NCB2ZGV2X2lkXzE7CiYjNDM7CQkJdTY0IHZkZXZfaWRfMjsKJiM0MzsJCQl1NjQgZGV2X21lbV9iYXNlOwomIzQzOwkJCXU2NCBkZXZfbWVtX3RvcDsKJiM0MzsJCQl1NjQgZGV2X21lbV9wYTsKJiM0MzsJCX07CiYjNDM7CQl1OCBwYWRkaW5nNVsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHg2MDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTE2IGltbTsKJiM0MzsJCQl1MTYgcGFkZGluZzk7CiYjNDM7CQkJdTY0IHBsYW5lOwomIzQzOwkJfTsKJiM0MzsJCXU4IHBhZGRpbmc2WzB4MTAwXTsKJiM0MzsJfTsKJiM0MzsJdW5pb24geyAvKiAweDcwMCAqLwomIzQzOwkJc3RydWN0IHsKJiM0MzsJCQl1OCBwbXVfb3ZmX3N0YXR1czsKJiM0MzsJCQl1OCBwYWRkaW5nMTBbMTVdOwomIzQzOwkJCXU2NCB2c21tdTsKJiM0MzsJCX07CiYjNDM7CQl1OCBwYWRkaW5nN1sweDEwMF07CiYjNDM7CX07CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2V4aXQpID09IFNaXzJLKTsKJiM0MzsKJiM0MztzdHJ1Y3QgcmVjX3J1biB7CiYjNDM7CXN0cnVjdCByZWNfZW50ZXIgZW50ZXI7CiYjNDM7CXN0cnVjdCByZWNfZXhpdCBleGl0OwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19ydW4pID09IFNaXzRLKTsKJiM0MzsKJiM0MzsvKiBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi8KJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19PQUREUl9UWVBFCUdFTk1BU0soMSwgMCkKJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UCUdFTk1BU0soMTUsIDIpCiYjNDM7I2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfTUVNQVRUUglHRU5NQVNLKDE4LCAxNikKJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQCQlHRU5NQVNLKDIyLCAxOSkKJiM0MzsKJiM0MzsvKiBSTUlfUlRUX0RBVEFfTUFQX0ZMQUdTIGRlZmluaXRpb25zICovCiYjNDM7I2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX09BRERSX1RZUEUJR0VOTUFTSygxLCAwKQomIzQzOyNkZWZpbmUgUk1JX1JUVF9QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UCUdFTk1BU0soMTUsIDIpCiYjNDM7CiYjNDM7LyogUzJBUCBEaXJlY3QgRW5jb2RpbmdzLCB1c2VkIGluIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQICovCiYjNDM7I2RlZmluZSBSTUlfUzJBUF9ESVJFQ1RfV1JJVEUJCQlCSVQoMCkKJiM0MzsjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9SRUFECQkJQklUKDEpCiYjNDM7CiYjNDM7I2VuZGlmIC8qIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IXyAqLwo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAyMToyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNTgyNwoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDkwNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFJlYWNoYWJpbGl0eSBvZiBSTU0vUk1JIENvZGUgaW4gYSBWaXJ0dWFsaXplZCBFbnZpcm9ubWVudCoqCgpPa2F5LCBzbyB3ZSYjMzk7dmUgZ290IHRoaXMgcGF0Y2ggYWRkaW5nIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvciAoUk1NKSBzdXBwb3J0IGZvciBBUk02NC4gSXQgc2VlbXMgcHJldHR5IHNlbGYtY29udGFpbmVkLCBhZGRpbmcgdGhlIG5lY2Vzc2FyeSBoZWFkZXIgZmlsZXMgYW5kIGRyaXZlciBjb2RlOiBgYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oYCwgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnYCwgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZWAsIGBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmNgLCBgaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaGAsIGFuZCBgaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmhgLiAgSXQgaW50cm9kdWNlcyBgQ09ORklHX0FSTV9STU1gLCB3aGljaCBpcyBnb29kLCBhbmQgaXTigJlzIGRlcGVuZGVudCBvbiBgQVJDSF9TVVBQT1JUU19STU1gLiBJdCBwcm92aWRlcyBob3N0LXNpZGUgUk1JIHN1cHBvcnQsIHdoaWNoIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgS1ZNIGZvciB0aGluZ3MgbGlrZSBkZXRlY3RpbmcgYSBjb21wYXRpYmxlIFJNTSwgY29uZmlndXJpbmcgaXQsIG1hbmFnaW5nIGRlbGVnYXRlZCBtZW1vcnksIGFuZCBlbmFibGluZyBSZWFsbSBndWVzdHMuCgpNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gYXNzZXNzIGl0cyByZWFjaGFiaWxpdHkgd2l0aGluIGEgdmlydHVhbGl6ZWQgc2V0dGluZywgcGFydGljdWxhcmx5IFFFTVUuIFRoZSBjb2RlIGRvZXMgYSBjaGVjayBmb3IgUk1FIChSZWFsbSBNYW5hZ2VtZW50IEV4dGVuc2lvbikgc3VwcG9ydCBpbiB0aGUgQ1BVIHVzaW5nIHRoZSBgSURfQUE2NFBGUjBfRUwxYCByZWdpc3Rlci4gVGhpcyBpcyBrZXksIGFzIFJNSSBpcyBjb250aW5nZW50IG9uIFJNRS4gSWYgUk1FIGlzbiYjMzk7dCBwcmVzZW50LCB0aGUgaW5pdGlhbGl6YXRpb24gZmFpbHMuIFFFTVUgZG9lcyBzdXBwb3J0IFJNRSBlbXVsYXRpb24gaW4gaXRzIGB2aXJ0YCBtYWNoaW5lIHR5cGUsIGJ1dCBpdCBuZWVkcyBzcGVjaWZpYyBzZXR1cCB3aGljaCBwcm9iYWJseSBpbmNsdWRlcyBURi1BIGFuZCBSTU0uCgpTeXprYWxsZXIgaXMgYSBjb25jZXJuLCBhcyBpdCBvZnRlbiBydW5zIHdpdGggZGVmYXVsdCBRRU1VIENQVXMsIHN1Y2ggYXMgYG1heGAgb3IgYGNvcnRleC1hNTdgLiBJIG5lZWQgdG8gdmVyaWZ5IHdoZXRoZXIgdGhlIGRlZmF1bHQgUUVNVSBDUFVzIGFyZSBjb25maWd1cmVkIHdpdGggUk1FIHN1cHBvcnQuICBUaGUgY29kZSBpdHNlbGYsIHNwZWNpZmljYWxseSBgYXJtNjRfaW5pdF9ybWlgLCBpcyBhIGBzdWJzeXNfaW5pdGNhbGxgLiBJdCBjaGVja3MgZm9yIHRoZSBgSURfQUE2NFBGUjBfRUwxX1JNRV9TSElGVGAgYml0LiBJZiBSTUUgaXNuJiMzOTt0IHByZXNlbnQsIHRoZSBpbml0aWFsaXphdGlvbiB3aWxsIHJldHVybiBgLUVOWElPYC4gSWYgUk1FIGlzIHByZXNlbnQsIGl0IGRvZXMgU01DIGNhbGxzIHRvIFJNTS4gSWYgUk1NIGlzIG5vdCBwcmVzZW50LCB0aGUgU01DIGNhbGxzIHJldHVybiBgU01DQ0NfUkVUX05PVF9TVVBQT1JURURgLiAgU28gaXQmIzM5O3MgaGFyZHdhcmUtIGFuZCBmaXJtd2FyZS1kZXBlbmRlbnQuIEhvd2V2ZXIsIHN5emthbGxlciBtaWdodCBiZSBhYmxlIHRvIGZ1enogdGhlIFNNQyBjYWxscyBpZiB0aGVyZSYjMzk7cyBhIHdheSB0byBtb2NrIHRoZW0uCgpUaGUgcHJvYmxlbSBzdGF0ZW1lbnQgbWVudGlvbnMgdW5yZWFjaGFibGUgY29kZSBwYXRocyBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwgZXZlbiB3aXRoIGVtdWxhdGVkIGhhcmR3YXJlLiBTbyB0aGUgcXVlc3Rpb24gaXM6IGlzIFJNRSBzdXBwb3J0ZWQgaW4gUUVNVT8gWWVzLCBRRU1VIGhhcyBSTUUgZW11bGF0aW9uLiBUaGUgcGF0Y2ggaXRzZWxmIGp1c3QgYWRkcyB0aGUgUk1JIGxpYnJhcnkgZnVuY3Rpb25zIGFuZCB0aGUgaW5pdGlhbGl6YXRpb24uIFRoZXJlIGFyZSBubyBzeXNjYWxscyBvciBpb2N0bHMgZXhwb3NlZCBkaXJlY3RseSB0byB1c2VyLXNwYWNlIGluICp0aGlzKiBwYXRjaC4gVGhlc2UgYXJlIGV4cG9ydGVkIHVzaW5nIGBFWFBPUlRfU1lNQk9MX0dQTGAgKGUuZy4sIGBybWlfZGVsZWdhdGVfcmFuZ2VgLCBgcm1pX3VuZGVsZWdhdGVfcmFuZ2VgLCBldGMuKS4KClRoZXNlIGZ1bmN0aW9ucyBhcmUgcmVhbGx5IG1lYW50IGZvciBLVk0uIFRoZSBwYXRjaCBkZXNjcmlwdGlvbiBjb25maXJtcyB0aGlzOiAmIzM0O1RoaXMgb3B0aW9uIGJ1aWxkcyB0aGUgaG9zdC1zaWRlIFJNSSBzdXBwb3J0IHVzZWQgYnkgS1ZNLi4uJiMzNDsuIENydWNpYWxseSwgdGhlICpLVk0qIHN1cHBvcnQgaXRzZWxmIGlzbiYjMzk7dCAqaW4qIHRoaXMgcGF0Y2guIFRoZSBwYXRjaCBvbmx5ICphZGRzKiB0aGUgYnVpbGRpbmcgYmxvY2tzIGZvciBLVk0gdG8gdXNlIGxhdGVyLiBTbyB3aXRob3V0IEtWTSB1c2luZyB0aGVtLCB0aGVzZSBleHBvcnRlZCBmdW5jdGlvbnMgYXJlIGRlYWQgY29kZS4gR2l2ZW4gdGhhdCB0aGUgY2hhbmdlcyBhcmUgQUxSRUFEWSBjb21taXR0ZWQgYXMgSEVBRCwgSSBzaG91bGQgY2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIGZvbGxvdy11cCBwYXRjaCB0aGF0IGFkZHMgdGhlIEtWTSBjb2RlLiBJIG11c3Qgc2VhcmNoIGZvciB3aGVyZSBLVk0gdXNlcyB0aGVzZSBmdW5jdGlvbnMgaW4gdGhlIGN1cnJlbnQgdHJlZS4gVGhlIHByb21wdCBzYXlzIHRoZSBjb2RlIGlzIGFscmVhZHkgaW4gSEVBRCwgc28gbGV0IG1lIHNlYXJjaCBmb3IgYHJtaV9kZWxlZ2F0ZV9yYW5nZWAgb3IgYHJtaV9zcm9fZXhlY3V0ZWAgaW4gdGhlIHRyZWUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMjE6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cm1pX2RlbGVnYXRlX3JhbmdlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYz0yOD1FWFBPUlRfU1lNQk9MX0dQTChybWlfZmVhdF9yZWcpO1xuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTI5LVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjMwOmludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cyxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy0zMS1cdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbi0tXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtNTItfVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjUzOkVYUE9SVF9TWU1CT0xfR1BMKHJtaV9kZWxlZ2F0ZV9yYW5nZSk7XG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtNTQtXG4tLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jPTE2Nj1zdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuLS1cbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy0yMDgtXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6MjA5Olx0XHRpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIHNpemUsIFx1MDAyNmRlbGVnYXRlZF9waHlzKSkge1xuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTIxMC1cdFx0XHRpZiAoIXJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIGRlbGVnYXRlZF9waHlzIC0gcGh5cykpXG4tLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jPTI0OT1zdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuLS1cbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy0yOTMtXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6Mjk0Olx0XHRcdGlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgdW5pdF9zaXplX2J5dGVzLFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTI5NS1cdFx0XHRcdFx0ICAgICAgIFx1MDAyNmRlbGVnYXRlZF9waHlzKSkge1xuLS1cbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmg9MzA9dW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWcodW5zaWduZWQgbG9uZyBpZCk7XG5pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oLTMxLVxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaDozMjppbnQgcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmgtMzMtXHRcdCAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpO1xuLS1cbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmg9Mzc9c3RhdGljIGlubGluZSBpbnQgcm1pX2RlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmgtMzgte1xuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaDozOTpcdHJldHVybiBybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFLCBOVUxMKTtcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmgtNDAtfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDIxOjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4MjE3CgkJCQkJCQlvdXRwdXQ6IDE5CgkJCQkJCQl0aG91Z2h0czogNDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqSW52ZXN0aWdhdGluZyBSTUkgRnVuY3Rpb24gVXNhZ2UqKgoKT2theSwgc28gS1ZNIGlzbiYjMzk7dCBhY3RpdmVseSB1c2luZyB0aGlzIHBhcnRpY3VsYXIgZnVuY3Rpb24uIFRoYXQmIzM5O3MgZ29vZCB0byBrbm93LCBidXQgZG9lc24mIzM5O3QgcnVsZSBvdXQgaXRzIG92ZXJhbGwgc2lnbmlmaWNhbmNlLiBJIHNob3VsZCBicm9hZGVuIHRoZSBzZWFyY2guIEkgbmVlZCB0byBtYWtlIHN1cmUgSSYjMzk7bSBub3QgbWlzc2luZyBzb21ldGhpbmcgc3VidGx5IGNvbm5lY3RlZC4gTGV0JiMzOTtzIHNlZSBpZiBLVk0gbWlnaHQgYmUgaW5kaXJlY3RseSBsZXZlcmFnaW5nIGFueSBvZiB0aGVzZSBgcm1pX2AgZnVuY3Rpb25zLiBQZXJoYXBzIHNvbWV0aGluZyBsaWtlIGBybWlfcmVhbG1fY3JlYXRlYCBvciBhIHJlbGF0ZWQgZnVuY3Rpb24gY291bGQgYmUgdGhlIGtleS4gSSBuZWVkIHRvIGVuc3VyZSBhIGNvbXByZWhlbnNpdmUgb3ZlcnZpZXcgb2YgaG93IGl0IGlzIHVzZWQsIG9yIG5vdCB1c2VkLiBJIG5lZWQgdG8gZG8gYSB0aG9yb3VnaCBjaGVjayBvZiB0aGUgY29kZSBiYXNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDIxOjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3JtaV9yZWFsbV9jcmVhdGUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7YXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTEzNj1zdGF0aWMgaW5saW5lIGludCBybWlfcmVhbG1fYWN0aXZhdGUodW5zaWduZWQgbG9uZyByZClcbi0tXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMTQ1LS8qKlxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oOjE0NjogKiBybWlfcmVhbG1fY3JlYXRlKCkgLSBDcmVhdGUgYSByZWFsbVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTE0Ny0gKiBAcmQ6IFBBIG9mIHRoZSBSRFxuLS1cbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC0xNTQtICovXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg6MTU1OnN0YXRpYyBpbmxpbmUgaW50IHJtaV9yZWFsbV9jcmVhdGUodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBwYXJhbXMsXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMTU2LVx0XHRcdFx0ICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAyMTozMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyODYzNwoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDQzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd24sIGdpdmVuIG15IGV4cGVydGlzZToKCioqS1ZNIEludGVncmF0aW9uIENvbmNlcm5zKioKClJpZ2h0LCBzbyBJIHNlZSB0aGlzIHBhdGNoLCBhbmQgaXQgbG9va3MgbGlrZSBpdCYjMzk7cyBpbnRyb2R1Y2luZyB0aGUgUmVtb3RlIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIGxpYnJhcnkgYW5kIGl0cyBpbml0aWFsaXphdGlvbiwgYnV0IGl0JiMzOTtzIG5vdCBpbW1lZGlhdGVseSBjbGVhciBob3cgS1ZNIGlzIGxldmVyYWdpbmcgaXQgaW4gdGhlIGN1cnJlbnQgc291cmNlIHRyZWUuIFRoYXQmIzM5O3MgYSBiaXQgb2YgYSByZWQgZmxhZzsgeW91IGRvbiYjMzk7dCB3YW50IHRvIGp1c3QgYWRkIGNvZGUgdGhhdCYjMzk7cyBub3QgYWN0aXZlbHkgYmVpbmcgdXNlZCwgaXQgYWRkcyB0byB0aGUgY29kZWJhc2UgYmxvYXQgYW5kIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMgaWYgaXQmIzM5O3Mgbm90IGJlaW5nIHVzZWQuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCAmIzM0O09rYXksIGlzIHRoaXMgcHJlbWF0dXJlIG9wdGltaXphdGlvbiwgb3IgaXMgdGhlcmUgYSBwbGFuIGluIHBsYWNlPyYjMzQ7CgpUaGUgbmV4dCBsb2dpY2FsIHN0ZXAgaXMgdG8gZGl2ZSBpbiBhbmQgbG9vayBmb3IgY2FsbGVycyBvZiBgcm1pX3Nyb19leGVjdXRlYC4gVGhhdCYjMzk7cyB3aGVyZSBJIG5lZWQgdG8gc3RhcnQgZGlnZ2luZyB0byBzZWUgKndoeSogdGhpcyBoYXMgYmVlbiBhZGRlZC4gQXJlIHRoZXJlIGV4aXN0aW5nIG1vZHVsZXMsIGRyaXZlcnMsIG9yIGh5cGVydmlzb3IgY29tcG9uZW50cyBhbHJlYWR5IHNsYXRlZCB0byB1c2UgaXQgaW4gZnV0dXJlIGNvbW1pdHMsIG9yIGRvZXMgdGhpcyBwYXRjaCByZXByZXNlbnQgYW4gdW5pbnRlZ3JhdGVkIHBpZWNlIG9mIHRoZSBwdXp6bGUgdGhhdCBuZWVkcyBmdXJ0aGVyIGRldmVsb3BtZW50PyBVbmRlcnN0YW5kaW5nICp3aGVyZSogdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQsIGFuZCBob3cgaXQmIzM5O3MgYmVpbmcgdXNlZCwgaXMgZ29pbmcgdG8gaW5mb3JtIG15IGFzc2Vzc21lbnQgb2YgdGhlIHBhdGNoJiMzOTtzIHB1cnBvc2UgYW5kIGl0cyByZWFkaW5lc3MuIExldCYjMzk7cyBzZWUgaWYgd2UgY2FuIGZpbmQgc29tZSB1c2FnZSEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAyMTozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtybWlfc3JvX2V4ZWN1dGUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7YXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTI1PXN0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGF0YV9tYXBfaW5pdCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGRhdGEsXG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTMyLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oOjMzOlx0cmV0dXJuIHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC0zNC19XG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTQ3PXN0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGF0YV9tYXAodW5zaWduZWQgbG9uZyByZCxcbi0tXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtNTgtXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg6NTk6XHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtNjAtXG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTgyPXN0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGF0YV91bm1hcCh1bnNpZ25lZCBsb25nIHJkLFxuLS1cbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC05NS1cbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaDo5NjpcdHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC05Ny1cbi0tXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg9MjY3PXN0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcnR0LFxuLS1cbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC0yNzMtXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg6Mjc0Olx0cmV0dXJuIHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC0yNzUtfVxuLS1cbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaD0yOTE9c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTI5OS1cdH07XG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg6MzAwOlx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC0zMDEtXG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTMyMj1zdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2ZvbGQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBpcGEsXG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTMyNy1cdH07XG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg6MzI4Olx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC0zMjktXG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTM0Nz1zdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2luaXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBiYXNlLFxuLS1cbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC0zNTItXHR9O1xuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oOjM1MzpcdGludCByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMzU0LVxuLS1cbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaD0zNzQ9c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF91bnByb3RfbWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTM4My1cdH07XG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg6Mzg0Olx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC0zODUtXG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTQwNT1zdGF0aWMgaW5saW5lIGludCBybWlfcnR0X3NldF9yaXBhcyh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJlYyxcbi0tXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtNDExLVx0fTtcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaDo0MTI6XHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTQxMy1cbi0tXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg9NDM1PXN0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfdW5wcm90X3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4tLVxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTQ0Ni1cdH07XG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg6NDQ3Olx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC00NDgtXG4tLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jPTQ3OD1FWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX21lbXhmZXJfZXhlY3V0ZSk7XG4tLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTQ4MC0vKiBGb3IgUk1JIGNvbW1hbmRzIHRoYXQgYXJlIHN0YXRlZnVsIGJ1dCBub3QgbWVtb3J5LXRyYW5zZmVycmluZyAqL1xuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjQ4MTp1bnNpZ25lZCBsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTQ4Mi17XG4tLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTUwNy19XG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6NTA4OkVYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fZXhlY3V0ZSk7XG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtNTA5LVxuLS1cbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmg9NTA9dm9pZCBybWlfc3JvX2ZyZWUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyk7XG5pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oOjUxOnVuc2lnbmVkIGxvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpO1xuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaC01Mi1cbi0tXG5pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oPTE2ND1zdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXG4tLVxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaC0xNzAtXHR9O1xuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaDoxNzE6XHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaC0xNzItXG4tLVxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaD0xOTA9c3RhdGljIGlubGluZSBpbnQgcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXG4tLVxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaC0xOTYtXHR9O1xuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaDoxOTc6XHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaC0xOTgtXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMjE6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzA3MDEKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiA0NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIHNlZSB3aGF0JiMzOTtzIGdvaW5nIG9uIGhlcmUuCgoqKktWTSBJbnF1aXJ5OiBJbml0aWFsIENvbmZ1c2lvbiBhbmQgRm9jdXNlZCBJbnZlc3RpZ2F0aW9uKioKCkhtbSwgc28gaXQgc2VlbXMgS1ZNIGlzbiYjMzk7dCBhY3RpdmVseSAqaW4gdXNlKiBqdXN0IHlldC4gVGhhdOKAmXMgYSBiaXQgb2RkLiBCdXQgd2FpdCwgYGFybTY0X2luaXRfcm1pYCBpcyBnZXR0aW5nIGNhbGxlZCBkdXJpbmcgdGhlIGJvb3QgcHJvY2Vzcy4gT2theSwgdGhhdCBzcGFya3MgbXkgaW50ZXJlc3QuIFRoaXMgc3VnZ2VzdHMgc29tZXRoaW5nIGlzIGhhcHBlbmluZyB1bmRlciB0aGUgaG9vZC4gVGltZSB0byBkaWcgaW50byBgYXJtNjRfaW5pdF9ybWlgIGFuZCB1bmRlcnN0YW5kIHByZWNpc2VseSB3aGF0IHJvbGUgaXQgcGxheXMuIExldCYjMzk7cyBzZWUgd2hhdCB3ZSBjYW4gZmluZC4gSSYjMzk7bSBrZWVuIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgaXMgYmVpbmcgaW5pdGlhbGl6ZWQsIGV2ZW4gaWYgS1ZNIGl0c2VsZiBpc24mIzM5O3QgeWV0IHZpc2libHkgYWN0aXZlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAyMTozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDthcm02NF9pbml0X3JtaSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM9Njg3PWJvb2wgaXNfcm1pX2F2YWlsYWJsZSh2b2lkKVxuLS1cbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy02OTEtXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6NjkyOnN0YXRpYyBpbnQgX19pbml0IGFybTY0X2luaXRfcm1pKHZvaWQpXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtNjkzLXtcbi0tXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtNzE5LS8qXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6NzIwOiAqIE5vdGUgYXJtNjRfaW5pdF9ybWkoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUga3ZtX2luaXRfcm1pKCkgb3RoZXJ3aXNlIEtWTVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTcyMS0gKiB3aWxsIG5vdCBzdXBwb3J0IHJlYWxtIGd1ZXN0cy4gc3Vic3lzX2luaXRjYWxsKCkgaXMgY2FsbGVkIGJlZm9yZVxuLS1cbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy03MjMtICovXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6NzI0OnN1YnN5c19pbml0Y2FsbChhcm02NF9pbml0X3JtaSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDIxOjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMxMTc2CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogODMwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKlJNSSBJbml0aWFsaXphdGlvbiBhbmQgUmVhY2hhYmlsaXR5IEFuYWx5c2lzKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGBhcm02NF9pbml0X3JtaWAgZnVuY3Rpb24sIGFuZCBpdCYjMzk7cyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkOiBpdCBjYWxscyBhIHNlcmllcyBvZiBgcm1pXypgIGZ1bmN0aW9ucyBmb3IgaW5pdGlhbGl6YXRpb24gZHVyaW5nIGJvb3QuIFNlZW1zIGxpa2UgdGhpcyBpbnZvbHZlcyBTZWN1cmUgTW9uaXRvciBDYWxsIChTTUMpIGludGVyYWN0aW9ucy4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIGNhbiB0aGlzIGJlIGZ1enplZD8gU3l6a2FsbGVyIGlzIGEgZmFudGFzdGljIHRvb2wgZm9yIFNNQyBmdXp6aW5nLCBidXQgaXQgdXN1YWxseSByZWxpZXMgb24gZWl0aGVyIGludGVyY2VwdGluZyB0aGUgY2FsbHMgb3IgZnV6emluZyBhIGh5cGVydmlzb3IuIEhlcmUsIExpbnV4ICppcyogdGhlIGhvc3QsIGNhbGxpbmcgaW50byB0aGUgUk1NIChSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3IpLCB3aGljaCBpcyBmaXJtd2FyZS4gU3l6a2FsbGVyIGRvZXNuJiMzOTt0IHR5cGljYWxseSB0YXJnZXQgZmlybXdhcmUgZGlyZWN0bHkgdW5sZXNzIHRoZXJlJiMzOTtzIGEgbW9jayBkcml2ZXIgaW4gcGxhY2UuCgpIb3dldmVyLCBJIHJlYWxpemUgdGhpcyBpcyBlYXJseSBib290IGNvZGUuIElmIEtWTSBpc24mIzM5O3QgdXNpbmcgaXQgeWV0ICh3aGljaCBJIHN1c3BlY3QgaXQgaXNuJiMzOTt0LCBnaXZlbiB0aGlzIGlzIGEgbmV3IHBhdGNoKSwgdGhlICpvbmx5KiBwbGFjZSB0aGlzIGNvZGUgY2FuIGJlIHJlYWNoZWQgaXMgdGhlIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlLiBBIHF1aWNrIGNoZWNrIG9mIHRoZSBjb2RlIGNvbmZpcm1zIHRoaXM6IGlmIFJNRSBpc24mIzM5O3Qgc3VwcG9ydGVkLCBpdCByZXR1cm5zIGAtRU5YSU9gLiBPbiBhIHN0YW5kYXJkIHN5emthbGxlciBWTSwgdGhpcyBpcyB0aGUgZXhwZWN0ZWQgb3V0Y29tZSwgc2luY2UgUk1FIGlzIG5vdCBlbmFibGVkIGluIHRoZSBkZWZhdWx0IFFFTVUgc2V0dXAuCgpTbyB0aGUgcXVlc3Rpb24gaXMsIGNhbiB3ZSBhY3R1YWxseSAqcmVhY2gqIHRoZSByZXN0IG9mIHRoZSBjb2RlPyBJdCBoaW5nZXMgb24gdGhlIENQVSBzdXBwb3J0aW5nIFJNRS4gU3l6a2FsbGVyIHVzdWFsbHkgcnVucyB3aXRoIGBxZW11LXN5c3RlbS1hYXJjaDY0IC1tYWNoaW5lIHZpcnQgLWNwdSBtYXhgLiBEb2VzIGAtY3B1IG1heGAgZXZlbiAqaGF2ZSogUk1FIGVuYWJsZWQ/IEl0IGxvb2tzIGxpa2Ugbm8sIGl0IHJlcXVpcmVzIGAtbWFjaGluZSB2aXJ0LHgtcm1lPW9uYCBhbmQgYXBwcm9wcmlhdGUgZmlybXdhcmUgKFRGLUEgYW5kIFJNTSkuIFdpdGhvdXQgdGhlIGZpcm13YXJlLCB0aGUgU01DIGNhbGxzIHdpbGwganVzdCByZXR1cm4gYFNNQ0NDX1JFVF9OT1RfU1VQUE9SVEVEYC4KCkV2ZW4gaWYgS1ZNICp3YXMqIHVzaW5nIGl0LCBLVk0gd291bGQgb25seSB1c2UgaXQgaWYgS1ZNIGl0c2VsZiB3YXMgY29uZmlndXJlZCB0byBzdXBwb3J0IFJlYWxtcywgd2hpY2ggdGhpcyBwYXRjaCBpcyBub3QgZG9pbmcuIExvb2tpbmcgYXQgdGhlIGNvZGUgY29uZmlybXMgdGhpcyBpcyBqdXN0IGluaXRpYWxpemF0aW9uLCBhbmQgd2lsbCBsaWtlbHkgZXhpdCBpbW1lZGlhdGVseS4KClRoZSBwYXRjaCBJJiMzOTttIGxvb2tpbmcgYXQgKmFkZHMqIGEgbGlicmFyeSBmb3IgS1ZNIHRvIHVzZSwgYW5kIGEgaW5pdGNhbGwgdGhhdCBLVk0gZGVwZW5kcyBvbi4gSXQgbG9va3MgbGlrZSBpdCYjMzk7cyBidWlsZGluZyBpbmZyYXN0cnVjdHVyZSwgbm90IGNvbnN1bWluZyBpdCB5ZXQuCgpTbywgdGhlIG9ubHkgY29kZSB0aGF0JiMzOTtzIHJlYWNoYWJsZSBpcyBgYXJtNjRfaW5pdF9ybWlgLCBhbmQgKnRoYXQqIGltbWVkaWF0ZWx5IGJhaWxzIG91dC4gVGhpcyBzZWVtcyB0byBhbGlnbiB3aXRoIHRoZSBwcm9tcHQmIzM5O3MgaW5zdHJ1Y3Rpb246ICYjMzQ7UmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWlucyBjb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUmIzM0Oy4KCkJ1dCB3YWl04oCmIGlzIGl0ICppbXBvc3NpYmxlKj8gSWYgd2UgcGFzcyBgLW1hY2hpbmUgdmlydCx4LXJtZT1vbmAgdG8gUUVNVSwgY291bGQgS1ZNICpvciogS1ZNIHVuaXQgdGVzdHMgcmVhY2ggaXQ/IEJ1dCB0aGlzIHBhdGNoIGRvZXNuJiMzOTt0IGFkZCBLVk0gc3VwcG9ydDsgaXQgYWRkcyB0aGUgYnVpbGRpbmcgYmxvY2tzLgoKTGV0IG1lIGRvdWJsZS1jaGVjay4gSSYjMzk7dmUgYWxyZWFkeSBncmVwcGVkIGZvciBgcm1pX2RlbGVnYXRlX3JhbmdlYCBhbmQgYHJtaV9zcm9fZXhlY3V0ZWAgYW5kIGZvdW5kIG5vIGNhbGxlcnMgb3V0c2lkZSB0aGUgbmV3bHkgYWRkZWQgZmlsZXMuIExldCYjMzk7cyBtYWtlIGFic29sdXRlbHkgc3VyZSBhbmQgZG91YmxlIGNoZWNrIGBmcmVlX2RlbGVnYXRlZF9wYWdlYCB0byBiZSBleHRyYSBzdXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAyMTozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmcmVlX2RlbGVnYXRlZF9wYWdlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYz0xMjk9c3RhdGljIHZvaWQgcm1pX29wX21lbV9yZWNsYWltKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbi0tXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtMTQwLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjE0MTppbnQgZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzX2FkZHJfdCBwaHlzKVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTE0Mi17XG4tLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTE1MS19XG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6MTUyOkVYUE9SVF9TWU1CT0xfR1BMKGZyZWVfZGVsZWdhdGVkX3BhZ2UpO1xuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTE1My1cbi0tXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM9MTY2PXN0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4tLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTIzOS1cdFx0XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6MjQwOlx0XHRcdFx0ZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzICYjNDM7IGkpO1xuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTI0MS1cdFx0XHRlbHNlXG4tLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jPTI0OT1zdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuLS1cbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy0zNDYtXHRcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjM0NzpcdFx0XHRcdGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyAmIzQzOyBpKTtcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy0zNDgtXHRcdFx0ZWxzZVxuLS1cbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmg9MzQ9aW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7XG5pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oOjM1OmludCBmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMpO1xuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaC0zNi1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMjE6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzMyMzgKCQkJCQkJCW91dHB1dDogMTQyCgkJCQkJCQl0aG91Z2h0czogNTcwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIHRoZSBSTUkgQ29kZSBmb3IgRnV6emluZyBQb3RlbnRpYWwqKgoKT2theSwgc28gSSYjMzk7dmUgbG9va2VkIHRocm91Z2ggdGhlIGNvZGUsIHNwZWNpZmljYWxseSB0aGUgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuY2AgZmlsZS4gVGhlIGluaXRpYWwgYXNzZXNzbWVudCBpcyBjbGVhcjogdGhlcmUgYXJlIG5vIGVudHJ5IHBvaW50cyBmb3IgZXh0ZXJuYWwgY2FsbGVycyBvdXRzaWRlIG9mIHRoaXMgc3BlY2lmaWMgZmlsZS4gVGhpcyBpbW1lZGlhdGVseSBzdWdnZXN0cyB0aGF0IEtWTSBzdXBwb3J0LCB3aGljaCBpcyB3aGF0IEkmIzM5O20gcHJpbWFyaWx5IGludGVyZXN0ZWQgaW4sIGlzICpub3QqIHByZXNlbnQgaGVyZS4KCk15IGZvY3VzIG5hcnJvd3MgdG8gdGhlIGBhcm02NF9pbml0X3JtaSgpYCBmdW5jdGlvbi4gSXQmIzM5O3MgdGhlIG9ubHkgY29kZSB0aGF0IGFwcGVhcnMgdG8gZXhlY3V0ZS4gTGV0JiMzOTtzIHNlZSBpZiB0aGlzIGlzIGZ1enphYmxlLiBJdCYjMzk7cyBjYWxsZWQgb25jZSBhdCBib290LiBJdCBjaGVja3MgaWYgUk1FIGlzIHN1cHBvcnRlZCBieSByZWFkaW5nIGEgQ1BVIHJlZ2lzdGVyLCBhbmQgaWYgbm90IGl0IHJldHVybnMgYW4gZXJyb3IuIElmIFJNRSBpcyBzdXBwb3J0ZWQsIGl0IGNhbGxzIGBTTUNfUk1JX1ZFUlNJT05gLiBJZiB0aGF0IGFsc28gZmFpbHMsIGl0IGdpdmVzIGFuIGVycm9yLiBJZiB0aGF0IHN1Y2NlZWRzIGl0IHJlYWRzIGZlYXR1cmVzLCBjb25maWd1cmVzIFJNTSwgYW5kIGluaXRpYWxpemVzIG1ldGFkYXRhLgoKVGhlIGNoYWxsZW5nZSBoZXJlIGlzIG9idmlvdXM6IGl0JiMzOTtzIGEgKm9uZS10aW1lKiBib290IGluaXRpYWxpemF0aW9uLiBJdCBleHBlY3RzIHNwZWNpZmljIGhhcmR3YXJlIGFuZCBmaXJtd2FyZSDigJMgUk1NLiBTdGFuZGFyZCBTeXprYWxsZXIgZW52aXJvbm1lbnRzLCB3aGljaCBpcyBteSBwcmltYXJ5IGZ1enppbmcgdG9vbCwgZG9uJiMzOTt0IHR5cGljYWxseSBoYXZlIHRoaXMuIEkgY2FuJiMzOTt0IHRyaWdnZXIgdGhpcyBjb2RlIHJlcGVhdGVkbHkgZnJvbSB1c2VyLXNwYWNlLCBub3IgZG9lcyBpdCBzZWVtIHRvIGV4cG9zZSBhbnkgdXNlci1zcGFjZSBpbnRlcmZhY2UsIGxpa2UgYSBzeXNjYWxsLCBpb2N0bCwgb3Igc3lzZnMgZW50cnkuIFN5emthbGxlciB3b3JrcyBieSBleGVjdXRpbmcgc3lzY2FsbHMsIHNvIHRoaXMgcHJlc2VudHMgYSBmdW5kYW1lbnRhbCBwcm9ibGVtLgoKV2FpdCwgaXMgdGhlcmUgKmFueSogZGV2aWNlIGV4cG9zZWQ/IE5vcGUuIEFsbCBJIHNlZSBpcyBgYXJtNjRfcm1pX2lzX2F2YWlsYWJsZSA9IHRydWVgIGJlaW5nIHNldCwgYWxvbmcgd2l0aCBzb21lIHN5bWJvbCBleHBvcnRzLiBUaGlzIGlzIGNvbXBsZXRlbHkgdXNlbGVzcyBmb3IgZnV6emluZy4gU3l6a2FsbGVyIGNhbiYjMzk7dCB0b3VjaCBhbnkgb2YgdGhpcy4gS1ZNIHN1cHBvcnQgaXMgbWlzc2luZy4KCkxldCYjMzk7cyBkb3VibGUtY2hlY2sgdGhlIEtjb25maWcuIFRoZSBwYXRjaCBhZGRzIGBDT05GSUdfQVJNX1JNTWAsIHdoaWNoIGRlZmF1bHRzIHRvICYjMzQ7eSYjMzQ7IGFuZCBkZXBlbmRzIG9uIGBBUkNIX1NVUFBPUlRTX1JNTWAuCgpTaW5jZSBLVk0gaXMgKm5vdCogcHJlc2VudCwgYW5kIEtWTSBpcyB0aGUgaW50ZW5kZWQgY29uc3VtZXIsIGFuZCBLVk0gaXNuJiMzOTt0IHVzaW5nIHRoaXMgbGlicmFyeSB5ZXQsIHRoaXMgaXMgcHVyZWx5IGRlYWQgY29kZS4gSXQmIzM5O3MgbGlicmFyeSBmdW5jdGlvbnMgYW5kIGEgYm9vdC10aW1lIGNoZWNrIHRoYXQmIzM5O2xsIGZhaWwgaW4gb3VyIHN0YW5kYXJkIGVudmlyb25tZW50cy4gSXQmIzM5O3Mgbm90IHdvcnRoIHRoZSBlZmZvcnQgdG8gZnV6eiBpdC4KCk9rYXksIGxldCYjMzk7cyB2ZXJpZnkgaWYgS1ZNIHVzZXMgdGhpcyB0aHJvdWdoIGEgZGlmZmVyZW50IHJvdXRlLiBXYXMgS1ZNIG1lcmdlZCwgYnV0IHRoaXMgcGF0Y2ggd2FzIG1pc3Npbmc/IE5vcGUsIEtWTSYjMzk7cyBSTUUgc3VwcG9ydCBpcyBhIGxhcmdlIHNlcmllcywgYW5kIHRoaXMgaXMgb25lIG9mIHRoZSBmaXJzdCBwYXRjaGVzLgoKVGhlcmVmb3JlLCBteSBjb25jbHVzaW9uIGlzIHRoYXQgdGhlIGNvZGUgaXMgbm90IHdvcnRoIGZ1enppbmcuIEkmIzM5O2xsIHJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgYmVjYXVzZSBLVk0gc3VwcG9ydCBpcyBub3QgeWV0IHByZXNlbnQuIFRoZSBhZGRlZCBSTUkgbGlicmFyeSBmdW5jdGlvbnMgYXJlIHVucmVhY2hhYmxlIGZyb20gdXNlci1zcGFjZSwgYW5kIHRoZSBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gcmVsaWVzIG9uIHNwZWNpZmljIGZpcm13YXJlIChSTU0pIG5vdCBwcmVzZW50IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMjE6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGhvc3Qtc2lkZSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBsaWJyYXJ5IGZ1bmN0aW9ucyBhbmQgYm9vdC10aW1lIGluaXRpYWxpemF0aW9uIGZvciBLVk0gdG8gdXNlLiBIb3dldmVyLCBLVk0gc3VwcG9ydCBmb3IgUmVhbG1zIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGlzIHBhdGNoLCBtYWtpbmcgdGhlIGV4cG9ydGVkIGxpYnJhcnkgZnVuY3Rpb25zIHVucmVhY2hhYmxlIGZyb20gdXNlci1zcGFjZS4gRnVydGhlcm1vcmUsIHRoZSBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gcmVxdWlyZXMgc3BlY2lmaWMgaGFyZHdhcmUvZmlybXdhcmUgKFJNTSkgc3VwcG9ydCB0aGF0IGlzIG5vdCBwcmVzZW50IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgYW5kIGl0IHdpbGwgc2ltcGx5IGJhaWwgb3V0IGVhcmx5LiBUaGVyZSBhcmUgbm8gc3lzY2FsbHMsIGlvY3Rscywgb3Igb3RoZXIgdXNlci1zcGFjZSBpbnRlcmZhY2VzIGludHJvZHVjZWQgdGhhdCBzeXprYWxsZXIgY291bGQgZnV6ei4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgaG9zdC1zaWRlIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIGxpYnJhcnkgZnVuY3Rpb25zIGFuZCBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gZm9yIEtWTSB0byB1c2UuIEhvd2V2ZXIsIEtWTSBzdXBwb3J0IGZvciBSZWFsbXMgaXMgbm90IGluY2x1ZGVkIGluIHRoaXMgcGF0Y2gsIG1ha2luZyB0aGUgZXhwb3J0ZWQgbGlicmFyeSBmdW5jdGlvbnMgdW5yZWFjaGFibGUgZnJvbSB1c2VyLXNwYWNlLiBGdXJ0aGVybW9yZSwgdGhlIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiByZXF1aXJlcyBzcGVjaWZpYyBoYXJkd2FyZS9maXJtd2FyZSAoUk1NKSBzdXBwb3J0IHRoYXQgaXMgbm90IHByZXNlbnQgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLCBhbmQgaXQgd2lsbCBzaW1wbHkgYmFpbCBvdXQgZWFybHkuIFRoZXJlIGFyZSBubyBzeXNjYWxscywgaW9jdGxzLCBvciBvdGhlciB1c2VyLXNwYWNlIGludGVyZmFjZXMgaW50cm9kdWNlZCB0aGF0IHN5emthbGxlciBjb3VsZCBmdXp6LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDIxOjI5OjU0LjU0MzEyNTU4OVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU2NzA0Njk0OTYxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIGhvc3Qtc2lkZSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBsaWJyYXJ5IGZ1bmN0aW9ucyBhbmQgYm9vdC10aW1lIGluaXRpYWxpemF0aW9uIGZvciBLVk0gdG8gdXNlLiBIb3dldmVyLCBLVk0gc3VwcG9ydCBmb3IgUmVhbG1zIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGlzIHBhdGNoLCBtYWtpbmcgdGhlIGV4cG9ydGVkIGxpYnJhcnkgZnVuY3Rpb25zIHVucmVhY2hhYmxlIGZyb20gdXNlci1zcGFjZS4gRnVydGhlcm1vcmUsIHRoZSBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gcmVxdWlyZXMgc3BlY2lmaWMgaGFyZHdhcmUvZmlybXdhcmUgKFJNTSkgc3VwcG9ydCB0aGF0IGlzIG5vdCBwcmVzZW50IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgYW5kIGl0IHdpbGwgc2ltcGx5IGJhaWwgb3V0IGVhcmx5LiBUaGVyZSBhcmUgbm8gc3lzY2FsbHMsIGlvY3Rscywgb3Igb3RoZXIgdXNlci1zcGFjZSBpbnRlcmZhY2VzIGludHJvZHVjZWQgdGhhdCBzeXprYWxsZXIgY291bGQgZnV6ei5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDIxOjI5OjU0LjU0MzEzNTQ3OVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODY0MTM2MTc2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgOWNhMzQ3NDQ1YzZjYWNjOWJhMGM4MDgxMTZmYmNkOGRjMDc5MDExOVxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgV2VkIEp1bCAxNSAyMToyOTo1MiAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L0tjb25maWcgYi9hcmNoL2FybTY0L0tjb25maWdcXG5pbmRleCBiM2FmZTA2ODg5MTliZC4uMGYxOTU2ZWRmMTMwN2IgMTAwNjQ0XFxuLS0tIGEvYXJjaC9hcm02NC9LY29uZmlnXFxuKysrIGIvYXJjaC9hcm02NC9LY29uZmlnXFxuQEAgLTM4LDYgKzM4LDcgQEAgY29uZmlnIEFSTTY0XFxuIFxcdHNlbGVjdCBBUkNIX0hBU19NRU1CQVJSSUVSX1NZTkNfQ09SRVxcbiBcXHRzZWxlY3QgQVJDSF9IQVNfTUVNX0VOQ1JZUFRcXG4gXFx0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNFQUxfU1lTVEVNX01BUFBJTkdTXFxuK1xcdHNlbGVjdCBBUkNIX1NVUFBPUlRTX1JNTVxcbiBcXHRzZWxlY3QgQVJDSF9IQVNfTk1JX1NBRkVfVEhJU19DUFVfT1BTXFxuIFxcdHNlbGVjdCBBUkNIX0hBU19OT05fT1ZFUkxBUFBJTkdfQUREUkVTU19TUEFDRVxcbiBcXHRzZWxlY3QgQVJDSF9IQVNfTk9OTEVBRl9QTURfWU9VTkcgaWYgQVJNNjRfSEFGVFxcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmhcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5mMTNlY2RiNDBkZWQ0MVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmhcXG5AQCAtMCwwICsxLDQ1OSBAQFxcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xcbisvKlxcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLlxcbisgKi9cXG4rXFxuKyNpZm5kZWYgX19BU01fUk1JX0NNRFNfSFxcbisjZGVmaW5lIF9fQVNNX1JNSV9DTURTX0hcXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9hcm0tcm1pLWNtZHMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2FybS1zbWNjYy1ybWkuaFxcdTAwM2VcXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X2RhdGFfbWFwX2luaXQoKSAtIENyZWF0ZSBhIHByb3RlY3RlZCBtYXBwaW5nIHdpdGggZGF0YSBjb250ZW50c1xcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAZGF0YTogUEEgb2YgdGhlIHRhcmdldCBncmFudWxlXFxuKyAqIEBpcGE6IElQQSBhdCB3aGljaCB0aGUgZ3JhbnVsZSB3aWxsIGJlIG1hcHBlZCBpbiB0aGUgZ3Vlc3RcXG4rICogQHNyYzogUEEgb2YgdGhlIHNvdXJjZSBncmFudWxlXFxuKyAqIEBmbGFnczogUk1JX01FQVNVUkVfQ09OVEVOVCBpZiB0aGUgY29udGVudHMgc2hvdWxkIGJlIG1lYXN1cmVkXFxuKyAqXFxuKyAqIENyZWF0ZSBhIG1hcHBpbmcgZnJvbSBQcm90ZWN0ZWQgSVBBIHNwYWNlIHRvIGNvbnZlbnRpb25hbCBtZW1vcnksIGNvcHlpbmdcXG4rICogY29udGVudHMgZnJvbSBhIE5vbi1zZWN1cmUgR3JhbnVsZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyLlxcbisgKlxcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9kYXRhX21hcF9pbml0KHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgZGF0YSxcXG4rXFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBpcGEsIHVuc2lnbmVkIGxvbmcgc3JjLFxcbitcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGZsYWdzKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfREFUQV9NQVBfSU5JVCwgcmQsIGRhdGEsIGlwYSwgc3JjLCBmbGFnc1xcbitcXHR9O1xcbitcXG4rXFx0cmV0dXJuIHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X2RhdGFfbWFwKCkgLSBDcmVhdGUgbWFwcGluZ3MgaW4gcHJvdGVjdGVkIElQQSB3aXRoIHVua25vd24gY29udGVudHNcXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQGJhc2U6IEJhc2Ugb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXFxuKyAqIEBmbGFnczogRmxhZ3NcXG4rICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxcbisgKiBAb3V0X3RvcDogVG9wIGFkZHJlc3Mgb2YgcmFuZ2Ugd2hpY2ggd2FzIHByb2Nlc3NlZC5cXG4rICpcXG4rICogUmV0dXJuIFJNSSByZXR1cm4gY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9kYXRhX21hcCh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIGJhc2UsXFxuK1xcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIGZsYWdzLFxcbitcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxcbitcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfREFUQV9NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxcbitcXHR9O1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0cmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChvdXRfdG9wKVxcbitcXHRcXHQqb3V0X3RvcCA9IHJlZ3MuYTE7XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3J0dF9kYXRhX3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3MgdG8gY29udmVudGlvbmFsIG1lbW9yeVxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCBSZWFsbVxcbisgKiBAYmFzZTogQmFzZSBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxcbisgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcXG4rICogQGZsYWdzOiBGbGFnc1xcbisgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXFxuKyAqIEBvdXRfdG9wOiBSZXR1cm5zIHRvcCBJUEEgb2YgcmFuZ2Ugd2hpY2ggaGFzIGJlZW4gdW5tYXBwZWRcXG4rICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2VcXG4rICogQG91dF9jb3VudDogTnVtYmVyIG9mIGVudHJpZXMgaW4gb3V0cHV0IGFkZHJlc3MgbGlzdFxcbisgKlxcbisgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIGNvbnZlbnRpb24gbWVtb3J5IHdpdGggYSB0YXJnZXQgUHJvdGVjdGVkIElQQSByYW5nZS5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGF0YV91bm1hcCh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSxcXG4rXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIHRvcCxcXG4rXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLFxcbitcXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgb2FkZHIsXFxuK1xcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCxcXG4rXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nICpvdXRfcmFuZ2UsXFxuK1xcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyAqb3V0X2NvdW50KVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfREFUQV9VTk1BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXFxuK1xcdH07XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0aWYgKG91dF90b3ApXFxuK1xcdFxcdCpvdXRfdG9wID0gcmVncy5hMTtcXG4rXFx0aWYgKG91dF9yYW5nZSlcXG4rXFx0XFx0Km91dF9yYW5nZSA9IHJlZ3MuYTI7XFxuK1xcdGlmIChvdXRfY291bnQpXFxuK1xcdFxcdCpvdXRfY291bnQgPSByZWdzLmEzO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9wc2NpX2NvbXBsZXRlKCkgLSBDb21wbGV0ZSBwZW5kaW5nIFBTQ0kgY29tbWFuZFxcbisgKiBAY2FsbGluZ19yZWM6IFBBIG9mIHRoZSBjYWxsaW5nIFJFQ1xcbisgKiBAc3RhdHVzOiBTdGF0dXMgb2YgdGhlIFBTQ0kgcmVxdWVzdFxcbisgKlxcbisgKiBDb21wbGV0ZXMgYSBwZW5kaW5nIFBTQ0kgY29tbWFuZC5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9wc2NpX2NvbXBsZXRlKHVuc2lnbmVkIGxvbmcgY2FsbGluZ19yZWMsXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIHN0YXR1cylcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XFxuK1xcbitcXHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1BTQ0lfQ09NUExFVEUsIGNhbGxpbmdfcmVjLCBzdGF0dXMsIFxcdTAwMjZyZXMpO1xcbitcXG4rXFx0cmV0dXJuIHJlcy5hMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9yZWFsbV9hY3RpdmF0ZSgpIC0gQWN0aXZlIGEgcmVhbG1cXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICpcXG4rICogTWFyayBhIHJlYWxtIGFzIEFjdGl2ZSBzaWduYWxsaW5nIHRoYXQgY3JlYXRpb24gaXMgY29tcGxldGUgYW5kIGFsbG93aW5nXFxuKyAqIGV4ZWN1dGlvbiBvZiB0aGUgcmVhbG0uXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfcmVhbG1fYWN0aXZhdGUodW5zaWduZWQgbG9uZyByZClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XFxuK1xcbitcXHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1JFQUxNX0FDVElWQVRFLCByZCwgXFx1MDAyNnJlcyk7XFxuK1xcbitcXHRyZXR1cm4gcmVzLmEwO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3JlYWxtX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgcmVhbG1cXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQHBhcmFtczogUEEgb2YgcmVhbG0gcGFyYW1ldGVyc1xcbisgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxcbisgKlxcbisgKiBDcmVhdGUgYSBuZXcgcmVhbG0gdXNpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfcmVhbG1fY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcGFyYW1zLFxcbitcXHRcXHRcXHRcXHQgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxcbit7XFxuK1xcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcXG4rXFx0XFx0XFx0XFx0ICAgU01DX1JNSV9SRUFMTV9DUkVBVEUsIHJkLCBwYXJhbXMpO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3JlYWxtX3Rlcm1pbmF0ZSgpIC0gVGVybWluYXRlIGEgcmVhbG1cXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcXG4rICpcXG4rICogVGVybWluYXRlcyBhIHJlYWxtLCBtb3ZpbmcgaXQgaW50byBhIFpPTUJJRSBzdGF0ZVxcbisgKlxcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX3Rlcm1pbmF0ZSh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxcbit7XFxuK1xcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcXG4rXFx0XFx0XFx0XFx0ICAgU01DX1JNSV9SRUFMTV9URVJNSU5BVEUsIHJkKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9yZWFsbV9kZXN0cm95KCkgLSBEZXN0cm95IGEgcmVhbG1cXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcXG4rICpcXG4rICogRGVzdHJveXMgYSByZWFsbSwgYWxsIG9iamVjdHMgYmVsb25naW5nIHRvIHRoZSByZWFsbSBtdXN0IGJlIGRlc3Ryb3llZCBmaXJzdC5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9yZWFsbV9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXFxuK1xcdFxcdFxcdFxcdCAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxcbit7XFxuK1xcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcXG4rXFx0XFx0XFx0XFx0ICAgU01DX1JNSV9SRUFMTV9ERVNUUk9ZLCByZCk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcmVjX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgUkVDXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXFxuKyAqIEBwYXJhbXM6IFBBIG9mIFJFQyBwYXJhbWV0ZXJzXFxuKyAqIEBzcm86IEFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXFxuKyAqXFxuKyAqIENyZWF0ZSBhIFJFQyB1c2luZyB0aGUgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdCByZWNfcGFyYW1zIHBvaW50ZWRcXG4rICogdG8gYnkgQHBhcmFtcy5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9yZWNfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsXFxuK1xcdFxcdFxcdFxcdCB1bnNpZ25lZCBsb25nIHJlYyxcXG4rXFx0XFx0XFx0XFx0IHVuc2lnbmVkIGxvbmcgcGFyYW1zLFxcbitcXHRcXHRcXHRcXHQgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0KnNybyA9IChzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSl7LnJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUkVDX0NSRUFURSwgcmQsIHJlYywgcGFyYW1zXFxuK1xcdH19O1xcbitcXHRyZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzcm8sIEdGUF9LRVJORUwpO1xcbitcXHRybWlfc3JvX2ZyZWUoc3JvKTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcmVjX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSBSRUNcXG4rICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUNcXG4rICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcXG4rICpcXG4rICogRGVzdHJveXMgYSBSRUMuIFRoZSBSRUMgbXVzdCBub3QgYmUgcnVubmluZy5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9yZWNfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJlYyxcXG4rXFx0XFx0XFx0XFx0ICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxcbit7XFxuK1xcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwgU01DX1JNSV9SRUNfREVTVFJPWSwgcmVjKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9yZWNfZW50ZXIoKSAtIEVudGVyIGEgUkVDXFxuKyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXFxuKyAqIEBydW5fcHRyOiBQQSBvZiBSZWNSdW4gc3RydWN0dXJlXFxuKyAqXFxuKyAqIFN0YXJ0cyAob3IgY29udGludWVzKSBleGVjdXRpb24gd2l0aGluIGEgUkVDLlxcbisgKlxcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3JlY19lbnRlcih1bnNpZ25lZCBsb25nIHJlYywgdW5zaWduZWQgbG9uZyBydW5fcHRyKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcXG4rXFxuK1xcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUkVDX0VOVEVSLCByZWMsIHJ1bl9wdHIsIFxcdTAwMjZyZXMpO1xcbitcXG4rXFx0cmV0dXJuIHJlcy5hMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfY3JlYXRlKCkgLSBDcmVhdGVzIGFuIFJUVFxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAcnR0OiBQQSBvZiB0aGUgdGFyZ2V0IFJUVFxcbisgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcXG4rICogQGxldmVsOiBEZXB0aCBvZiB0aGUgUlRUIHdpdGhpbiB0aGUgdHJlZVxcbisgKlxcbisgKiBDcmVhdGVzIGFuIFJUVCAoUmVhbG0gVHJhbnNsYXRpb24gVGFibGUpIGF0IHRoZSBzcGVjaWZpZWQgbGV2ZWwgZm9yIHRoZVxcbisgKiB0cmFuc2xhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGFkZHJlc3Mgd2l0aGluIHRoZSByZWFsbS5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcnR0LFxcbitcXHRcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBpcGEsIGxvbmcgbGV2ZWwpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9DUkVBVEUsIHJkLCBydHQsIGlwYSwgbGV2ZWxcXG4rXFx0fTtcXG4rXFxuK1xcdHJldHVybiBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3J0dF9kZXN0cm95KCkgLSBEZXN0cm95IGFuIFJUVFxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCByZWFsbVxcbisgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcXG4rICogQGxldmVsOiBSVFQgbGV2ZWxcXG4rICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZFxcbisgKiBAb3V0X3RvcDogUG9pbnRlciB0byB3cml0ZSB0aGUgdG9wIElQQSBvZiBub24tbGl2ZSBSVFQgZW50cmllcywgZnJvbSBlbnRyeVxcbisgKiBhdCB3aGljaCB0aGUgUlRUIHdhbGsgdGVybWluYXRlZC5cXG4rICpcXG4rICogRGVzdHJveXMgYW4gUlRULiBUaGUgUlRUIG11c3QgYmUgbm9uLWxpdmUsIGkuZS4gbm9uZSBvZiB0aGUgZW50cmllcyBpbiB0aGVcXG4rICogdGFibGUgYXJlIGluIEFTU0lHTkVEIG9yIFRBQkxFIHN0YXRlLlxcbisgKlxcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZS5cXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgaXBhLFxcbitcXHRcXHRcXHRcXHQgIGxvbmcgbGV2ZWwsXFxuK1xcdFxcdFxcdFxcdCAgdW5zaWduZWQgbG9uZyAqb3V0X3J0dCxcXG4rXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfREVTVFJPWSwgcmQsIGlwYSwgbGV2ZWxcXG4rXFx0fTtcXG4rXFx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAob3V0X3J0dClcXG4rXFx0XFx0Km91dF9ydHQgPSByZWdzLmExO1xcbitcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmEyO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfZm9sZCgpIC0gRm9sZCBhbiBSVFRcXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUXFxuKyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWVcXG4rICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZFxcbisgKlxcbisgKiBGb2xkcyBhbiBSVFQuIElmIGFsbCBlbnRyaWVzIHdpdGggdGhlIFJUVCBhcmUgJ2hvbW9nZW5lb3VzJyB0aGUgUlRUIGNhbiBiZVxcbisgKiBmb2xkZWQgaW50byB0aGUgcGFyZW50IGFuZCB0aGUgUlRUIGRlc3Ryb3llZC5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZm9sZCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGlwYSxcXG4rXFx0XFx0XFx0ICAgICAgIGxvbmcgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgKm91dF9ydHQpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9GT0xELCByZCwgaXBhLCBsZXZlbFxcbitcXHR9O1xcbitcXHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChvdXRfcnR0KVxcbitcXHRcXHQqb3V0X3J0dCA9IHJlZ3MuYTE7XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3J0dF9pbml0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIG5ldyByZWFsbVxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAYmFzZTogQmFzZSBvZiB0YXJnZXQgSVBBIHJlZ2lvblxcbisgKiBAdG9wOiBUb3Agb2YgdGFyZ2V0IElQQSByZWdpb25cXG4rICogQG91dF90b3A6IFRvcCBJUEEgb2YgcmFuZ2Ugd2hvc2UgUklQQVMgd2FzIG1vZGlmaWVkXFxuKyAqXFxuKyAqIFNldHMgdGhlIFJJUEFTIG9mIGEgdGFyZ2V0IElQQSByYW5nZSB0byBSQU0sIGZvciBhIHJlYWxtIGluIHRoZSBORVcgc3RhdGUuXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2luaXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBiYXNlLFxcbitcXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgdG9wLCB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfSU5JVF9SSVBBUywgcmQsIGJhc2UsIHRvcFxcbitcXHR9O1xcbitcXHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChvdXRfdG9wKVxcbitcXHRcXHQqb3V0X3RvcCA9IHJlZ3MuYTE7XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3J0dF91bnByb3RfbWFwKCkgLSBNYXAgdW5wcm90ZWN0ZWQgZ3JhbnVsZXMgaW50byBhIHJlYWxtXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBiYXNlOiBCYXNlIElQQSBvZiB0aGUgbWFwcGluZ1xcbisgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcXG4rICogQGZsYWdzOiBGbGFnc1xcbisgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXFxuKyAqIEBvdXRfdG9wOiBUb3AgSVBBIG9mIHJhbmdlIHdoaWNoIGhhcyBiZWVuIG1hcHBlZFxcbisgKlxcbisgKiBDcmVhdGUgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X3VucHJvdF9tYXAodW5zaWduZWQgbG9uZyByZCxcXG4rXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIGJhc2UsXFxuK1xcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyB0b3AsXFxuK1xcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcXG4rXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxcbitcXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9VTlBST1RfTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcXG4rXFx0fTtcXG4rXFx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfc2V0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIGFuIHJ1bm5pbmcgcmVhbG1cXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQHJlYzogUEEgb2YgdGhlIFJFQyBtYWtpbmcgdGhlIHJlcXVlc3RcXG4rICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb25cXG4rICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uXFxuKyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRvcCBJUEEgb2YgcmFuZ2Ugd2hvc2UgUklQQVMgd2FzIG1vZGlmaWVkXFxuKyAqXFxuKyAqIENvbXBsZXRlcyBhIHJlcXVlc3QgbWFkZSBieSB0aGUgcmVhbG0gdG8gY2hhbmdlIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEFcXG4rICogcmFuZ2UuXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X3NldF9yaXBhcyh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJlYyxcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyB0b3AsXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfU0VUX1JJUEFTLCByZCwgcmVjLCBiYXNlLCB0b3BcXG4rXFx0fTtcXG4rXFx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfdW5wcm90X3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3Mgd2l0aGluIGFuIHVucHJvdGVjdGVkIElQQSByYW5nZVxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmdcXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXFxuKyAqIEBmbGFnczogRmxhZ3NcXG4rICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxcbisgKiBAb3V0X3RvcDogVG9wIElQQSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxcbisgKiBAb3V0X3JhbmdlOiBPdXRwdXQgYWRkcmVzcyByYW5nZVxcbisgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XFxuKyAqXFxuKyAqIFJlbW92ZXMgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X3VucHJvdF91bm1hcCh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxcbitcXHRcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyB0b3AsXFxuK1xcdFxcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLFxcbitcXHRcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcXG4rXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3AsXFxuK1xcdFxcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nICpvdXRfcmFuZ2UsXFxuK1xcdFxcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nICpvdXRfY291bnQpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9VTlBST1RfVU5NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxcbitcXHR9O1xcbitcXHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChvdXRfdG9wKVxcbitcXHRcXHQqb3V0X3RvcCA9IHJlZ3MuYTE7XFxuK1xcdGlmIChvdXRfcmFuZ2UpXFxuK1xcdFxcdCpvdXRfcmFuZ2UgPSByZWdzLmEyO1xcbitcXHRpZiAob3V0X2NvdW50KVxcbitcXHRcXHQqb3V0X2NvdW50ID0gcmVncy5hMztcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKyNlbmRpZiAvKiBfX0FTTV9STUlfQ01EU19IICovXFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY1xcbmluZGV4IDlhMjJkZjBjNTEyMGYzLi40YWU2M2M4OWNkYTk3ZCAxMDA2NDRcXG4tLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNcXG4rKysgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNcXG5AQCAtMjkzLDYgKzI5Myw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRpc2FyM1tdID0ge1xcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0cGZyMFtdID0ge1xcbiBcXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0NTVjNfU0hJRlQsIDQsIDApLFxcbiBcXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0NTVjJfU0hJRlQsIDQsIDApLFxcbitcXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX1JNRV9TSElGVCwgNCwgMCksXFxuIFxcdEFSTTY0X0ZUUl9CSVRTKEZUUl9WSVNJQkxFLCBGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0RJVF9TSElGVCwgNCwgMCksXFxuIFxcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQU1VX1NISUZULCA0LCAwKSxcXG4gXFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9NUEFNX1NISUZULCA0LCAwKSxcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXFxuaW5kZXggMTJkYzcwMjU0ODQyY2UuLjU1NTQyODc5ZmJiOGFiIDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ1xcbisrKyBiL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ1xcbkBAIC0zMDEsNSArMzAxLDYgQEAgc291cmNlIFxcXCJkcml2ZXJzL2Zpcm13YXJlL3NhbXN1bmcvS2NvbmZpZ1xcXCJcXG4gc291cmNlIFxcXCJkcml2ZXJzL2Zpcm13YXJlL3NtY2NjL0tjb25maWdcXFwiXFxuIHNvdXJjZSBcXFwiZHJpdmVycy9maXJtd2FyZS90ZWdyYS9LY29uZmlnXFxcIlxcbiBzb3VyY2UgXFxcImRyaXZlcnMvZmlybXdhcmUveGlsaW54L0tjb25maWdcXFwiXFxuK3NvdXJjZSBcXFwiZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWdcXFwiXFxuIFxcbiBlbmRtZW51XFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXFxuaW5kZXggNGRkZWMyODIwYzk2ZmEuLjA3ZThjYTE3ODliNDllIDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGVcXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXFxuQEAgLTM4LDMgKzM4LDQgQEAgb2JqLXlcXHRcXHRcXHRcXHQrPSBzYW1zdW5nL1xcbiBvYmoteVxcdFxcdFxcdFxcdCs9IHNtY2NjL1xcbiBvYmoteVxcdFxcdFxcdFxcdCs9IHRlZ3JhL1xcbiBvYmoteVxcdFxcdFxcdFxcdCs9IHhpbGlueC9cXG4rb2JqLXlcXHRcXHRcXHRcXHQrPSBhcm1fcm1tL1xcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uZDIyNGE3MmNjYTkwODlcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWdcXG5AQCAtMCwwICsxLDIyIEBAXFxuK1xcbitjb25maWcgQVJDSF9TVVBQT1JUU19STU1cXG4rXFx0Ym9vbFxcbitcXG4rY29uZmlnIEFSTV9STU1cXG4rXFx0Ym9vbCBcXFwiUmVhbG0gTWFuYWdlbWVudCBNb25pdG9yIChSTU0pIFN1cHBvcnRcXFwiXFxuK1xcdGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19STU1cXG4rXFx0ZGVmYXVsdCB5XFxuK1xcdGhlbHBcXG4rXFx0ICBTdXBwb3J0IHRoZSBSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3IgKFJNTSkgb24gQXJtIHN5c3RlbXMgdGhhdFxcbitcXHQgIGltcGxlbWVudCB0aGUgUmVhbG0gTWFuYWdlbWVudCBFeHRlbnNpb24gKFJNRSksIGFzIGRlZmluZWQgYnkgdGhlXFxuK1xcdCAgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZS5cXG4rXFxuK1xcdCAgVGhlIFJNTSBydW5zIGluIHRoZSBSZWFsbSB3b3JsZCBhbmQgcHJvdmlkZXMgdGhlIFJlYWxtIE1hbmFnZW1lbnRcXG4rXFx0ICBJbnRlcmZhY2UgKFJNSSkgdXNlZCBieSBhIE5vcm1hbCBXb3JsZCBob3N0IHRvIGNyZWF0ZSwgbWFuYWdlIGFuZCBydW5cXG4rXFx0ICBwcm90ZWN0ZWQgdmlydHVhbCBtYWNoaW5lcyBjYWxsZWQgUmVhbG1zLiBUaGlzIG9wdGlvbiBidWlsZHMgdGhlXFxuK1xcdCAgaG9zdC1zaWRlIFJNSSBzdXBwb3J0IHVzZWQgYnkgS1ZNIHRvIGRldGVjdCBhIGNvbXBhdGlibGUgUk1NLFxcbitcXHQgIGNvbmZpZ3VyZSBpdCwgbWFuYWdlIGRlbGVnYXRlZCBtZW1vcnkgYW5kIGVuYWJsZSBSZWFsbSBndWVzdHMuXFxuK1xcbitcXHQgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiBkb2VzIG5vdCBieSBpdHNlbGYgbWFrZSBSZWFsbSBndWVzdHMgYXZhaWxhYmxlOlxcbitcXHQgIHRoZSBzeXN0ZW0gbXVzdCBhbHNvIHByb3ZpZGUgUk1FLWNhcGFibGUgaGFyZHdhcmUgYW5kIGZpcm13YXJlIHdpdGggYVxcbitcXHQgIGNvbXBhdGlibGUgUk1NIGltcGxlbWVudGF0aW9uLlxcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGUgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi41MWFlZjVjYzA0YjAyY1xcbi0tLSAvZGV2L251bGxcXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcXG5AQCAtMCwwICsxLDIgQEBcXG4rXFxuK29iai0kKENPTkZJR19BUk1fUk1NKVxcdD0gcm1pLm9cXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uZDBjMDgzYmRmMjUxZjRcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jXFxuQEAgLTAsMCArMSw3MjQgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLypcXG4rICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC5cXG4rICovXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvY3B1ZmVhdHVyZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtYmxvY2suaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2FybS1ybWktY21kcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcHJvY2Vzc29yLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbGFiLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjYXNtL21lbW9yeS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYXNtL3BndGFibGUtaHdkZWYuaFxcdTAwM2VcXG4rXFxuK3N0YXRpYyBib29sIGFybTY0X3JtaV9pc19hdmFpbGFibGU7XFxuK1xcbisvKiBDdXJyZW50bHkgb25seSB0aGUgZmlyc3QgMiByZWdpc3RlcnMgYXJlIHVzZWQgYnkgTGludXggKi9cXG4rI2RlZmluZSBSTUlfRkVBVF9SRUdfQ09VTlRcXHQyXFxuK3N0YXRpYyBfX3JvX2FmdGVyX2luaXQgdW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWdfY2FjaGVbUk1JX0ZFQVRfUkVHX0NPVU5UXTtcXG4rXFxuK3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaWQpXFxuK3tcXG4rXFx0aWYgKFdBUk5fT04oaWQgXFx1MDAzZT0gUk1JX0ZFQVRfUkVHX0NPVU5UKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRyZXR1cm4gcm1pX2ZlYXRfcmVnX2NhY2hlW2lkXTtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChybWlfZmVhdF9yZWcpO1xcbitcXG4raW50IHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLFxcbitcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLFxcbitcXHRcXHQgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgcmV0ID0gMDtcXG4rXFx0dW5zaWduZWQgbG9uZyB0b3AgPSBwaHlzICsgc2l6ZTtcXG4rXFx0dW5zaWduZWQgbG9uZyBvdXRfdG9wO1xcbitcXG4rXFx0d2hpbGUgKHBoeXMgXFx1MDAzYyB0b3ApIHtcXG4rXFx0XFx0cmV0ID0gcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUocGh5cywgdG9wLCBcXHUwMDI2b3V0X3RvcCk7XFxuK1xcdFxcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpXFxuK1xcdFxcdFxcdHBoeXMgPSBvdXRfdG9wO1xcbitcXHRcXHRlbHNlIGlmIChyZXQgPT0gUk1JX0JVU1kgfHwgcmV0ID09IFJNSV9CTE9DS0VEKVxcbitcXHRcXHRcXHRjcHVfcmVsYXgoKTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXG4rXFx0aWYgKG91dF9waHlzKVxcbitcXHRcXHQqb3V0X3BoeXMgPSBwaHlzO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChybWlfZGVsZWdhdGVfcmFuZ2UpO1xcbitcXG4raW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsXFxuK1xcdFxcdFxcdCB1bnNpZ25lZCBsb25nIHNpemUpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyByZXQgPSAwO1xcbitcXHR1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgKyBzaXplO1xcbitcXHR1bnNpZ25lZCBsb25nIG91dF90b3A7XFxuK1xcbitcXHR3aGlsZSAocGh5cyBcXHUwMDNjIHRvcCkge1xcbitcXHRcXHRyZXQgPSBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHBoeXMsIHRvcCwgXFx1MDAyNm91dF90b3ApO1xcbitcXHRcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTKVxcbitcXHRcXHRcXHRwaHlzID0gb3V0X3RvcDtcXG4rXFx0XFx0ZWxzZSBpZiAocmV0ID09IFJNSV9CVVNZIHx8IHJldCA9PSBSTUlfQkxPQ0tFRClcXG4rXFx0XFx0XFx0Y3B1X3JlbGF4KCk7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX3VuZGVsZWdhdGVfcmFuZ2UpO1xcbitcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9uYXRlX3JlcV90b19zaXplKHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplID0gUk1JX0RPTkFURV9TSVpFKGRvbmF0ZXJlcSk7XFxuK1xcbitcXHRyZXR1cm4gQklUKEFSTTY0X0hXX1BHVEFCTEVfTEVWRUxfU0hJRlQoMyAtIHVuaXRfc2l6ZSkpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBybWlfc21jY2NfaW52b2tlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3NfaW4sXFxuK1xcdFxcdFxcdCAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVnc19vdXQpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gKnJlZ3NfaW47XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3RhdHVzO1xcbitcXG4rXFx0d2hpbGUgKDEpIHtcXG4rXFx0XFx0YXJtX3NtY2NjXzFfMl9pbnZva2UoXFx1MDAyNnJlZ3MsIHJlZ3Nfb3V0KTtcXG4rXFx0XFx0c3RhdHVzID0gUk1JX1JFVFVSTl9TVEFUVVMocmVnc19vdXQtXFx1MDAzZWEwKTtcXG4rXFx0XFx0aWYgKHN0YXR1cyAhPSBSTUlfQlVTWSBcXHUwMDI2XFx1MDAyNiBzdGF0dXMgIT0gUk1JX0JMT0NLRUQpXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjcHVfcmVsYXgoKTtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBybWlfb3BfY29udGludWUodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLCB1bnNpZ25lZCBsb25nIGZsYWdzLFxcbitcXHRcXHRcXHQgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX09QX0NPTlRJTlVFLCBzcm9faGFuZGxlLCBmbGFnc1xcbitcXHR9O1xcbitcXG4rXFx0cm1pX3NtY2NjX2ludm9rZShcXHUwMDI2cmVncywgb3V0X3JlZ3MpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBybWlfb3BfY2FuY2VsKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncylcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfT1BfQ0FOQ0VMLCBzcm9faGFuZGxlXFxuK1xcdH07XFxuK1xcbitcXHRybWlfc21jY2NfaW52b2tlKFxcdTAwMjZyZWdzLCBvdXRfcmVncyk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHJtaV9vcF9tZW1fZG9uYXRlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsXFxuK1xcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9jb3VudCwgdW5zaWduZWQgbG9uZyBmbGFncyxcXG4rXFx0XFx0XFx0ICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX09QX01FTV9ET05BVEUsIHNyb19oYW5kbGUsIGxpc3RfYWRkciwgbGlzdF9jb3VudCwgZmxhZ3NcXG4rXFx0fTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UoXFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgcm1pX29wX21lbV9yZWNsYWltKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9hZGRyLFxcbitcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2NvdW50LFxcbitcXHRcXHRcXHQgICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnRcXG4rXFx0fTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UoXFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcXG4rfVxcbitcXG4raW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcXG4re1xcbitcXHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5cykpKSB7XFxuK1xcdFxcdC8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovXFxuK1xcdFxcdHJldHVybiAtRUJVU1k7XFxuK1xcdH1cXG4rXFxuK1xcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQocGh5cykpO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwoZnJlZV9kZWxlZ2F0ZWRfcGFnZSk7XFxuK1xcbitzdGF0aWMgaW50IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuK1xcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgY291bnQpXFxuK3tcXG4rXFx0aWYgKFdBUk5fT05fT05DRShzcm8tXFx1MDAzZWFkZHJfY291bnQgXFx1MDAzZSBSTUlfTUFYX0FERFJfTElTVCkpXFxuK1xcdFxcdHJldHVybiAtRU9WRVJGTE9XO1xcbitcXG4rXFx0aWYgKGNvdW50IFxcdTAwM2UgUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tXFx1MDAzZWFkZHJfY291bnQpXFxuK1xcdFxcdHJldHVybiAtRU5PU1BDO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuK1xcdFxcdFxcdFxcdCB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXFxuK1xcdFxcdFxcdFxcdCB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSxcXG4rXFx0XFx0XFx0XFx0IHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLFxcbitcXHRcXHRcXHRcXHQgZ2ZwX3QgZ2ZwKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplID0gUk1JX0RPTkFURV9TSVpFKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplX2J5dGVzID0gZG9uYXRlX3JlcV90b19zaXplKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3RhdGUgPSBSTUlfRE9OQVRFX1NUQVRFKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc2l6ZSA9IHVuaXRfc2l6ZV9ieXRlcyAqIGNvdW50O1xcbitcXHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XFxuK1xcdGludCByZXQ7XFxuK1xcdHZvaWQgKnZpcnQ7XFxuK1xcdHBoeXNfYWRkcl90IHBoeXM7XFxuK1xcbitcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIHNyby1cXHUwMDNlYWRkcl9jb3VudDsgaSsrKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXFx1MDAzZWFkZHJfbGlzdFtpXTtcXG4rXFxuK1xcdFxcdGlmIChSTUlfQUREUl9SQU5HRV9TSVpFKGVudHJ5KSA9PSB1bml0X3NpemUgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KSA9PSBjb3VudCBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpID09IHN0YXRlIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICBJU19BTElHTkVEKFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpLCBzaXplKSkge1xcbitcXHRcXHRcXHRzcm8tXFx1MDAzZWFkZHJfY291bnQtLTtcXG4rXFx0XFx0XFx0c3dhcChzcm8tXFx1MDAzZWFkZHJfbGlzdFtzcm8tXFx1MDAzZWFkZHJfY291bnRdLFxcbitcXHRcXHRcXHQgICAgIHNyby1cXHUwMDNlYWRkcl9saXN0W2ldKTtcXG4rXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgMSk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHR2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3Qoc2l6ZSwgZ2ZwKTtcXG4rXFx0aWYgKCF2aXJ0KVxcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFx0cGh5cyA9IHZpcnRfdG9fcGh5cyh2aXJ0KTtcXG4rXFxuK1xcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCkge1xcbitcXHRcXHRwaHlzX2FkZHJfdCBkZWxlZ2F0ZWRfcGh5cztcXG4rXFxuK1xcdFxcdGlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgc2l6ZSwgXFx1MDAyNmRlbGVnYXRlZF9waHlzKSkge1xcbitcXHRcXHRcXHRpZiAoIXJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIGRlbGVnYXRlZF9waHlzIC0gcGh5cykpXFxuK1xcdFxcdFxcdFxcdGZyZWVfcGFnZXNfZXhhY3QodmlydCwgc2l6ZSk7XFxuK1xcdFxcdFxcdHJldHVybiAtRU5YSU87XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0YWRkcl9yYW5nZSA9IHBoeXMgXFx1MDAyNiBSTUlfQUREUl9SQU5HRV9BRERSX01BU0s7XFxuK1xcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TSVpFX01BU0ssIFxcdTAwMjZhZGRyX3JhbmdlLCB1bml0X3NpemUpO1xcbitcXHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTSywgXFx1MDAyNmFkZHJfcmFuZ2UsIGNvdW50KTtcXG4rXFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFxcdTAwMjZhZGRyX3JhbmdlLCBzdGF0ZSk7XFxuK1xcbitcXHRzcm8tXFx1MDAzZWFkZHJfbGlzdFtzcm8tXFx1MDAzZWFkZHJfY291bnRdID0gYWRkcl9yYW5nZTtcXG4rXFxuK291dDpcXG4rXFx0cm1pX29wX21lbV9kb25hdGUoc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICB2aXJ0X3RvX3BoeXMoXFx1MDAyNnNyby1cXHUwMDNlYWRkcl9saXN0W3Nyby1cXHUwMDNlYWRkcl9jb3VudF0pLCAxLFxcbitcXHRcXHRcXHQgIDAsIG91dF9yZWdzKTtcXG4rXFxuK1xcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9ncmFudWxlcyA9IG91dF9yZWdzLVxcdTAwM2VhMTtcXG4rXFx0dW5zaWduZWQgbG9uZyBkb25hdGVkX3NpemUgPSBkb25hdGVkX2dyYW51bGVzIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQ7XFxuK1xcbitcXHRpZiAoZG9uYXRlZF9ncmFudWxlcyA9PSAwKSB7XFxuK1xcdFxcdC8qIE5vIHBhZ2VzIHVzZWQgYnkgdGhlIFJNTSAqL1xcbitcXHRcXHRzcm8tXFx1MDAzZWFkZHJfY291bnQrKztcXG4rXFx0fSBlbHNlIGlmIChkb25hdGVkX3NpemUgXFx1MDAzYyBzaXplKSB7XFxuK1xcdFxcdHBoeXMgPSBzcm8tXFx1MDAzZWFkZHJfbGlzdFtzcm8tXFx1MDAzZWFkZHJfY291bnRdIFxcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xcbitcXG4rXFx0XFx0LyogTm90IGFsbCBncmFudWxlcyB1c2VkIGJ5IHRoZSBSTU0sIGZyZWUgdGhlIHJlbWFpbmluZyBwYWdlcyAqL1xcbitcXHRcXHRmb3IgKGxvbmcgaSA9IGRvbmF0ZWRfc2l6ZTsgaSBcXHUwMDNjIHNpemU7IGkgKz0gUEFHRV9TSVpFKSB7XFxuK1xcdFxcdFxcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRClcXG4rXFx0XFx0XFx0XFx0ZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzICsgaSk7XFxuK1xcdFxcdFxcdGVsc2VcXG4rXFx0XFx0XFx0XFx0X19mcmVlX3BhZ2UocGh5c190b19wYWdlKHBoeXMgKyBpKSk7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfbm9uY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSxcXG4rXFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLFxcbitcXHRcXHRcXHRcXHQgICAgZ2ZwX3QgZ2ZwKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplID0gUk1JX0RPTkFURV9TSVpFKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplX2J5dGVzID0gZG9uYXRlX3JlcV90b19zaXplKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3RhdGUgPSBSTUlfRE9OQVRFX1NUQVRFKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZm91bmQgPSAwO1xcbitcXHR1bnNpZ25lZCBsb25nIGFkZHJfbGlzdF9zdGFydCA9IHNyby1cXHUwMDNlYWRkcl9jb3VudDtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2MgYWRkcl9saXN0X3N0YXJ0IFxcdTAwMjZcXHUwMDI2IGZvdW5kIFxcdTAwM2MgY291bnQ7IGkrKykge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLVxcdTAwM2VhZGRyX2xpc3RbaV07XFxuK1xcbitcXHRcXHRpZiAoUk1JX0FERFJfUkFOR0VfU0laRShlbnRyeSkgPT0gdW5pdF9zaXplIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICBSTUlfQUREUl9SQU5HRV9DT1VOVChlbnRyeSkgPT0gMSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpID09IHN0YXRlKSB7XFxuK1xcdFxcdFxcdGFkZHJfbGlzdF9zdGFydC0tO1xcbitcXHRcXHRcXHRzd2FwKHNyby1cXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydF0sXFxuK1xcdFxcdFxcdCAgICAgc3JvLVxcdTAwM2VhZGRyX2xpc3RbaV0pO1xcbitcXHRcXHRcXHRmb3VuZCsrO1xcbitcXHRcXHRcXHRpLS07XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gcm1pX3Nyb19lbnN1cmVfY2FwYWNpdHkoc3JvLCBjb3VudCAtIGZvdW5kKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHdoaWxlIChmb3VuZCBcXHUwMDNjIGNvdW50KSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgYWRkcl9yYW5nZTtcXG4rXFx0XFx0dm9pZCAqdmlydCA9IGFsbG9jX3BhZ2VzX2V4YWN0KHVuaXRfc2l6ZV9ieXRlcywgZ2ZwKTtcXG4rXFx0XFx0cGh5c19hZGRyX3QgcGh5cztcXG4rXFxuK1xcdFxcdGlmICghdmlydClcXG4rXFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcbitcXHRcXHRwaHlzID0gdmlydF90b19waHlzKHZpcnQpO1xcbitcXG4rXFx0XFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7XFxuK1xcdFxcdFxcdHBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzO1xcbitcXG4rXFx0XFx0XFx0aWYgKHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCB1bml0X3NpemVfYnl0ZXMsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBcXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XFxuK1xcdFxcdFxcdFxcdGlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSlcXG4rXFx0XFx0XFx0XFx0XFx0ZnJlZV9wYWdlc19leGFjdCh2aXJ0LCB1bml0X3NpemVfYnl0ZXMpO1xcbitcXHRcXHRcXHRcXHRyZXR1cm4gLUVOWElPO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGFkZHJfcmFuZ2UgPSBwaHlzIFxcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xcbitcXHRcXHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCBcXHUwMDI2YWRkcl9yYW5nZSwgdW5pdF9zaXplKTtcXG4rXFx0XFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIFxcdTAwMjZhZGRyX3JhbmdlLCAxKTtcXG4rXFx0XFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFxcdTAwMjZhZGRyX3JhbmdlLCBzdGF0ZSk7XFxuK1xcbitcXHRcXHRzcm8tXFx1MDAzZWFkZHJfbGlzdFtzcm8tXFx1MDAzZWFkZHJfY291bnQrK10gPSBhZGRyX3JhbmdlO1xcbitcXHRcXHRmb3VuZCsrO1xcbitcXHR9XFxuK1xcbitcXHRybWlfb3BfbWVtX2RvbmF0ZShzcm9faGFuZGxlLFxcbitcXHRcXHRcXHQgIHZpcnRfdG9fcGh5cyhcXHUwMDI2c3JvLVxcdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSksXFxuK1xcdFxcdFxcdCAgZm91bmQsIDAsIG91dF9yZWdzKTtcXG4rXFxuK1xcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9ncmFudWxlcyA9IG91dF9yZWdzLVxcdTAwM2VhMTtcXG4rXFx0dW5zaWduZWQgbG9uZyBncmFudWxlc19wZXJfdW5pdCA9IHVuaXRfc2l6ZV9ieXRlcyBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbitcXHR1bnNpZ25lZCBsb25nIGNvbnN1bWVkX3VuaXRzO1xcbitcXG4rXFx0LypcXG4rXFx0ICogVGhlIFJNTSBzaG91bGRuJ3QgcmVwb3J0IG1vcmUgZ3JhbnVsZXMgdGhhbiB3ZSBwcm92aWRlZCwgYnV0IGNsYW1wXFxuK1xcdCAqIGp1c3QgaW4gY2FzZS5cXG4rXFx0ICovXFxuK1xcdGlmIChXQVJOX09OX09OQ0UoZG9uYXRlZF9ncmFudWxlcyBcXHUwMDNlIGZvdW5kICogZ3JhbnVsZXNfcGVyX3VuaXQpKVxcbitcXHRcXHRkb25hdGVkX2dyYW51bGVzID0gZm91bmQgKiBncmFudWxlc19wZXJfdW5pdDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSBSTU0gcmVwb3J0cyB0aGUgY29uc3VtZWQgbWVtb3J5IGluIHRlcm1zIG9mIGdyYW51bGVzLCBidXQgd2VcXG4rXFx0ICogdHJhY2sgaW4gdGhlIGFkZHJlc3MgbGlzdHMgaW4gdW5pdC1zaXplZCByYW5nZXMuIFNvIGRpdmlkZSB0byBnZXRcXG4rXFx0ICogdGhlIG51bWJlciBvZiAoY29tcGxldGUpIGNvbnN1bWVkIHVuaXRzLlxcbitcXHQgKi9cXG4rXFx0Y29uc3VtZWRfdW5pdHMgPSBkb25hdGVkX2dyYW51bGVzIC8gZ3JhbnVsZXNfcGVyX3VuaXQ7XFxuK1xcdGlmIChkb25hdGVkX2dyYW51bGVzICUgZ3JhbnVsZXNfcGVyX3VuaXQpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogQSB1bml0IGhhcyBiZWVuIHBhcnRpYWxseSBjb25zdW1lZCwgdGhlIHN0YXJ0IGlzIG93bmVkIGJ5XFxuK1xcdFxcdCAqIHRoZSBSTU0sIHRoZSB0YWlsIGlzIG93bmVkIGJ5IHRoZSBob3N0XFxuK1xcdFxcdCAqL1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGVudHJ5ID1cXG4rXFx0XFx0XFx0c3JvLVxcdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0ICsgY29uc3VtZWRfdW5pdHNdO1xcbitcXHRcXHRwaHlzX2FkZHJfdCBwaHlzID0gUk1JX0FERFJfUkFOR0VfQUREUihlbnRyeSk7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplID1cXG4rXFx0XFx0XFx0KGRvbmF0ZWRfZ3JhbnVsZXMgJSBncmFudWxlc19wZXJfdW5pdCkgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVDtcXG4rXFxuK1xcdFxcdC8qIEZyZWUgdGhlIHRhaWwgYmFjayAqL1xcbitcXHRcXHRmb3IgKHVuc2lnbmVkIGxvbmcgaSA9IGRvbmF0ZWRfc2l6ZTsgaSBcXHUwMDNjIHVuaXRfc2l6ZV9ieXRlcztcXG4rXFx0XFx0ICAgICBpICs9IFBBR0VfU0laRSkge1xcbitcXHRcXHRcXHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpXFxuK1xcdFxcdFxcdFxcdGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyArIGkpO1xcbitcXHRcXHRcXHRlbHNlXFxuK1xcdFxcdFxcdFxcdF9fZnJlZV9wYWdlKHBoeXNfdG9fcGFnZShwaHlzICsgaSkpO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBUaGlzIHVuaXQgaXMgbm93IGZ1bGx5ICdjb25zdW1lZCcgKGVpdGhlciBoZWxkIGJ5IHRoZSBSTU0gb3JcXG4rXFx0XFx0ICogZnJlZWQpXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRjb25zdW1lZF91bml0cysrO1xcbitcXHR9XFxuK1xcbitcXHQvKiBLZWVwIGp1c3QgdGhlIHVuaXRzIHRoZSBSTU0gZGlkbid0IHVzZSBpbiBhZGRyX2xpc3QgKi9cXG4rXFx0Zm9yICh1bnNpZ25lZCBsb25nIGkgPSBjb25zdW1lZF91bml0czsgaSBcXHUwMDNjIGZvdW5kOyBpKyspXFxuK1xcdFxcdHNyby1cXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCArIGkgLSBjb25zdW1lZF91bml0c10gPVxcbitcXHRcXHRcXHRzcm8tXFx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgKyBpXTtcXG4rXFxuK1xcdHNyby1cXHUwMDNlYWRkcl9jb3VudCAtPSBjb25zdW1lZF91bml0cztcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuK1xcdFxcdFxcdCAgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxcbitcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxcbitcXHRcXHRcXHQgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MsXFxuK1xcdFxcdFxcdCAgZ2ZwX3QgZ2ZwKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XFxuK1xcbitcXHRpZiAoV0FSTl9PTl9PTkNFKCFjb3VudCkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0aWYgKFJNSV9ET05BVEVfQ09OVElHKGRvbmF0ZXJlcSkpIHtcXG4rXFx0XFx0cmV0dXJuIHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzcm8sIHNyb19oYW5kbGUsIGRvbmF0ZXJlcSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICByZWdzLCBnZnApO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRyZXR1cm4gcm1pX3Nyb19kb25hdGVfbm9uY29udGlnKHNybywgc3JvX2hhbmRsZSwgZG9uYXRlcmVxLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRyZWdzLCBnZnApO1xcbitcXHR9XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcm1pX3Nyb19yZWNsYWltKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuK1xcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBjYXBhY2l0eTtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgMSk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJtaV9zcm9fZnJlZShzcm8pO1xcbitcXG4rXFx0Y2FwYWNpdHkgPSBSTUlfTUFYX0FERFJfTElTVCAtIHNyby1cXHUwMDNlYWRkcl9jb3VudDtcXG4rXFxuK1xcdHJtaV9vcF9tZW1fcmVjbGFpbShzcm9faGFuZGxlLFxcbitcXHRcXHRcXHQgICB2aXJ0X3RvX3BoeXMoXFx1MDAyNnNyby1cXHUwMDNlYWRkcl9saXN0W3Nyby1cXHUwMDNlYWRkcl9jb3VudF0pLFxcbitcXHRcXHRcXHQgICBjYXBhY2l0eSwgb3V0X3JlZ3MpO1xcbitcXG4rXFx0aWYgKFdBUk5fT05fT05DRShvdXRfcmVncy1cXHUwMDNlYTEgXFx1MDAzZSBjYXBhY2l0eSkpXFxuK1xcdFxcdG91dF9yZWdzLVxcdTAwM2VhMSA9IGNhcGFjaXR5O1xcbitcXG4rXFx0c3JvLVxcdTAwM2VhZGRyX2NvdW50ICs9IG91dF9yZWdzLVxcdTAwM2VhMTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbit2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxcbit7XFxuK1xcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2Mgc3JvLVxcdTAwM2VhZGRyX2NvdW50OyBpKyspIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9IHNyby1cXHUwMDNlYWRkcl9saXN0W2ldO1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGFkZHIgPSBSTUlfQUREUl9SQU5HRV9BRERSKGVudHJ5KTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfQUREUl9SQU5HRV9TSVpFKGVudHJ5KTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBzaXplID0gZG9uYXRlX3JlcV90b19zaXplKHVuaXRfc2l6ZSkgKiBjb3VudDtcXG4rXFxuK1xcdFxcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCkge1xcbitcXHRcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3JhbmdlKGFkZHIsIHNpemUpKSkge1xcbitcXHRcXHRcXHRcXHQvKiBMZWFrIHRoZSBwYWdlcyAqL1xcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcdFxcdGZyZWVfcGFnZXNfZXhhY3QocGh5c190b192aXJ0KGFkZHIpLCBzaXplKTtcXG4rXFx0fVxcbitcXG4rXFx0c3JvLVxcdTAwM2VhZGRyX2NvdW50ID0gMDtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX2ZyZWUpO1xcbitcXG4rdW5zaWduZWQgbG9uZyBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLCBnZnBfdCBnZnApXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBzcm9faGFuZGxlO1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzID0gXFx1MDAyNnNyby1cXHUwMDNlcmVncztcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UocmVncywgcmVncyk7XFxuK1xcbitcXHRzcm9faGFuZGxlID0gcmVncy1cXHUwMDNlYTE7XFxuK1xcbitcXHR3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cXHUwMDNlYTApID09IFJNSV9JTkNPTVBMRVRFKSB7XFxuK1xcdFxcdGJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLVxcdTAwM2VhMCk7XFxuK1xcdFxcdGludCByZXQgPSAwO1xcbitcXG4rXFx0XFx0c3dpdGNoIChSTUlfUkVUVVJOX01FTVJFUShyZWdzLVxcdTAwM2VhMCkpIHtcXG4rXFx0XFx0Y2FzZSBSTUlfT1BfTUVNX1JFUV9OT05FOlxcbitcXHRcXHRcXHRybWlfb3BfY29udGludWUoc3JvX2hhbmRsZSwgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkcsXFxuK1xcdFxcdFxcdFxcdFxcdHJlZ3MpO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSBSTUlfT1BfTUVNX1JFUV9ET05BVEU6XFxuK1xcdFxcdFxcdHJldCA9IHJtaV9zcm9fZG9uYXRlKHNybywgc3JvX2hhbmRsZSwgcmVncy1cXHUwMDNlYTIsIHJlZ3MsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgZ2ZwKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgUk1JX09QX01FTV9SRVFfUkVDTEFJTTpcXG4rXFx0XFx0XFx0cmV0ID0gcm1pX3Nyb19yZWNsYWltKHNybywgc3JvX2hhbmRsZSwgcmVncyk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRkZWZhdWx0OlxcbitcXHRcXHRcXHRyZXQgPSBXQVJOX09OX09OQ0UoMSk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRpZiAocmV0KSB7XFxuK1xcdFxcdFxcdGlmIChjYW5fY2FuY2VsKVxcbitcXHRcXHRcXHRcXHRybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpO1xcbitcXG4rXFx0XFx0XFx0aWYgKFdBUk5fT05fT05DRShSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVxcdTAwM2VhMCkgIT0gUk1JX0lOQ09NUExFVEUpKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiByZWdzLVxcdTAwM2VhMDtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX21lbXhmZXJfZXhlY3V0ZSk7XFxuK1xcbisvKiBGb3IgUk1JIGNvbW1hbmRzIHRoYXQgYXJlIHN0YXRlZnVsIGJ1dCBub3QgbWVtb3J5LXRyYW5zZmVycmluZyAqL1xcbit1bnNpZ25lZCBsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UocmVncywgcmVncyk7XFxuK1xcbitcXHRzcm9faGFuZGxlID0gcmVncy1cXHUwMDNlYTE7XFxuK1xcbitcXHR3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cXHUwMDNlYTApID09IFJNSV9JTkNPTVBMRVRFKSB7XFxuK1xcdFxcdGJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLVxcdTAwM2VhMCk7XFxuK1xcbitcXHRcXHRzd2l0Y2ggKFJNSV9SRVRVUk5fTUVNUkVRKHJlZ3MtXFx1MDAzZWEwKSkge1xcbitcXHRcXHRjYXNlIFJNSV9PUF9NRU1fUkVRX05PTkU6XFxuK1xcdFxcdFxcdHJtaV9vcF9jb250aW51ZShzcm9faGFuZGxlLCBSTUlfQ09OVElOVUVfS0VFUF9HT0lORyxcXG4rXFx0XFx0XFx0XFx0XFx0cmVncyk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRkZWZhdWx0OlxcbitcXHRcXHRcXHRXQVJOX09OX09OQ0UoMSk7XFxuK1xcdFxcdFxcdGlmICghY2FuX2NhbmNlbClcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIHJlZ3MtXFx1MDAzZWEwO1xcbitcXG4rXFx0XFx0XFx0cm1pX29wX2NhbmNlbChzcm9faGFuZGxlLCByZWdzKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gcmVncy1cXHUwMDNlYTA7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19leGVjdXRlKTtcXG4rXFxuK3N0YXRpYyBpbnQgcm1pX2NoZWNrX3ZlcnNpb24odm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XFxuK1xcdHVuc2lnbmVkIHNob3J0IHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3I7XFxuK1xcdHVuc2lnbmVkIGxvbmcgaG9zdF92ZXJzaW9uID0gUk1JX0FCSV9WRVJTSU9OKFJNSV9BQklfTUFKT1JfVkVSU0lPTixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pO1xcbitcXHR1bnNpZ25lZCBsb25nIGFhNjRwZnIwID0gcmVhZF9zYW5pdGlzZWRfZnRyX3JlZyhTWVNfSURfQUE2NFBGUjBfRUwxKTtcXG4rXFxuK1xcdC8qIElmIFJNRSBpc24ndCBzdXBwb3J0ZWQsIHRoZW4gUk1JIGNhbid0IGJlICovXFxuK1xcdGlmIChjcHVpZF9mZWF0dXJlX2V4dHJhY3RfdW5zaWduZWRfZmllbGQoYWE2NHBmcjAsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQpID09IDApXFxuK1xcdFxcdHJldHVybiAtRU5YSU87XFxuK1xcbitcXHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1ZFUlNJT04sIGhvc3RfdmVyc2lvbiwgXFx1MDAyNnJlcyk7XFxuK1xcbitcXHRpZiAocmVzLmEwID09IFNNQ0NDX1JFVF9OT1RfU1VQUE9SVEVEKVxcbitcXHRcXHRyZXR1cm4gLUVOWElPO1xcbitcXG4rXFx0dmVyc2lvbl9tYWpvciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IocmVzLmExKTtcXG4rXFx0dmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmExKTtcXG4rXFxuK1xcdGlmIChyZXMuYTAgIT0gUk1JX1NVQ0NFU1MpIHtcXG4rXFx0XFx0dW5zaWduZWQgc2hvcnQgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3I7XFxuK1xcbitcXHRcXHRoaWdoX3ZlcnNpb25fbWFqb3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHJlcy5hMik7XFxuK1xcdFxcdGhpZ2hfdmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmEyKTtcXG4rXFxuK1xcdFxcdHByX2VycihcXFwiVW5zdXBwb3J0ZWQgUk1JIEFCSSAodiVkLiVkIC0gdiVkLiVkKSB3ZSB3YW50IHYlZC4lZFxcXFxuXFxcIixcXG4rXFx0XFx0ICAgICAgIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IsXFxuK1xcdFxcdCAgICAgICBoaWdoX3ZlcnNpb25fbWFqb3IsIGhpZ2hfdmVyc2lvbl9taW5vcixcXG4rXFx0XFx0ICAgICAgIFJNSV9BQklfTUFKT1JfVkVSU0lPTixcXG4rXFx0XFx0ICAgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7XFxuK1xcdFxcdHJldHVybiAtRU5YSU87XFxuK1xcdH1cXG4rXFxuK1xcdHByX2luZm8oXFxcIlJNSSBBQkkgdmVyc2lvbiAlZC4lZFxcXFxuXFxcIiwgdmVyc2lvbl9tYWpvciwgdmVyc2lvbl9taW5vcik7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBybWlfcmVhZF9mZWF0dXJlcyh2b2lkKVxcbit7XFxuK1xcdC8qXFxuK1xcdCAqIFNpbmNlIHdlJ3ZlIG5lZ290aWF0ZWQgYSBjb21wYXRpYmxlIHZlcnNpb24gdGhlc2UgZmVhdHVyZSByZWdpc3RlcnNcXG4rXFx0ICogc2hvdWxkIGFsd2F5cyBiZSBhdmFpbGFibGVcXG4rXFx0ICovXFxuK1xcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2MgUk1JX0ZFQVRfUkVHX0NPVU5UOyBpKyspIHtcXG4rXFx0XFx0aWYgKFdBUk5fT04ocm1pX2ZlYXR1cmVzKGksIFxcdTAwMjZybWlfZmVhdF9yZWdfY2FjaGVbaV0pKSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9jb25maWd1cmUodm9pZClcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIHJldDtcXG4rXFx0c3RydWN0IHJtbV9jb25maWcgKmNvbmZpZyBfX2ZyZWUoZnJlZV9wYWdlKSA9IChzdHJ1Y3Qgcm1tX2NvbmZpZyAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcXG4rXFx0c3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyBfX2ZyZWUoa2ZyZWUpID0gKHN0cnVjdCBybWlfc3JvX3N0YXRlICopa21hbGxvY19vYmooKnNybyk7XFxuK1xcbitcXHRpZiAoIWNvbmZpZyB8fCAhc3JvKVxcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdHN3aXRjaCAoUEFHRV9TSVpFKSB7XFxuK1xcdGNhc2UgU1pfNEs6XFxuK1xcdFxcdGNvbmZpZy1cXHUwMDNlcm1pX2dyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNEtCO1xcbitcXHRcXHRicmVhaztcXG4rXFx0Y2FzZSBTWl8xNks6XFxuK1xcdFxcdGNvbmZpZy1cXHUwMDNlcm1pX2dyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfMTZLQjtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgU1pfNjRLOlxcbitcXHRcXHRjb25maWctXFx1MDAzZXJtaV9ncmFudWxlX3NpemUgPSBSTUlfR1JBTlVMRV9TSVpFXzY0S0I7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRkZWZhdWx0OlxcbitcXHRcXHRCVUlMRF9CVUcoKTtcXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogRm9yIG5vdyB3ZSBzZXQgdGhlIHRyYWNraW5nX3JlZ2lvbl9zaXplIHRvIDAgd2hpY2ggaXMgdGhlIG9ubHkgb3B0aW9uXFxuK1xcdCAqIGZvciA0S0IgUEFHRV9TSVpFICgxR0IgZm9yIDRLQiBQQUdFX1NJWkUsIDMyTUIvNTEyTUIgZm9yIDE2S0IvNjRLQikuXFxuK1xcdCAqIFRPRE86IFN1cHBvcnQgb3RoZXIgdHJhY2tpbmcgc2l6ZXMgdmlhIEtjb25maWcgb3B0aW9uIGZvciBvdGhlclxcbitcXHQgKiBQQUdFX1NJWkVTXFxuK1xcdCAqL1xcbitcXHRjb25maWctXFx1MDAzZXRyYWNraW5nX3JlZ2lvbl9zaXplID0gMDtcXG4rXFxuK1xcdHJldCA9IHJtaV9ybW1fY29uZmlnX3NldCh2aXJ0X3RvX3BoeXMoY29uZmlnKSk7XFxuK1xcdGlmIChyZXQpIHtcXG4rXFx0XFx0cHJfZXJyKFxcXCJSTU0gY29uZmlnIHNldCBmYWlsZWRcXFxcblxcXCIpO1xcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gcm1pX3JtbV9hY3RpdmF0ZShzcm8pO1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdHByX2VycihcXFwiUk1NIGFjdGl2YXRlIGZhaWxlZFxcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiAtRU5YSU87XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKlxcbisgKiBNYWtlIHN1cmUgdGhlIGFyZWEgaXMgdHJhY2tlZCBieSBSTU0gYXQgRklORSBncmFudWxhcml0eS5cXG4rICogV2UgZG8gbm90IHN1cHBvcnQgY2hhbmdpbmcgdGhlIHRyYWNraW5nIHlldC5cXG4rICovXFxuK3N0YXRpYyBpbnQgcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcXG4re1xcbitcXHR3aGlsZSAoc3RhcnQgXFx1MDAzYyBlbmQpIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyByZXQsIGNhdGVnb3J5LCBzdGF0ZSwgbmV4dDtcXG4rXFxuK1xcdFxcdHJldCA9IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldChzdGFydCwgZW5kLCBcXHUwMDI2Y2F0ZWdvcnksIFxcdTAwMjZzdGF0ZSwgXFx1MDAyNm5leHQpO1xcbitcXHRcXHRpZiAocmV0ICE9IFJNSV9TVUNDRVNTIHx8XFxuK1xcdFxcdCAgICBzdGF0ZSAhPSBSTUlfVFJBQ0tJTkdfRklORSB8fFxcbitcXHRcXHQgICAgY2F0ZWdvcnkgIT0gUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUwpIHtcXG4rXFx0XFx0XFx0LyogVE9ETzogU2V0IGdyYW51bGUgdHJhY2tpbmcgaW4gdGhpcyBjYXNlICovXFxuK1xcdFxcdFxcdHByX2VycihcXFwiR3JhbnVsZSB0cmFja2luZyBmb3IgcmVnaW9uIGlzbid0IGZpbmUvY29udmVudGlvbmFsOiAlbGx4XFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICAgICAgc3RhcnQpO1xcbitcXHRcXHRcXHRyZXR1cm4gLUVOT0RFVjtcXG4rXFx0XFx0fVxcbitcXHRcXHRzdGFydCA9IG5leHQ7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9jcmVhdGVfZ3B0cyhwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKVxcbit7XFxuK1xcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm87XFxuK1xcdHVuc2lnbmVkIGxvbmcgbDBncHRfc3o7XFxuK1xcbitcXHRzcm8gPSBrbWFsbG9jX29iaigqc3JvLCBHRlBfS0VSTkVMKTtcXG4rXFx0aWYgKCFzcm8pXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4rXFx0bDBncHRfc3ogPSAxVUwgXFx1MDAzY1xcdTAwM2MgKDMwICsgRklFTERfR0VUKFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfTDBHUFRTWixcXG4rXFx0XFx0XFx0XFx0XFx0ICBybWlfZmVhdF9yZWcoMSkpKTtcXG4rXFx0c3RhcnQgPSBBTElHTl9ET1dOKHN0YXJ0LCBsMGdwdF9zeik7XFxuK1xcdGVuZCA9IEFMSUdOKGVuZCwgbDBncHRfc3opO1xcbitcXG4rXFx0d2hpbGUgKHN0YXJ0IFxcdTAwM2MgZW5kKSB7XFxuK1xcdFxcdGludCByZXQgPSBybWlfZ3B0X2wxX2NyZWF0ZShzdGFydCwgc3JvLCBHRlBfS0VSTkVMKTtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIE1ha2Ugc3VyZSB0aGUgTDEgR1BUIHRhYmxlcyBhcmUgY3JlYXRlZCBmb3IgdGhlIHJlZ2lvbi5cXG4rXFx0XFx0ICogUk1JX0VSUk9SX0dQVCBpbmRpY2F0ZXMgdGhlIEwxIHRhYmxlIGFscmVhZHkgZXhpc3RzLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKHJldCAhPSBSTUlfU1VDQ0VTUyBcXHUwMDI2XFx1MDAyNiBSTUlfUkVUVVJOX1NUQVRVUyhyZXQpICE9IFJNSV9FUlJPUl9HUFQpIHtcXG4rXFx0XFx0XFx0cHJfZXJyKFxcXCJHUFQgTGV2ZWwxIHRhYmxlIG1pc3NpbmcgZm9yICVsbHhcXFxcblxcXCIsIHN0YXJ0KTtcXG4rXFx0XFx0XFx0a2ZyZWUoc3JvKTtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcdFxcdH1cXG4rXFx0XFx0c3RhcnQgKz0gbDBncHRfc3o7XFxuK1xcdH1cXG4rXFxuK1xcdGtmcmVlKHNybyk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9pbml0X21ldGFkYXRhKHZvaWQpXFxuK3tcXG4rXFx0cGh5c19hZGRyX3Qgc3RhcnQsIGVuZDtcXG4rXFx0Y29uc3Qgc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcjtcXG4rXFxuK1xcdGZvcl9lYWNoX21lbV9yZWdpb24ocikge1xcbitcXHRcXHRpbnQgcmV0O1xcbitcXG4rXFx0XFx0c3RhcnQgPSBtZW1ibG9ja19yZWdpb25fbWVtb3J5X2Jhc2VfcGZuKHIpIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQ7XFxuK1xcdFxcdGVuZCA9IG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfZW5kX3BmbihyKSBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUO1xcbitcXHRcXHRyZXQgPSBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhzdGFydCwgZW5kKTtcXG4rXFx0XFx0aWYgKHJldClcXG4rXFx0XFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0XFx0cmV0ID0gcm1pX2NyZWF0ZV9ncHRzKHN0YXJ0LCBlbmQpO1xcbitcXHRcXHRpZiAocmV0KVxcbitcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rYm9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIGFybTY0X3JtaV9pc19hdmFpbGFibGU7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgX19pbml0IGFybTY0X2luaXRfcm1pKHZvaWQpXFxuK3tcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdC8qIENvbnRpbnVlIHdpdGhvdXQgcmVhbG0gc3VwcG9ydCBpZiB3ZSBjYW4ndCBhZ3JlZSBvbiBhIHZlcnNpb24gKi9cXG4rXFx0cmV0ID0gcm1pX2NoZWNrX3ZlcnNpb24oKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldCA9IHJtaV9yZWFkX2ZlYXR1cmVzKCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBybWlfY29uZmlndXJlKCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBybWlfaW5pdF9tZXRhZGF0YSgpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0YXJtNjRfcm1pX2lzX2F2YWlsYWJsZSA9IHRydWU7XFxuK1xcdHByX2luZm8oXFxcIlJNSSBjb25maWd1cmVkXFxcIik7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLypcXG4rICogTm90ZSBhcm02NF9pbml0X3JtaSgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBrdm1faW5pdF9ybWkoKSBvdGhlcndpc2UgS1ZNXFxuKyAqIHdpbGwgbm90IHN1cHBvcnQgcmVhbG0gZ3Vlc3RzLiBzdWJzeXNfaW5pdGNhbGwoKSBpcyBjYWxsZWQgYmVmb3JlXFxuKyAqIG1vZHVsZV9pbml0KCkgKHVzZWQgZm9yIEtWTSkgc28gdGhpcyBpcyBPSy5cXG4rICovXFxuK3N1YnN5c19pbml0Y2FsbChhcm02NF9pbml0X3JtaSk7XFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmggYi9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMTM4OTgzYWI0ZTNjMjJcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaFxcbkBAIC0wLDAgKzEsMjA1IEBAXFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXFxuKy8qXFxuKyAqIENvcHlyaWdodCAoQykgMjAyNiBBUk0gTHRkLlxcbisgKi9cXG4rXFxuKyNpZm5kZWYgX19MSU5VWF9BUk1fUk1JX0NNRFNfSF9cXG4rI2RlZmluZSBfX0xJTlVYX0FSTV9STUlfQ01EU19IX1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2FybS1zbWNjYy1ybWkuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2J1Zy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvdHlwZXMuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2Nhc20vcGFnZS5oXFx1MDAzZVxcbitcXG4rc3RydWN0IHJ0dF9lbnRyeSB7XFxuK1xcdHVuc2lnbmVkIGxvbmcgd2Fsa19sZXZlbDtcXG4rXFx0dW5zaWduZWQgbG9uZyBkZXNjO1xcbitcXHRpbnQgc3RhdGU7XFxuK1xcdGludCByaXBhcztcXG4rfTtcXG4rXFxuKyNkZWZpbmUgUk1JX01BWF9BRERSX0xJU1RcXHQyNTZcXG4rXFxuK3N0cnVjdCBybWlfc3JvX3N0YXRlIHtcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzO1xcbitcXHR1bnNpZ25lZCBsb25nIGFkZHJfY291bnQ7XFxuK1xcdHVuc2lnbmVkIGxvbmcgYWRkcl9saXN0W1JNSV9NQVhfQUREUl9MSVNUXTtcXG4rfTtcXG4rXFxuK3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaWQpO1xcbitcXG4raW50IHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUsXFxuK1xcdFxcdCAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpO1xcbitpbnQgcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplKTtcXG4raW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cyk7XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfZGVsZWdhdGVfcGFnZShwaHlzX2FkZHJfdCBwaHlzKVxcbit7XFxuK1xcdHJldHVybiBybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFLCBOVUxMKTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3VuZGVsZWdhdGVfcGFnZShwaHlzX2FkZHJfdCBwaHlzKVxcbit7XFxuK1xcdHJldHVybiBybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBQQUdFX1NJWkUpO1xcbit9XFxuK1xcbitib29sIGlzX3JtaV9hdmFpbGFibGUodm9pZCk7XFxuK1xcbit1bnNpZ25lZCBsb25nIHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sIGdmcF90IGdmcCk7XFxuK3ZvaWQgcm1pX3Nyb19mcmVlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pO1xcbit1bnNpZ25lZCBsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKTtcXG4rXFxuKyNkZWZpbmUgcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIGdmcCwgLi4uKSAoe1xcdFxcdFxcdFxcdFxcXFxcXG4rXFx0c3RydWN0IHJtaV9zcm9fc3RhdGUgKl9fc3JvID0gKHNybyk7XFx0XFx0XFx0XFx0XFxcXFxcbitcXHQqX19zcm8gPSAoc3RydWN0IHJtaV9zcm9fc3RhdGUpeyAucmVncyA9IHtfX1ZBX0FSR1NfX30gfTtcXHRcXFxcXFxuK1xcdGludCBfX3JldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKF9fc3JvLCBnZnApO1xcdFxcdFxcXFxcXG4rXFx0cm1pX3Nyb19mcmVlKF9fc3JvKTtcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuK1xcdF9fcmV0O1xcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4rfSlcXG4rXFxuKy8qKlxcbisgKiBybWlfcm1tX2NvbmZpZ19zZXQoKSAtIENvbmZpZ3VyZSB0aGUgUk1NXFxuKyAqIEBjZmdfcHRyOiBQQSBvZiBhIHN0cnVjdCBybW1fY29uZmlnXFxuKyAqXFxuKyAqIFNldHMgY29uZmlndXJhdGlvbiBvcHRpb25zIG9uIHRoZSBSTU0uXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfcm1tX2NvbmZpZ19zZXQodW5zaWduZWQgbG9uZyBjZmdfcHRyKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcXG4rXFxuK1xcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUk1NX0NPTkZJR19TRVQsIGNmZ19wdHIsIFxcdTAwMjZyZXMpO1xcbitcXG4rXFx0cmV0dXJuIHJlcy5hMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ybW1fYWN0aXZhdGUoKSAtIEFjdGl2YXRlIHRoZSBSTU1cXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ybW1fYWN0aXZhdGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUk1NX0FDVElWQVRFKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ncmFudWxlX3RyYWNraW5nX2dldCgpIC0gR2V0IGNvbmZpZ3VyYXRpb24gb2YgYSBHcmFudWxlIHRyYWNraW5nIHJlZ2lvblxcbisgKiBAc3RhcnQ6IEJhc2UgUEEgb2YgdGhlIHRyYWNraW5nIHJlZ2lvblxcbisgKiBAZW5kOiBFbmQgb2YgdGhlIFBBIHJlZ2lvblxcbisgKiBAb3V0X2NhdGVnb3J5OiBNZW1vcnkgY2F0ZWdvcnlcXG4rICogQG91dF9zdGF0ZTogVHJhY2tpbmcgcmVnaW9uIHN0YXRlXFxuKyAqIEBvdXRfdG9wOiBUb3Agb2YgdGhlIG1lbW9yeSByZWdpb25cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldCh1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbitcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIGVuZCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X2NhdGVnb3J5LFxcbitcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nICpvdXRfc3RhdGUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xcbitcXG4rXFx0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX0dFVCwgc3RhcnQsIGVuZCwgXFx1MDAyNnJlcyk7XFxuK1xcbitcXHRpZiAob3V0X2NhdGVnb3J5KVxcbitcXHRcXHQqb3V0X2NhdGVnb3J5ID0gcmVzLmExO1xcbitcXHRpZiAob3V0X3N0YXRlKVxcbitcXHRcXHQqb3V0X3N0YXRlID0gcmVzLmEyO1xcbitcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZXMuYTM7XFxuK1xcbitcXHRyZXR1cm4gcmVzLmEwO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX2dwdF9sMV9jcmVhdGUoKSAtIENyZWF0ZSBhIExldmVsIDEgR1BUXFxuKyAqIEBhZGRyOiBCYXNlIG9mIHBoeXNpY2FsIGFkZHJlc3MgcmVnaW9uIGRlc2NyaWJlZCBieSB0aGUgTDFHUFRcXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcXG4rICogQGdmcDogQWxsb2NhdGlvbiBmbGFncyBmb3IgU1JPIG1lbW9yeSBkb25hdGlvbiByZXF1ZXN0c1xcbisgKlxcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX2dwdF9sMV9jcmVhdGUodW5zaWduZWQgbG9uZyBhZGRyLFxcbitcXHRcXHRcXHRcXHQgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyxcXG4rXFx0XFx0XFx0XFx0ICAgIGdmcF90IGdmcClcXG4re1xcbitcXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIGdmcCwgU01DX1JNSV9HUFRfTDFfQ1JFQVRFLCBhZGRyKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9mZWF0dXJlcygpIC0gUmVhZCBmZWF0dXJlIHJlZ2lzdGVyXFxuKyAqIEBpbmRleDogRmVhdHVyZSByZWdpc3RlciBpbmRleFxcbisgKiBAb3V0OiBGZWF0dXJlIHJlZ2lzdGVyIHZhbHVlIGlzIHdyaXR0ZW4gdG8gdGhpcyBwb2ludGVyXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfZmVhdHVyZXModW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyAqb3V0KVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcXG4rXFxuK1xcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfRkVBVFVSRVMsIGluZGV4LCBcXHUwMDI2cmVzKTtcXG4rXFxuK1xcdGlmIChvdXQpXFxuK1xcdFxcdCpvdXQgPSByZXMuYTE7XFxuK1xcdHJldHVybiByZXMuYTA7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSgpIC0gRGVsZWdhdGUgZ3JhbnVsZXNcXG4rICogQGJhc2U6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG9mIHRoZSByYW5nZVxcbisgKiBAdG9wOiBQQSBvZiB0aGUgZmlyc3QgZ3JhbnVsZSBhZnRlciB0aGUgcmFuZ2VcXG4rICogQG91dF90b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG5vdCBkZWxlZ2F0ZWRcXG4rICpcXG4rICogRGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlIGZvciB1c2UgYnkgdGhlIHJlYWxtIHdvcmxkLiBJZiB0aGUgZW50aXJlIHJhbmdlXFxuKyAqIHdhcyBkZWxlZ2F0ZWQgdGhlbiBAb3V0X3RvcCA9PSBAdG9wLCBvdGhlcndpc2UgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcXG4rICogYWdhaW4gd2l0aCBAYmFzZSA9PSBAb3V0X3RvcC5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIHRvcCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFLCBiYXNlLCB0b3BcXG4rXFx0fTtcXG4rXFx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ncmFudWxlX3JhbmdlX3VuZGVsZWdhdGUoKSAtIFVuZGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlc1xcbisgKiBAYmFzZTogQmFzZSBQQSBvZiB0aGUgdGFyZ2V0IHJhbmdlXFxuKyAqIEB0b3A6IFRvcCBQQSBvZiB0aGUgdGFyZ2V0IHJhbmdlXFxuKyAqIEBvdXRfdG9wOiBSZXR1cm5zIHRoZSB0b3AgUEEgb2YgcmFuZ2Ugd2hvc2Ugc3RhdGUgaXMgdW5kZWxlZ2F0ZWRcXG4rICpcXG4rICogVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzIHRvIGFsbG93IHVzZSBieSB0aGUgbm9ybWFsIHdvcmxkLiBXaWxsIGZhaWwgaWZcXG4rICogdGhlIGdyYW51bGVzIGFyZSBpbiB1c2UuXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfR1JBTlVMRV9SQU5HRV9VTkRFTEVHQVRFLCBiYXNlLCB0b3BcXG4rXFx0fTtcXG4rXFx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rI2VuZGlmXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oIGIvaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmhcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5jOTY1ZTg4Njc1MThmM1xcbi0tLSAvZGV2L251bGxcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaFxcbkBAIC0wLDAgKzEsNDk5IEBAXFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXFxuKy8qXFxuKyAqIENvcHlyaWdodCAoQykgMjAyMy0yMDI2IEFSTSBMdGQuXFxuKyAqXFxuKyAqIFRoZSB2YWx1ZXMgYW5kIHN0cnVjdHVyZXMgaW4gdGhpcyBmaWxlIGFyZSBmcm9tIHRoZSBSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3JcXG4rICogc3BlY2lmaWNhdGlvbiAoREVOMDEzNykgdmVyc2lvbiAyLjAtYmV0MjpcXG4rICogaHR0cHM6Ly9kZXZlbG9wZXIuYXJtLmNvbS9kb2N1bWVudGF0aW9uL2RlbjAxMzcvMi0wYmV0Mi9cXG4rICovXFxuK1xcbisjaWZuZGVmIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IX1xcbisjZGVmaW5lIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IX1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2FybS1zbWNjYy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYml0ZmllbGQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JpdHMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2J1aWxkX2J1Zy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc2l6ZXMuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2Nhc20vcGFnZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYXNtL3N5c3JlZy5oXFx1MDAzZVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX0NBTEwoZnVuYylcXHRcXHRcXHRcXHRcXFxcXFxuK1xcdEFSTV9TTUNDQ19DQUxMX1ZBTChBUk1fU01DQ0NfRkFTVF9DQUxMLFxcdFxcdFxcXFxcXG4rXFx0XFx0XFx0ICAgQVJNX1NNQ0NDX1NNQ182NCxcXHRcXHRcXFxcXFxuK1xcdFxcdFxcdCAgIEFSTV9TTUNDQ19PV05FUl9TVEFOREFSRCxcXHRcXFxcXFxuK1xcdFxcdFxcdCAgIChmdW5jKSlcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9WRVJTSU9OXFx0XFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1MClcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9NQVBfSU5JVFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNTMpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUkVBTE1fQUNUSVZBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTU3KVxcbisjZGVmaW5lIFNNQ19STUlfUkVBTE1fQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1OClcXG4rI2RlZmluZSBTTUNfUk1JX1JFQUxNX0RFU1RST1lcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTU5KVxcbisjZGVmaW5lIFNNQ19STUlfUkVDX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNWEpXFxuKyNkZWZpbmUgU01DX1JNSV9SRUNfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNWIpXFxuKyNkZWZpbmUgU01DX1JNSV9SRUNfRU5URVJcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTVjKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNWQpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNWUpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUlRUX1JFQURfRU5UUllcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTYxKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9ERVZfVkFMSURBVEVcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTYzKVxcbisjZGVmaW5lIFNNQ19STUlfUFNDSV9DT01QTEVURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjQpXFxuKyNkZWZpbmUgU01DX1JNSV9GRUFUVVJFU1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjUpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfRk9MRFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjYpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUlRUX0lOSVRfUklQQVNcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTY4KVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9SSVBBU1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjkpXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9DUkVBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTZhKVxcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNmIpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUk1NX0NPTkZJR19TRVRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTZlKVxcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfSVJRX05PVElGWVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNmYpXFxuKyNkZWZpbmUgU01DX1JNSV9BVFRFU1RfUExBVF9UT0tFTl9SRUZSRVNIXFx0U01DX1JNSV9DQUxMKDB4MDE3MClcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX0FCT1JUXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE3NClcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfQ09NTVVOSUNBVEVcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTc1KVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9DUkVBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTc2KVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE3NylcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfR0VUX1NUQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE3OClcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUkVGUkVTSFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxN2EpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NFVF9QVUJLRVlcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTdiKVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVE9QXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE3YylcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE3ZClcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxN2UpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0ZPTERcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTdmKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfQUJPUlRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTg1KVxcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9DT01NVU5JQ0FURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxODYpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxODcpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0RFU1RST1lcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTg4KVxcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfU1RBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTg5KVxcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9VTkxPQ0tcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMThhKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9TMkFQXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE4YilcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9JTlRFUkZBQ0VfUkVQT1JUXFx0U01DX1JNSV9DQUxMKDB4MDFkMClcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfR0VUX01FQVNVUkVNRU5UU1xcdFxcdFNNQ19STUlfQ0FMTCgweDAxZDEpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0xPQ0tcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWQyKVxcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9TVEFSVFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZDMpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX1AyUF9CSU5EXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkNClcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfUDJQX1VOQklORFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZDUpXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9FVkVOVF9IQU5ETEVcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWQ2KVxcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfQUNUSVZBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWQ3KVxcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfREVBQ1RJVkFURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZDgpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfQ1JFQVRFXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkYilcXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX1NUX0wyX0RFU1RST1lcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWRjKVxcbisjZGVmaW5lIFNNQ19STUlfRFBUX0wwX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZGQpXFxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDBfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZGUpXFxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDFfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkZilcXG4rI2RlZmluZSBTTUNfUk1JX0RQVF9MMV9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlMClcXG4rI2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfR0VUXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlMSlcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX1NFVFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZTMpXFxuKyNkZWZpbmUgU01DX1JNSV9DTUVNX0FERF9QREVWXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlNClcXG4rI2RlZmluZSBTTUNfUk1JX0NNRU1fQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlNSlcXG4rI2RlZmluZSBTTUNfUk1JX0NNRU1fREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZTYpXFxuKyNkZWZpbmUgU01DX1JNSV9DTUVNX1BPUFVMQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlNylcXG4rI2RlZmluZSBTTUNfUk1JX0NNRU1fUkVNT1ZFX1BERVZcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWU4KVxcbisjZGVmaW5lIFNNQ19STUlfQ01FTV9TVEFSVFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZTkpXFxuKyNkZWZpbmUgU01DX1JNSV9DTUVNX1NUT1BcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWVhKVxcbisjZGVmaW5lIFNNQ19STUlfQ01FTV9VTlBPUFVMQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlYilcXG4rI2RlZmluZSBTTUNfUk1JX1JNTV9DT05GSUdfR0VUXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlYylcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfTUVDX1JFRlJFU0hcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWVkKVxcbisjZGVmaW5lIFNNQ19STUlfUk1NX1NUQVRFX0dFVFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZWUpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfRVZFTlRfQ09OU1VNRVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjApXFxuKyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmMSlcXG4rI2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfUkFOR0VfVU5ERUxFR0FURVxcdFNNQ19STUlfQ0FMTCgweDAxZjIpXFxuKyNkZWZpbmUgU01DX1JNSV9HUFRfTDFfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmMylcXG4rI2RlZmluZSBTTUNfUk1JX0dQVF9MMV9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmNClcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX01BUFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjUpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9VTk1BUFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjYpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX01BUFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjcpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1VOTUFQXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmOClcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9NQVBcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWY5KVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FSQ0hfREVWX1VOTUFQXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmYSlcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9VTlBST1RfTUFQXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmYilcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9VTlBST1RfVU5NQVBcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWZjKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX01BUFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZmQpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1BST1RfVU5NQVBcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWZlKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9VTlBST1RfTUFQXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmZilcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX1VOTUFQXFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwMClcXG4rI2RlZmluZSBTTUNfUk1JX1JFQUxNX1RFUk1JTkFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDEpXFxuKyNkZWZpbmUgU01DX1JNSV9STU1fQUNUSVZBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjAyKVxcbisjZGVmaW5lIFNNQ19STUlfT1BfQ09OVElOVUVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjAzKVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fQ09OTkVDVFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDQpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9ESVNDT05ORUNUXFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwNSlcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTVBMRVRFXFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwNilcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0tFWV9QVVJHRVxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDcpXFxuKyNkZWZpbmUgU01DX1JNSV9PUF9NRU1fRE9OQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwOClcXG4rI2RlZmluZSBTTUNfUk1JX09QX01FTV9SRUNMQUlNXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwOSlcXG4rI2RlZmluZSBTTUNfUk1JX09QX0NBTkNFTFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMGEpXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9GRUFUVVJFU1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMGIpXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9DTURfR0VUXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwYylcXG4rI2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NNRF9DT01QTEVURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMGQpXFxuKyNkZWZpbmUgU01DX1JNSV9QU01NVV9JTkZPXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwZSlcXG4rXFxuKyNkZWZpbmUgUk1JX0FCSV9NQUpPUl9WRVJTSU9OXFx0MlxcbisjZGVmaW5lIFJNSV9BQklfTUlOT1JfVkVSU0lPTlxcdDBcXG4rXFxuKyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUih2ZXJzaW9uKSAoKHZlcnNpb24pIFxcdTAwM2VcXHUwMDNlIDE2KVxcbisjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IodmVyc2lvbikgKCh2ZXJzaW9uKSBcXHUwMDI2IDB4RkZGRilcXG4rI2RlZmluZSBSTUlfQUJJX1ZFUlNJT04obWFqb3IsIG1pbm9yKSAgICAgICgoKG1ham9yKSBcXHUwMDNjXFx1MDAzYyAxNikgfCAobWlub3IpKVxcbitcXG4rI2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVU19NQVNLXFx0XFx0KDB4RkZVTClcXG4rI2RlZmluZSBSTUlfUkVUVVJOX0lOREVYX01BU0tcXHRcXHQoMHhGRlVMIFxcdTAwM2NcXHUwMDNjIDgpXFxuKyNkZWZpbmUgUk1JX1JFVFVSTl9NRU1SRVFfTUFTS1xcdFxcdCgweDNVTCBcXHUwMDNjXFx1MDAzYyA4KVxcbisjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLXFx0KDB4MVVMIFxcdTAwM2NcXHUwMDNjIDEwKVxcbitcXG4rI2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVUyhyZXQpXFx0XFx0RklFTERfR0VUKFJNSV9SRVRVUk5fU1RBVFVTX01BU0ssIHJldClcXG4rI2RlZmluZSBSTUlfUkVUVVJOX0lOREVYKHJldClcXHRcXHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9JTkRFWF9NQVNLLCByZXQpXFxuKyNkZWZpbmUgUk1JX1JFVFVSTl9NRU1SRVEocmV0KVxcdFxcdEZJRUxEX0dFVChSTUlfUkVUVVJOX01FTVJFUV9NQVNLLCByZXQpXFxuKyNkZWZpbmUgUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJldClcXHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMX01BU0ssIHJldClcXG4rXFxuKyNkZWZpbmUgUk1JX1NVQ0NFU1NcXHRcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX0VSUk9SX0lOUFVUXFx0XFx0XFx0MVxcbisjZGVmaW5lIFJNSV9FUlJPUl9SRUFMTVxcdFxcdFxcdDJcXG4rI2RlZmluZSBSTUlfRVJST1JfUkVDXFx0XFx0XFx0M1xcbisjZGVmaW5lIFJNSV9FUlJPUl9SVFRcXHRcXHRcXHQ0XFxuKyNkZWZpbmUgUk1JX0VSUk9SX05PVF9TVVBQT1JURURcXHRcXHQ1XFxuKyNkZWZpbmUgUk1JX0VSUk9SX0RFVklDRVxcdFxcdDZcXG4rI2RlZmluZSBSTUlfRVJST1JfUlRUX0FVWFxcdFxcdDdcXG4rI2RlZmluZSBSTUlfRVJST1JfUFNNTVVfU1RcXHRcXHQ4XFxuKyNkZWZpbmUgUk1JX0VSUk9SX0RQVFxcdFxcdFxcdDlcXG4rI2RlZmluZSBSTUlfQlVTWVxcdFxcdFxcdDEwXFxuKyNkZWZpbmUgUk1JX0VSUk9SX0dMT0JBTFxcdFxcdDExXFxuKyNkZWZpbmUgUk1JX0VSUk9SX1RSQUNLSU5HXFx0XFx0MTJcXG4rI2RlZmluZSBSTUlfSU5DT01QTEVURVxcdFxcdFxcdDEzXFxuKyNkZWZpbmUgUk1JX0JMT0NLRURcXHRcXHRcXHQxNFxcbisjZGVmaW5lIFJNSV9FUlJPUl9HUFRcXHRcXHRcXHQxNVxcbisjZGVmaW5lIFJNSV9FUlJPUl9HUkFOVUxFXFx0XFx0MTZcXG4rXFxuKyNkZWZpbmUgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkdcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX0NPTlRJTlVFX1NUT1BcXHRcXHQxXFxuK1xcbisjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX05PTkVcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX09QX01FTV9SRVFfRE9OQVRFXFx0XFx0MVxcbisjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU1cXHRcXHQyXFxuK1xcbisjZGVmaW5lIFJNSV9ET05BVEVfU0laRV9NQVNLXFx0XFx0M1VMXFxuKyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVF9NQVNLXFx0XFx0R0VOTUFTSygxNSwgMilcXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJR19NQVNLXFx0XFx0QklUKDE2KVxcbisjZGVmaW5lIFJNSV9ET05BVEVfU1RBVEVfTUFTS1xcdFxcdEJJVCgxNylcXG4rXFxuKyNkZWZpbmUgUk1JX0RPTkFURV9TSVpFKHJlcSlcXHRcXHRGSUVMRF9HRVQoUk1JX0RPTkFURV9TSVpFX01BU0ssIHJlcSlcXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPVU5UKHJlcSlcXHRcXHRGSUVMRF9HRVQoUk1JX0RPTkFURV9DT1VOVF9NQVNLLCByZXEpXFxuKyNkZWZpbmUgUk1JX0RPTkFURV9DT05USUcocmVxKVxcdFxcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPTlRJR19NQVNLLCByZXEpXFxuKyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURShyZXEpXFx0XFx0RklFTERfR0VUKFJNSV9ET05BVEVfU1RBVEVfTUFTSywgcmVxKVxcbitcXG4rI2RlZmluZSBSTUlfT1BfTUVNX0RFTEVHQVRFRFxcdFxcdDBcXG4rI2RlZmluZSBSTUlfT1BfTUVNX1VOREVMRUdBVEVEXFx0XFx0MVxcbitcXG4rI2RlZmluZSBSTUlfQUREUl9UWVBFX05PTkVcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9TSU5HTEVcXHRcXHQxXFxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9MSVNUXFx0XFx0MlxcbitcXG4rI2RlZmluZSBSTUlfQUREUl9SQU5HRV9TSVpFX01BU0tcXHRHRU5NQVNLKDEsIDApXFxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTS1xcdEdFTk1BU0soUEFHRV9TSElGVCAtIDEsIDIpXFxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLXFx0KFBBR0VfTUFTSyBcXHUwMDI2IEdFTk1BU0soNTEsIDApKVxcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0tcXHRCSVQoNjMpXFxuK1xcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NJWkUoYXIpXFx0XFx0KEZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9TSVpFX01BU0ssIFxcXFxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgKGFyKSkpXFxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlQoYXIpXFx0KEZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcXFxcXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgIChhcikpKVxcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFIoYXIpXFx0XFx0KChhcikgXFx1MDAyNiBSTUlfQUREUl9SQU5HRV9BRERSX01BU0spXFxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU1RBVEUoYXIpXFx0KEZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcXFxcXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgIChhcikpKVxcbitcXG4rZW51bSBybWlfcmlwYXMge1xcbitcXHRSTUlfRU1QVFkgPSAwLFxcbitcXHRSTUlfUkFNID0gMSxcXG4rXFx0Uk1JX0RFU1RST1lFRCA9IDIsXFxuK1xcdFJNSV9ERVYgPSAzLFxcbit9O1xcbitcXG4rI2RlZmluZSBSTUlfTk9fTUVBU1VSRV9DT05URU5UXFx0MFxcbisjZGVmaW5lIFJNSV9NRUFTVVJFX0NPTlRFTlRcXHQxXFxuK1xcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUzJTWlxcdFxcdEdFTk1BU0soNywgMClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX0xQQTJcXHRcXHRCSVQoOClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1NWRVxcdFxcdEJJVCg5KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFX1ZMXFx0XFx0R0VOTUFTSygxMywgMTApXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9OVU1fQlBTXFx0XFx0R0VOTUFTSygxOSwgMTQpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9OVU1fV1BTXFx0XFx0R0VOTUFTSygyNSwgMjApXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVcXHRcXHRCSVQoMjYpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVfTlVNX0NUUlNcXHRHRU5NQVNLKDMxLCAyNylcXG4rXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl80S0JcXHRCSVQoMClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzE2S0JcXHRCSVQoMSlcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzY0S0JcXHRCSVQoMilcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzI1NlxcdEJJVCgzKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfMzg0XFx0QklUKDQpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV81MTJcXHRCSVQoNSlcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX01BWF9SRUNTX09SREVSXFx0R0VOTUFTSyg5LCA2KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfTDBHUFRTWlxcdFxcdEdFTk1BU0soMTMsIDEwKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUFBTXFx0XFx0R0VOTUFTSygxNiwgMTQpXFxuK1xcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfREFcXHRcXHRCSVQoMClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0RBX0NPSFxcdFxcdEJJVCgxKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVlNNTVVcXHRcXHRCSVQoMilcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0FUU1xcdFxcdEJJVCgzKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfTUFYX1ZERVZTX09SREVSXFx0R0VOTUFTSyg3LCA0KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVkRFVl9LUk9VXFx0QklUKDgpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9OT05fVEVFX1NUUkVBTVxcdEJJVCg5KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfUDJQXFx0XFx0QklUKDEwKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQ01FTV9DWExcXHRcXHRCSVQoMTEpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9NQVhfQ01FTVxcdFxcdEdFTk1BU0soMTksIDEyKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQ01FTV9UU0VfUkVRXFx0QklUKDIwKVxcbitcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX01BWF9OVU1fQVVYX1BMQU5FU1xcdEdFTk1BU0soMywgMClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9QTEFORVxcdFxcdEdFTk1BU0soNSwgNClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9TMkFQX0lORElSRUNUXFx0QklUKDYpXFxuK1xcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzRfTUVDX0NPVU5UXFx0XFx0R0VOTUFTSyg2MywgMClcXG4rXFxuKyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUxcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9ERVZfTkNPSFxcdFxcdDFcXG4rI2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0RFVl9DT0hcXHRcXHQyXFxuK1xcbisjZGVmaW5lIFJNSV9UUkFDS0lOR19SRVNFUlZFRFxcdFxcdFxcdDBcXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfTk9ORVxcdFxcdFxcdDFcXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfRklORVxcdFxcdFxcdDJcXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfQ09BUlNFXFx0XFx0XFx0M1xcbitcXG4rI2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzRLQlxcdDBcXG4rI2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzE2S0JcXHQxXFxuKyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV82NEtCXFx0MlxcbitcXG4rLypcXG4rICogTm90ZSBtYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc21hbGxlciB0aGFuIHU2NCBidXQgYWxsIGZpZWxkcyBoYXZlIHU2NFxcbisgKiBhbGlnbm1lbnQsIHNvIHVzZSB1NjQgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50LlxcbisgKi9cXG4rc3RydWN0IHJtbV9jb25maWcge1xcbitcXHR1bmlvbiB7IC8qIDB4MCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1NjQgdHJhY2tpbmdfcmVnaW9uX3NpemU7XFxuK1xcdFxcdFxcdHU2NCBybWlfZ3JhbnVsZV9zaXplO1xcbitcXHRcXHR9O1xcbitcXHRcXHR1OCBzaXplcltTWl80S107XFxuK1xcdH07XFxuK307XFxuK1xcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3Qgcm1tX2NvbmZpZykgPT0gU1pfNEspO1xcbitcXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19MUEEyXFx0XFx0QklUKDApXFxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfU1ZFXFx0XFx0QklUKDEpXFxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfUE1VXFx0XFx0QklUKDIpXFxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfREFcXHRcXHRcXHRCSVQoMylcXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19MRkFfUE9MSUNZXFx0XFx0R0VOTUFTSyg2LCA1KVxcbisjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX01FQ19QT0xJQ1lcXHRcXHRHRU5NQVNLKDgsIDcpXFxuK1xcbisjZGVmaW5lIFJNSV9IQVNIX1NIQV8yNTZcXHRcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX0hBU0hfU0hBXzUxMlxcdFxcdFxcdDFcXG4rI2RlZmluZSBSTUlfSEFTSF9TSEFfMzg0XFx0XFx0XFx0MlxcbitcXG4rc3RydWN0IHJlYWxtX3BhcmFtcyB7XFxuK1xcdHVuaW9uIHsgLyogMHgwICovXFxuK1xcdFxcdHN0cnVjdCB7XFxuK1xcdFxcdFxcdHU2NCBmbGFnczA7XFxuK1xcdFxcdFxcdHU2NCBzMnN6O1xcbitcXHRcXHRcXHR1NjQgc3ZlX3ZsO1xcbitcXHRcXHRcXHR1NjQgbnVtX2JwcztcXG4rXFx0XFx0XFx0dTY0IG51bV93cHM7XFxuK1xcdFxcdFxcdHU2NCBwbXVfbnVtX2N0cnM7XFxuK1xcdFxcdFxcdHU2NCBoYXNoX2FsZ287XFxuK1xcdFxcdFxcdHU2NCBudW1fYXV4X3BsYW5lcztcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzBbMHg0MDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4NDAwICovXFxuK1xcdFxcdHN0cnVjdCB7XFxuK1xcdFxcdFxcdHU4IHJwdls2NF07XFxuK1xcdFxcdFxcdHU2NCBhdHNfcGxhbmU7XFxuK1xcdFxcdH07XFxuK1xcdFxcdHU4IHBhZGRpbmcxWzB4NDAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDgwMCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1NjQgcGFkZGluZztcXG4rXFx0XFx0XFx0dTY0IHJ0dF9iYXNlO1xcbitcXHRcXHRcXHRzNjQgcnR0X2xldmVsX3N0YXJ0O1xcbitcXHRcXHRcXHR1NjQgcnR0X251bV9zdGFydDtcXG4rXFx0XFx0XFx0dTY0IGZsYWdzMTtcXG4rXFx0XFx0XFx0dTY0IGF1eF9ydHRfYmFzZVszXTtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzJbMHg4MDBdO1xcbitcXHR9O1xcbit9O1xcbitcXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlYWxtX3BhcmFtcykgPT0gU1pfNEspO1xcbitcXG4rLypcXG4rICogVGhlIG51bWJlciBvZiBHUFJzIChzdGFydGluZyBmcm9tIFgwKSB0aGF0IGFyZVxcbisgKiBjb25maWd1cmVkIGJ5IHRoZSBob3N0IHdoZW4gYSBSRUMgaXMgY3JlYXRlZC5cXG4rICovXFxuKyNkZWZpbmUgUkVDX0NSRUFURV9OUl9HUFJTXFx0XFx0OFxcbitcXG4rI2RlZmluZSBSRUNfUEFSQU1TX0ZMQUdfUlVOTkFCTEVcXHRCSVRfVUxMKDApXFxuK1xcbitzdHJ1Y3QgcmVjX3BhcmFtcyB7XFxuK1xcdHVuaW9uIHsgLyogMHgwICovXFxuK1xcdFxcdHU2NCBmbGFncztcXG4rXFx0XFx0dTggcGFkZGluZzBbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MTAwICovXFxuK1xcdFxcdHU2NCBtcGlkcjtcXG4rXFx0XFx0dTggcGFkZGluZzFbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MjAwICovXFxuK1xcdFxcdHU2NCBwYztcXG4rXFx0XFx0dTggcGFkZGluZzJbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MzAwICovXFxuK1xcdFxcdHU2NCBncHJzW1JFQ19DUkVBVEVfTlJfR1BSU107XFxuK1xcdFxcdHU4IHBhZGRpbmczWzB4ZDAwXTtcXG4rXFx0fTtcXG4rfTtcXG4rXFxuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfcGFyYW1zKSA9PSBTWl80Syk7XFxuK1xcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0VNVUxBVEVEX01NSU9cXHRCSVQoMClcXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19JTkpFQ1RfU0VBXFx0QklUKDEpXFxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfVFJBUF9XRklcXHRcXHRCSVQoMilcXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGRVxcdFxcdEJJVCgzKVxcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1JJUEFTX1JFU1BPTlNFXFx0QklUKDQpXFxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfUzJBUF9SRVNQT05TRVxcdEJJVCg1KVxcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0RFVl9NRU1fUkVTUE9OU0VcXHRCSVQoNilcXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19GT1JDRV9QMFxcdFxcdEJJVCg3KVxcbitcXG4rI2RlZmluZSBSRUNfUlVOX0dQUlNcXHRcXHRcXHQzMVxcbisjZGVmaW5lIFJFQ19NQVhfR0lDX05VTV9MUlNcXHRcXHQxNlxcbitcXG4rI2RlZmluZSBSTUlfUEVSTUlUVEVEX0dJQ1YzX0hDUl9CSVRTXFx0KElDSF9IQ1JfRUwyX1VJRSB8XFx0XFx0XFxcXFxcbitcXHRcXHRcXHRcXHRcXHQgSUNIX0hDUl9FTDJfTFJFTlBJRSB8XFx0XFx0XFxcXFxcbitcXHRcXHRcXHRcXHRcXHQgSUNIX0hDUl9FTDJfTlBJRSB8XFx0XFx0XFxcXFxcbitcXHRcXHRcXHRcXHRcXHQgSUNIX0hDUl9FTDJfVkdycDBFSUUgfFxcdFxcdFxcXFxcXG4rXFx0XFx0XFx0XFx0XFx0IElDSF9IQ1JfRUwyX1ZHcnAwRElFIHxcXHRcXHRcXFxcXFxuK1xcdFxcdFxcdFxcdFxcdCBJQ0hfSENSX0VMMl9WR3JwMUVJRSB8XFx0XFx0XFxcXFxcbitcXHRcXHRcXHRcXHRcXHQgSUNIX0hDUl9FTDJfVkdycDFESUUgfFxcdFxcdFxcXFxcXG4rXFx0XFx0XFx0XFx0XFx0IElDSF9IQ1JfRUwyX1RESVIpXFxuK1xcbitzdHJ1Y3QgcmVjX2VudGVyIHtcXG4rXFx0dW5pb24geyAvKiAweDAwMCAqL1xcbitcXHRcXHR1NjQgZmxhZ3M7XFxuK1xcdFxcdHU4IHBhZGRpbmcwWzB4MjAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDIwMCAqL1xcbitcXHRcXHR1NjQgZ3Byc1tSRUNfUlVOX0dQUlNdO1xcbitcXHRcXHR1OCBwYWRkaW5nMVsweDEwMF07XFxuK1xcdH07XFxuK1xcdHU4IHBhZGRpbmczWzB4NTAwXTtcXG4rfTtcXG4rXFxuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfZW50ZXIpID09IFNaXzJLKTtcXG4rXFxuKyNkZWZpbmUgUk1JX0VYSVRfU1lOQ1xcdFxcdFxcdDB4MDBcXG4rI2RlZmluZSBSTUlfRVhJVF9JUlFcXHRcXHRcXHQweDAxXFxuKyNkZWZpbmUgUk1JX0VYSVRfRklRXFx0XFx0XFx0MHgwMlxcbisjZGVmaW5lIFJNSV9FWElUX1BTQ0lcXHRcXHRcXHQweDAzXFxuKyNkZWZpbmUgUk1JX0VYSVRfUklQQVNfQ0hBTkdFXFx0XFx0MHgwNFxcbisjZGVmaW5lIFJNSV9FWElUX0hPU1RfQ0FMTFxcdFxcdDB4MDVcXG4rI2RlZmluZSBSTUlfRVhJVF9TRVJST1JcXHRcXHRcXHQweDA2XFxuKyNkZWZpbmUgUk1JX0VYSVRfUzJBUF9DSEFOR0VcXHRcXHQweDA3XFxuKyNkZWZpbmUgUk1JX0VYSVRfVkRFVl9WQUxJREFURV9NQVBQSU5HXFx0MHgwOFxcbisjZGVmaW5lIFJNSV9FWElUX1ZTTU1VX0NPTU1BTkRcXHRcXHQweDBhXFxuKyNkZWZpbmUgUk1JX0VYSVRfVkRFVl9QMlBfQklORElOR1xcdDB4MGJcXG4rXFxuK3N0cnVjdCByZWNfZXhpdCB7XFxuK1xcdHVuaW9uIHsgLyogMHgwMDAgKi9cXG4rXFx0XFx0dTggZXhpdF9yZWFzb247XFxuK1xcdFxcdHU4IHBhZGRpbmcwWzB4MTAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDEwMCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1NjQgZXNyO1xcbitcXHRcXHRcXHR1NjQgZmFyO1xcbitcXHRcXHRcXHR1NjQgaHBmYXI7XFxuK1xcdFxcdFxcdHU2NCBydHRfdHJlZTtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzFbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MjAwICovXFxuK1xcdFxcdHU2NCBncHJzW1JFQ19SVU5fR1BSU107XFxuK1xcdFxcdHU4IHBhZGRpbmcyWzB4MTAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDMwMCAqL1xcbitcXHRcXHR1OCBwYWRkaW5nM1sweDEwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHg0MDAgKi9cXG4rXFx0XFx0c3RydWN0IHtcXG4rXFx0XFx0XFx0dTY0IGNudHBfY3RsO1xcbitcXHRcXHRcXHR1NjQgY250cF9jdmFsO1xcbitcXHRcXHRcXHR1NjQgY250dl9jdGw7XFxuK1xcdFxcdFxcdHU2NCBjbnR2X2N2YWw7XFxuK1xcdFxcdH07XFxuK1xcdFxcdHU4IHBhZGRpbmc0WzB4MTAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDUwMCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1NjQgcmlwYXNfYmFzZTtcXG4rXFx0XFx0XFx0dTY0IHJpcGFzX3RvcDtcXG4rXFx0XFx0XFx0dTggcmlwYXNfdmFsdWU7XFxuK1xcdFxcdFxcdHU4IHBhZGRpbmc4WzE1XTtcXG4rXFx0XFx0XFx0dTY0IHMyYXBfYmFzZTtcXG4rXFx0XFx0XFx0dTY0IHMyYXBfdG9wO1xcbitcXHRcXHRcXHR1NjQgdmRldl9pZF8xO1xcbitcXHRcXHRcXHR1NjQgdmRldl9pZF8yO1xcbitcXHRcXHRcXHR1NjQgZGV2X21lbV9iYXNlO1xcbitcXHRcXHRcXHR1NjQgZGV2X21lbV90b3A7XFxuK1xcdFxcdFxcdHU2NCBkZXZfbWVtX3BhO1xcbitcXHRcXHR9O1xcbitcXHRcXHR1OCBwYWRkaW5nNVsweDEwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHg2MDAgKi9cXG4rXFx0XFx0c3RydWN0IHtcXG4rXFx0XFx0XFx0dTE2IGltbTtcXG4rXFx0XFx0XFx0dTE2IHBhZGRpbmc5O1xcbitcXHRcXHRcXHR1NjQgcGxhbmU7XFxuK1xcdFxcdH07XFxuK1xcdFxcdHU4IHBhZGRpbmc2WzB4MTAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDcwMCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1OCBwbXVfb3ZmX3N0YXR1cztcXG4rXFx0XFx0XFx0dTggcGFkZGluZzEwWzE1XTtcXG4rXFx0XFx0XFx0dTY0IHZzbW11O1xcbitcXHRcXHR9O1xcbitcXHRcXHR1OCBwYWRkaW5nN1sweDEwMF07XFxuK1xcdH07XFxuK307XFxuK1xcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2V4aXQpID09IFNaXzJLKTtcXG4rXFxuK3N0cnVjdCByZWNfcnVuIHtcXG4rXFx0c3RydWN0IHJlY19lbnRlciBlbnRlcjtcXG4rXFx0c3RydWN0IHJlY19leGl0IGV4aXQ7XFxuK307XFxuK1xcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3J1bikgPT0gU1pfNEspO1xcbitcXG4rLyogUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTIGRlZmluaXRpb25zICovXFxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX09BRERSX1RZUEVcXHRHRU5NQVNLKDEsIDApXFxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX0xJU1RfQ09VTlRcXHRHRU5NQVNLKDE1LCAyKVxcbisjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19NRU1BVFRSXFx0R0VOTUFTSygxOCwgMTYpXFxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX1MyQVBcXHRcXHRHRU5NQVNLKDIyLCAxOSlcXG4rXFxuKy8qIFJNSV9SVFRfREFUQV9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi9cXG4rI2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX09BRERSX1RZUEVcXHRHRU5NQVNLKDEsIDApXFxuKyNkZWZpbmUgUk1JX1JUVF9QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UXFx0R0VOTUFTSygxNSwgMilcXG4rXFxuKy8qIFMyQVAgRGlyZWN0IEVuY29kaW5ncywgdXNlZCBpbiBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfUzJBUCAqL1xcbisjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9XUklURVxcdFxcdFxcdEJJVCgwKVxcbisjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9SRUFEXFx0XFx0XFx0QklUKDEpXFxuK1xcbisjZW5kaWYgLyogX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDIxOjI5OjU1LjQwODI4MjUwNVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTU4Mzk1Mjc4ODUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgaG9zdC1zaWRlIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIGxpYnJhcnkgZnVuY3Rpb25zIGFuZCBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gZm9yIEtWTSB0byB1c2UuIEhvd2V2ZXIsIEtWTSBzdXBwb3J0IGZvciBSZWFsbXMgaXMgbm90IGluY2x1ZGVkIGluIHRoaXMgcGF0Y2gsIG1ha2luZyB0aGUgZXhwb3J0ZWQgbGlicmFyeSBmdW5jdGlvbnMgdW5yZWFjaGFibGUgZnJvbSB1c2VyLXNwYWNlLiBGdXJ0aGVybW9yZSwgdGhlIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiByZXF1aXJlcyBzcGVjaWZpYyBoYXJkd2FyZS9maXJtd2FyZSAoUk1NKSBzdXBwb3J0IHRoYXQgaXMgbm90IHByZXNlbnQgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLCBhbmQgaXQgd2lsbCBzaW1wbHkgYmFpbCBvdXQgZWFybHkuIFRoZXJlIGFyZSBubyBzeXNjYWxscywgaW9jdGxzLCBvciBvdGhlciB1c2VyLXNwYWNlIGludGVyZmFjZXMgaW50cm9kdWNlZCB0aGF0IHN5emthbGxlciBjb3VsZCBmdXp6LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdFxuICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LFxuICAgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA5Y2EzNDc0NDVjNmNhY2M5YmEwYzgwODExNmZiY2Q4ZGMwNzkwMTE5XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFdlZCBKdWwgMTUgMjE6Mjk6NTIgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L0tjb25maWcgYi9hcmNoL2FybTY0L0tjb25maWdcbmluZGV4IGIzYWZlMDY4ODkxOWJkLi4wZjE5NTZlZGYxMzA3YiAxMDA2NDRcbi0tLSBhL2FyY2gvYXJtNjQvS2NvbmZpZ1xuKysrIGIvYXJjaC9hcm02NC9LY29uZmlnXG5AQCAtMzgsNiArMzgsNyBAQCBjb25maWcgQVJNNjRcbiBcdHNlbGVjdCBBUkNIX0hBU19NRU1CQVJSSUVSX1NZTkNfQ09SRVxuIFx0c2VsZWN0IEFSQ0hfSEFTX01FTV9FTkNSWVBUXG4gXHRzZWxlY3QgQVJDSF9TVVBQT1JUU19NU0VBTF9TWVNURU1fTUFQUElOR1NcbitcdHNlbGVjdCBBUkNIX1NVUFBPUlRTX1JNTVxuIFx0c2VsZWN0IEFSQ0hfSEFTX05NSV9TQUZFX1RISVNfQ1BVX09QU1xuIFx0c2VsZWN0IEFSQ0hfSEFTX05PTl9PVkVSTEFQUElOR19BRERSRVNTX1NQQUNFXG4gXHRzZWxlY3QgQVJDSF9IQVNfTk9OTEVBRl9QTURfWU9VTkcgaWYgQVJNNjRfSEFGVFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5mMTNlY2RiNDBkZWQ0MVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oXG5AQCAtMCwwICsxLDQ1OSBAQFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4rLypcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLlxuKyAqL1xuK1xuKyNpZm5kZWYgX19BU01fUk1JX0NNRFNfSFxuKyNkZWZpbmUgX19BU01fUk1JX0NNRFNfSFxuK1xuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2FybS1ybWktY21kcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYXJtLXNtY2NjLXJtaS5oXHUwMDNlXG4rXG4rLyoqXG4rICogcm1pX3J0dF9kYXRhX21hcF9pbml0KCkgLSBDcmVhdGUgYSBwcm90ZWN0ZWQgbWFwcGluZyB3aXRoIGRhdGEgY29udGVudHNcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBkYXRhOiBQQSBvZiB0aGUgdGFyZ2V0IGdyYW51bGVcbisgKiBAaXBhOiBJUEEgYXQgd2hpY2ggdGhlIGdyYW51bGUgd2lsbCBiZSBtYXBwZWQgaW4gdGhlIGd1ZXN0XG4rICogQHNyYzogUEEgb2YgdGhlIHNvdXJjZSBncmFudWxlXG4rICogQGZsYWdzOiBSTUlfTUVBU1VSRV9DT05URU5UIGlmIHRoZSBjb250ZW50cyBzaG91bGQgYmUgbWVhc3VyZWRcbisgKlxuKyAqIENyZWF0ZSBhIG1hcHBpbmcgZnJvbSBQcm90ZWN0ZWQgSVBBIHNwYWNlIHRvIGNvbnZlbnRpb25hbCBtZW1vcnksIGNvcHlpbmdcbisgKiBjb250ZW50cyBmcm9tIGEgTm9uLXNlY3VyZSBHcmFudWxlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIuXG4rICpcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGF0YV9tYXBfaW5pdCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGRhdGEsXG4rXHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgaXBhLCB1bnNpZ25lZCBsb25nIHNyYyxcbitcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBmbGFncylcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVQsIHJkLCBkYXRhLCBpcGEsIHNyYywgZmxhZ3NcbitcdH07XG4rXG4rXHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK31cbitcbisvKipcbisgKiBybWlfcnR0X2RhdGFfbWFwKCkgLSBDcmVhdGUgbWFwcGluZ3MgaW4gcHJvdGVjdGVkIElQQSB3aXRoIHVua25vd24gY29udGVudHNcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQGZsYWdzOiBGbGFnc1xuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbisgKiBAb3V0X3RvcDogVG9wIGFkZHJlc3Mgb2YgcmFuZ2Ugd2hpY2ggd2FzIHByb2Nlc3NlZC5cbisgKlxuKyAqIFJldHVybiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2RhdGFfbWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIHRvcCxcbitcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuK1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0RBVEFfTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcbitcdH07XG4rXHRpbnQgcmV0O1xuK1xuK1x0cmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKG91dF90b3ApXG4rXHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfZGF0YV91bm1hcCgpIC0gUmVtb3ZlIG1hcHBpbmdzIHRvIGNvbnZlbnRpb25hbCBtZW1vcnlcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCBSZWFsbVxuKyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQGZsYWdzOiBGbGFnc1xuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbisgKiBAb3V0X3RvcDogUmV0dXJucyB0b3AgSVBBIG9mIHJhbmdlIHdoaWNoIGhhcyBiZWVuIHVubWFwcGVkXG4rICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2VcbisgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XG4rICpcbisgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIGNvbnZlbnRpb24gbWVtb3J5IHdpdGggYSB0YXJnZXQgUHJvdGVjdGVkIElQQSByYW5nZS5cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9kYXRhX3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSxcbitcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgb2FkZHIsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3AsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9yYW5nZSxcbitcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyAqb3V0X2NvdW50KVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SVFRfREFUQV9VTk1BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4rXHR9O1xuK1x0aW50IHJldDtcbitcbitcdHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChvdXRfdG9wKVxuK1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4rXHRpZiAob3V0X3JhbmdlKVxuK1x0XHQqb3V0X3JhbmdlID0gcmVncy5hMjtcbitcdGlmIChvdXRfY291bnQpXG4rXHRcdCpvdXRfY291bnQgPSByZWdzLmEzO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3BzY2lfY29tcGxldGUoKSAtIENvbXBsZXRlIHBlbmRpbmcgUFNDSSBjb21tYW5kXG4rICogQGNhbGxpbmdfcmVjOiBQQSBvZiB0aGUgY2FsbGluZyBSRUNcbisgKiBAc3RhdHVzOiBTdGF0dXMgb2YgdGhlIFBTQ0kgcmVxdWVzdFxuKyAqXG4rICogQ29tcGxldGVzIGEgcGVuZGluZyBQU0NJIGNvbW1hbmQuXG4rICpcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9wc2NpX2NvbXBsZXRlKHVuc2lnbmVkIGxvbmcgY2FsbGluZ19yZWMsXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBzdGF0dXMpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xuK1xuK1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9QU0NJX0NPTVBMRVRFLCBjYWxsaW5nX3JlYywgc3RhdHVzLCBcdTAwMjZyZXMpO1xuK1xuK1x0cmV0dXJuIHJlcy5hMDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3JlYWxtX2FjdGl2YXRlKCkgLSBBY3RpdmUgYSByZWFsbVxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICpcbisgKiBNYXJrIGEgcmVhbG0gYXMgQWN0aXZlIHNpZ25hbGxpbmcgdGhhdCBjcmVhdGlvbiBpcyBjb21wbGV0ZSBhbmQgYWxsb3dpbmdcbisgKiBleGVjdXRpb24gb2YgdGhlIHJlYWxtLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfcmVhbG1fYWN0aXZhdGUodW5zaWduZWQgbG9uZyByZClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XG4rXG4rXHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1JFQUxNX0FDVElWQVRFLCByZCwgXHUwMDI2cmVzKTtcbitcbitcdHJldHVybiByZXMuYTA7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9yZWFsbV9jcmVhdGUoKSAtIENyZWF0ZSBhIHJlYWxtXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAcGFyYW1zOiBQQSBvZiByZWFsbSBwYXJhbWV0ZXJzXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbisgKlxuKyAqIENyZWF0ZSBhIG5ldyByZWFsbSB1c2luZyB0aGUgZ2l2ZW4gcGFyYW1ldGVycy5cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHBhcmFtcyxcbitcdFx0XHRcdCAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4re1xuK1x0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLFxuK1x0XHRcdFx0ICAgU01DX1JNSV9SRUFMTV9DUkVBVEUsIHJkLCBwYXJhbXMpO1xuK31cbitcbisvKipcbisgKiBybWlfcmVhbG1fdGVybWluYXRlKCkgLSBUZXJtaW5hdGUgYSByZWFsbVxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbisgKlxuKyAqIFRlcm1pbmF0ZXMgYSByZWFsbSwgbW92aW5nIGl0IGludG8gYSBaT01CSUUgc3RhdGVcbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX3Rlcm1pbmF0ZSh1bnNpZ25lZCBsb25nIHJkLFxuK1x0XHRcdFx0ICAgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbit7XG4rXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXG4rXHRcdFx0XHQgICBTTUNfUk1JX1JFQUxNX1RFUk1JTkFURSwgcmQpO1xuK31cbitcbisvKipcbisgKiBybWlfcmVhbG1fZGVzdHJveSgpIC0gRGVzdHJveSBhIHJlYWxtXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuKyAqXG4rICogRGVzdHJveXMgYSByZWFsbSwgYWxsIG9iamVjdHMgYmVsb25naW5nIHRvIHRoZSByZWFsbSBtdXN0IGJlIGRlc3Ryb3llZCBmaXJzdC5cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX2Rlc3Ryb3kodW5zaWduZWQgbG9uZyByZCxcbitcdFx0XHRcdCAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuK3tcbitcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdCAgIFNNQ19STUlfUkVBTE1fREVTVFJPWSwgcmQpO1xuK31cbitcbisvKipcbisgKiBybWlfcmVjX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgUkVDXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQ1xuKyAqIEBwYXJhbXM6IFBBIG9mIFJFQyBwYXJhbWV0ZXJzXG4rICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbisgKlxuKyAqIENyZWF0ZSBhIFJFQyB1c2luZyB0aGUgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdCByZWNfcGFyYW1zIHBvaW50ZWRcbisgKiB0byBieSBAcGFyYW1zLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfcmVjX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLFxuK1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgcmVjLFxuK1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgcGFyYW1zLFxuK1x0XHRcdFx0IHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4re1xuK1x0aW50IHJldDtcbitcbitcdCpzcm8gPSAoc3RydWN0IHJtaV9zcm9fc3RhdGUpey5yZWdzID0ge1xuK1x0XHRTTUNfUk1JX1JFQ19DUkVBVEUsIHJkLCByZWMsIHBhcmFtc1xuK1x0fX07XG4rXHRyZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzcm8sIEdGUF9LRVJORUwpO1xuK1x0cm1pX3Nyb19mcmVlKHNybyk7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfcmVjX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSBSRUNcbisgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQ1xuKyAqIEBzcm86IEFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXG4rICpcbisgKiBEZXN0cm95cyBhIFJFQy4gVGhlIFJFQyBtdXN0IG5vdCBiZSBydW5uaW5nLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfcmVjX2Rlc3Ryb3kodW5zaWduZWQgbG9uZyByZWMsXG4rXHRcdFx0XHQgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4re1xuK1x0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JFQ19ERVNUUk9ZLCByZWMpO1xuK31cbitcbisvKipcbisgKiBybWlfcmVjX2VudGVyKCkgLSBFbnRlciBhIFJFQ1xuKyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXG4rICogQHJ1bl9wdHI6IFBBIG9mIFJlY1J1biBzdHJ1Y3R1cmVcbisgKlxuKyAqIFN0YXJ0cyAob3IgY29udGludWVzKSBleGVjdXRpb24gd2l0aGluIGEgUkVDLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfcmVjX2VudGVyKHVuc2lnbmVkIGxvbmcgcmVjLCB1bnNpZ25lZCBsb25nIHJ1bl9wdHIpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xuK1xuK1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9SRUNfRU5URVIsIHJlYywgcnVuX3B0ciwgXHUwMDI2cmVzKTtcbitcbitcdHJldHVybiByZXMuYTA7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfY3JlYXRlKCkgLSBDcmVhdGVzIGFuIFJUVFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQHJ0dDogUEEgb2YgdGhlIHRhcmdldCBSVFRcbisgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcbisgKiBAbGV2ZWw6IERlcHRoIG9mIHRoZSBSVFQgd2l0aGluIHRoZSB0cmVlXG4rICpcbisgKiBDcmVhdGVzIGFuIFJUVCAoUmVhbG0gVHJhbnNsYXRpb24gVGFibGUpIGF0IHRoZSBzcGVjaWZpZWQgbGV2ZWwgZm9yIHRoZVxuKyAqIHRyYW5zbGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyB3aXRoaW4gdGhlIHJlYWxtLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJ0dCxcbitcdFx0XHRcdCB1bnNpZ25lZCBsb25nIGlwYSwgbG9uZyBsZXZlbClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0NSRUFURSwgcmQsIHJ0dCwgaXBhLCBsZXZlbFxuK1x0fTtcbitcbitcdHJldHVybiBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfZGVzdHJveSgpIC0gRGVzdHJveSBhbiBSVFRcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCByZWFsbVxuKyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVFxuKyAqIEBsZXZlbDogUlRUIGxldmVsXG4rICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZFxuKyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRoZSB0b3AgSVBBIG9mIG5vbi1saXZlIFJUVCBlbnRyaWVzLCBmcm9tIGVudHJ5XG4rICogYXQgd2hpY2ggdGhlIFJUVCB3YWxrIHRlcm1pbmF0ZWQuXG4rICpcbisgKiBEZXN0cm95cyBhbiBSVFQuIFRoZSBSVFQgbXVzdCBiZSBub24tbGl2ZSwgaS5lLiBub25lIG9mIHRoZSBlbnRyaWVzIGluIHRoZVxuKyAqIHRhYmxlIGFyZSBpbiBBU1NJR05FRCBvciBUQUJMRSBzdGF0ZS5cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlLlxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLFxuK1x0XHRcdFx0ICB1bnNpZ25lZCBsb25nIGlwYSxcbitcdFx0XHRcdCAgbG9uZyBsZXZlbCxcbitcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyAqb3V0X3J0dCxcbitcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0RFU1RST1ksIHJkLCBpcGEsIGxldmVsXG4rXHR9O1xuK1x0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChvdXRfcnR0KVxuK1x0XHQqb3V0X3J0dCA9IHJlZ3MuYTE7XG4rXHRpZiAob3V0X3RvcClcbitcdFx0Km91dF90b3AgPSByZWdzLmEyO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3J0dF9mb2xkKCkgLSBGb2xkIGFuIFJUVFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUXG4rICogQGxldmVsOiBEZXB0aCBvZiB0aGUgUlRUIHdpdGhpbiB0aGUgdHJlZVxuKyAqIEBvdXRfcnR0OiBQb2ludGVyIHRvIHdyaXRlIHRoZSBQQSBvZiB0aGUgUlRUIHdoaWNoIHdhcyBkZXN0cm95ZWRcbisgKlxuKyAqIEZvbGRzIGFuIFJUVC4gSWYgYWxsIGVudHJpZXMgd2l0aCB0aGUgUlRUIGFyZSAnaG9tb2dlbmVvdXMnIHRoZSBSVFQgY2FuIGJlXG4rICogZm9sZGVkIGludG8gdGhlIHBhcmVudCBhbmQgdGhlIFJUVCBkZXN0cm95ZWQuXG4rICpcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZm9sZCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGlwYSxcbitcdFx0XHQgICAgICAgbG9uZyBsZXZlbCwgdW5zaWduZWQgbG9uZyAqb3V0X3J0dClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0ZPTEQsIHJkLCBpcGEsIGxldmVsXG4rXHR9O1xuK1x0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChvdXRfcnR0KVxuK1x0XHQqb3V0X3J0dCA9IHJlZ3MuYTE7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfcnR0X2luaXRfcmlwYXMoKSAtIFNldCBSSVBBUyBmb3IgbmV3IHJlYWxtXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAYmFzZTogQmFzZSBvZiB0YXJnZXQgSVBBIHJlZ2lvblxuKyAqIEB0b3A6IFRvcCBvZiB0YXJnZXQgSVBBIHJlZ2lvblxuKyAqIEBvdXRfdG9wOiBUb3AgSVBBIG9mIHJhbmdlIHdob3NlIFJJUEFTIHdhcyBtb2RpZmllZFxuKyAqXG4rICogU2V0cyB0aGUgUklQQVMgb2YgYSB0YXJnZXQgSVBBIHJhbmdlIHRvIFJBTSwgZm9yIGEgcmVhbG0gaW4gdGhlIE5FVyBzdGF0ZS5cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9pbml0X3JpcGFzKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgYmFzZSxcbitcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyB0b3AsIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX1JUVF9JTklUX1JJUEFTLCByZCwgYmFzZSwgdG9wXG4rXHR9O1xuK1x0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChvdXRfdG9wKVxuK1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfcnR0X3VucHJvdF9tYXAoKSAtIE1hcCB1bnByb3RlY3RlZCBncmFudWxlcyBpbnRvIGEgcmVhbG1cbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBiYXNlOiBCYXNlIElQQSBvZiB0aGUgbWFwcGluZ1xuKyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuKyAqIEBmbGFnczogRmxhZ3NcbisgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXG4rICogQG91dF90b3A6IFRvcCBJUEEgb2YgcmFuZ2Ugd2hpY2ggaGFzIGJlZW4gbWFwcGVkXG4rICpcbisgKiBDcmVhdGUgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuXG4rICpcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfdW5wcm90X21hcCh1bnNpZ25lZCBsb25nIHJkLFxuK1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuK1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLFxuK1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuK1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SVFRfVU5QUk9UX01BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4rXHR9O1xuK1x0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChvdXRfdG9wKVxuK1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfcnR0X3NldF9yaXBhcygpIC0gU2V0IFJJUEFTIGZvciBhbiBydW5uaW5nIHJlYWxtXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAcmVjOiBQQSBvZiB0aGUgUkVDIG1ha2luZyB0aGUgcmVxdWVzdFxuKyAqIEBiYXNlOiBCYXNlIG9mIHRhcmdldCBJUEEgcmVnaW9uXG4rICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uXG4rICogQG91dF90b3A6IFBvaW50ZXIgdG8gd3JpdGUgdG9wIElQQSBvZiByYW5nZSB3aG9zZSBSSVBBUyB3YXMgbW9kaWZpZWRcbisgKlxuKyAqIENvbXBsZXRlcyBhIHJlcXVlc3QgbWFkZSBieSB0aGUgcmVhbG0gdG8gY2hhbmdlIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEFcbisgKiByYW5nZS5cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9zZXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyByZWMsXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHRvcCxcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SVFRfU0VUX1JJUEFTLCByZCwgcmVjLCBiYXNlLCB0b3BcbitcdH07XG4rXHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKG91dF90b3ApXG4rXHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfdW5wcm90X3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3Mgd2l0aGluIGFuIHVucHJvdGVjdGVkIElQQSByYW5nZVxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQGJhc2U6IEJhc2UgSVBBIG9mIHRoZSBtYXBwaW5nXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQGZsYWdzOiBGbGFnc1xuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbisgKiBAb3V0X3RvcDogVG9wIElQQSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxuKyAqIEBvdXRfcmFuZ2U6IE91dHB1dCBhZGRyZXNzIHJhbmdlXG4rICogQG91dF9jb3VudDogTnVtYmVyIG9mIGVudHJpZXMgaW4gb3V0cHV0IGFkZHJlc3MgbGlzdFxuKyAqXG4rICogUmVtb3ZlcyBtYXBwaW5ncyB0byBtZW1vcnkgd2l0aGluIGEgdGFyZ2V0IHVucHJvdGVjdGVkIElQQSByYW5nZS5cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF91bnByb3RfdW5tYXAodW5zaWduZWQgbG9uZyByZCxcbitcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4rXHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcbitcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuK1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3AsXG4rXHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3JhbmdlLFxuK1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9jb3VudClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX1VOUFJPVF9VTk1BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4rXHR9O1xuK1x0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChvdXRfdG9wKVxuK1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4rXHRpZiAob3V0X3JhbmdlKVxuK1x0XHQqb3V0X3JhbmdlID0gcmVncy5hMjtcbitcdGlmIChvdXRfY291bnQpXG4rXHRcdCpvdXRfY291bnQgPSByZWdzLmEzO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rI2VuZGlmIC8qIF9fQVNNX1JNSV9DTURTX0ggKi9cbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNcbmluZGV4IDlhMjJkZjBjNTEyMGYzLi40YWU2M2M4OWNkYTk3ZCAxMDA2NDRcbi0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY1xuKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jXG5AQCAtMjkzLDYgKzI5Myw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRpc2FyM1tdID0ge1xuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRwZnIwW10gPSB7XG4gXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0NTVjNfU0hJRlQsIDQsIDApLFxuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9DU1YyX1NISUZULCA0LCAwKSxcbitcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfUk1FX1NISUZULCA0LCAwKSxcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9WSVNJQkxFLCBGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0RJVF9TSElGVCwgNCwgMCksXG4gXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0FNVV9TSElGVCwgNCwgMCksXG4gXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX01QQU1fU0hJRlQsIDQsIDApLFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ1xuaW5kZXggMTJkYzcwMjU0ODQyY2UuLjU1NTQyODc5ZmJiOGFiIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWdcbkBAIC0zMDEsNSArMzAxLDYgQEAgc291cmNlIFwiZHJpdmVycy9maXJtd2FyZS9zYW1zdW5nL0tjb25maWdcIlxuIHNvdXJjZSBcImRyaXZlcnMvZmlybXdhcmUvc21jY2MvS2NvbmZpZ1wiXG4gc291cmNlIFwiZHJpdmVycy9maXJtd2FyZS90ZWdyYS9LY29uZmlnXCJcbiBzb3VyY2UgXCJkcml2ZXJzL2Zpcm13YXJlL3hpbGlueC9LY29uZmlnXCJcbitzb3VyY2UgXCJkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1wiXG4gXG4gZW5kbWVudVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXG5pbmRleCA0ZGRlYzI4MjBjOTZmYS4uMDdlOGNhMTc4OWI0OWUgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXG5AQCAtMzgsMyArMzgsNCBAQCBvYmoteVx0XHRcdFx0Kz0gc2Ftc3VuZy9cbiBvYmoteVx0XHRcdFx0Kz0gc21jY2MvXG4gb2JqLXlcdFx0XHRcdCs9IHRlZ3JhL1xuIG9iai15XHRcdFx0XHQrPSB4aWxpbngvXG4rb2JqLXlcdFx0XHRcdCs9IGFybV9ybW0vXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWcgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5kMjI0YTcyY2NhOTA4OVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWdcbkBAIC0wLDAgKzEsMjIgQEBcbitcbitjb25maWcgQVJDSF9TVVBQT1JUU19STU1cbitcdGJvb2xcbitcbitjb25maWcgQVJNX1JNTVxuK1x0Ym9vbCBcIlJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvciAoUk1NKSBTdXBwb3J0XCJcbitcdGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19STU1cbitcdGRlZmF1bHQgeVxuK1x0aGVscFxuK1x0ICBTdXBwb3J0IHRoZSBSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3IgKFJNTSkgb24gQXJtIHN5c3RlbXMgdGhhdFxuK1x0ICBpbXBsZW1lbnQgdGhlIFJlYWxtIE1hbmFnZW1lbnQgRXh0ZW5zaW9uIChSTUUpLCBhcyBkZWZpbmVkIGJ5IHRoZVxuK1x0ICBBcm0gQ29uZmlkZW50aWFsIENvbXB1dGUgQXJjaGl0ZWN0dXJlLlxuK1xuK1x0ICBUaGUgUk1NIHJ1bnMgaW4gdGhlIFJlYWxtIHdvcmxkIGFuZCBwcm92aWRlcyB0aGUgUmVhbG0gTWFuYWdlbWVudFxuK1x0ICBJbnRlcmZhY2UgKFJNSSkgdXNlZCBieSBhIE5vcm1hbCBXb3JsZCBob3N0IHRvIGNyZWF0ZSwgbWFuYWdlIGFuZCBydW5cbitcdCAgcHJvdGVjdGVkIHZpcnR1YWwgbWFjaGluZXMgY2FsbGVkIFJlYWxtcy4gVGhpcyBvcHRpb24gYnVpbGRzIHRoZVxuK1x0ICBob3N0LXNpZGUgUk1JIHN1cHBvcnQgdXNlZCBieSBLVk0gdG8gZGV0ZWN0IGEgY29tcGF0aWJsZSBSTU0sXG4rXHQgIGNvbmZpZ3VyZSBpdCwgbWFuYWdlIGRlbGVnYXRlZCBtZW1vcnkgYW5kIGVuYWJsZSBSZWFsbSBndWVzdHMuXG4rXG4rXHQgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiBkb2VzIG5vdCBieSBpdHNlbGYgbWFrZSBSZWFsbSBndWVzdHMgYXZhaWxhYmxlOlxuK1x0ICB0aGUgc3lzdGVtIG11c3QgYWxzbyBwcm92aWRlIFJNRS1jYXBhYmxlIGhhcmR3YXJlIGFuZCBmaXJtd2FyZSB3aXRoIGFcbitcdCAgY29tcGF0aWJsZSBSTU0gaW1wbGVtZW50YXRpb24uXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjUxYWVmNWNjMDRiMDJjXG4tLS0gL2Rldi9udWxsXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcbkBAIC0wLDAgKzEsMiBAQFxuK1xuK29iai0kKENPTkZJR19BUk1fUk1NKVx0PSBybWkub1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5kMGMwODNiZGYyNTFmNFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jXG5AQCAtMCwwICsxLDcyNCBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLlxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NwdWZlYXR1cmUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbWJsb2NrLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9hcm0tcm1pLWNtZHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3Byb2Nlc3Nvci5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXHUwMDNjYXNtL21lbW9yeS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYXNtL3BndGFibGUtaHdkZWYuaFx1MDAzZVxuK1xuK3N0YXRpYyBib29sIGFybTY0X3JtaV9pc19hdmFpbGFibGU7XG4rXG4rLyogQ3VycmVudGx5IG9ubHkgdGhlIGZpcnN0IDIgcmVnaXN0ZXJzIGFyZSB1c2VkIGJ5IExpbnV4ICovXG4rI2RlZmluZSBSTUlfRkVBVF9SRUdfQ09VTlRcdDJcbitzdGF0aWMgX19yb19hZnRlcl9pbml0IHVuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnX2NhY2hlW1JNSV9GRUFUX1JFR19DT1VOVF07XG4rXG4rdW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWcodW5zaWduZWQgbG9uZyBpZClcbit7XG4rXHRpZiAoV0FSTl9PTihpZCBcdTAwM2U9IFJNSV9GRUFUX1JFR19DT1VOVCkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuIHJtaV9mZWF0X3JlZ19jYWNoZVtpZF07XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9mZWF0X3JlZyk7XG4rXG4raW50IHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLFxuK1x0XHQgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLFxuK1x0XHQgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgcmV0ID0gMDtcbitcdHVuc2lnbmVkIGxvbmcgdG9wID0gcGh5cyArIHNpemU7XG4rXHR1bnNpZ25lZCBsb25nIG91dF90b3A7XG4rXG4rXHR3aGlsZSAocGh5cyBcdTAwM2MgdG9wKSB7XG4rXHRcdHJldCA9IHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKHBoeXMsIHRvcCwgXHUwMDI2b3V0X3RvcCk7XG4rXHRcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpXG4rXHRcdFx0cGh5cyA9IG91dF90b3A7XG4rXHRcdGVsc2UgaWYgKHJldCA9PSBSTUlfQlVTWSB8fCByZXQgPT0gUk1JX0JMT0NLRUQpXG4rXHRcdFx0Y3B1X3JlbGF4KCk7XG4rXHRcdGVsc2VcbitcdFx0XHRicmVhaztcbitcdH1cbitcbitcdGlmIChvdXRfcGh5cylcbitcdFx0Km91dF9waHlzID0gcGh5cztcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9kZWxlZ2F0ZV9yYW5nZSk7XG4rXG4raW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsXG4rXHRcdFx0IHVuc2lnbmVkIGxvbmcgc2l6ZSlcbit7XG4rXHR1bnNpZ25lZCBsb25nIHJldCA9IDA7XG4rXHR1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgKyBzaXplO1xuK1x0dW5zaWduZWQgbG9uZyBvdXRfdG9wO1xuK1xuK1x0d2hpbGUgKHBoeXMgXHUwMDNjIHRvcCkge1xuK1x0XHRyZXQgPSBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHBoeXMsIHRvcCwgXHUwMDI2b3V0X3RvcCk7XG4rXHRcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpXG4rXHRcdFx0cGh5cyA9IG91dF90b3A7XG4rXHRcdGVsc2UgaWYgKHJldCA9PSBSTUlfQlVTWSB8fCByZXQgPT0gUk1JX0JMT0NLRUQpXG4rXHRcdFx0Y3B1X3JlbGF4KCk7XG4rXHRcdGVsc2VcbitcdFx0XHRicmVhaztcbitcdH1cbitcbitcdHJldHVybiByZXQ7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV91bmRlbGVnYXRlX3JhbmdlKTtcbitcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBkb25hdGVfcmVxX3RvX3NpemUodW5zaWduZWQgbG9uZyBkb25hdGVyZXEpXG4re1xuK1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTtcbitcbitcdHJldHVybiBCSVQoQVJNNjRfSFdfUEdUQUJMRV9MRVZFTF9TSElGVCgzIC0gdW5pdF9zaXplKSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJtaV9zbWNjY19pbnZva2Uoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVnc19pbixcbitcdFx0XHQgICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3Nfb3V0KVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9ICpyZWdzX2luO1xuK1x0dW5zaWduZWQgbG9uZyBzdGF0dXM7XG4rXG4rXHR3aGlsZSAoMSkge1xuK1x0XHRhcm1fc21jY2NfMV8yX2ludm9rZShcdTAwMjZyZWdzLCByZWdzX291dCk7XG4rXHRcdHN0YXR1cyA9IFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3Nfb3V0LVx1MDAzZWEwKTtcbitcdFx0aWYgKHN0YXR1cyAhPSBSTUlfQlVTWSBcdTAwMjZcdTAwMjYgc3RhdHVzICE9IFJNSV9CTE9DS0VEKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHRjcHVfcmVsYXgoKTtcbitcdH1cbit9XG4rXG4rc3RhdGljIHZvaWQgcm1pX29wX2NvbnRpbnVlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBmbGFncyxcbitcdFx0XHQgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX09QX0NPTlRJTlVFLCBzcm9faGFuZGxlLCBmbGFnc1xuK1x0fTtcbitcbitcdHJtaV9zbWNjY19pbnZva2UoXHUwMDI2cmVncywgb3V0X3JlZ3MpO1xuK31cbitcbitzdGF0aWMgdm9pZCBybWlfb3BfY2FuY2VsKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbitcdFx0XHQgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9PUF9DQU5DRUwsIHNyb19oYW5kbGVcbitcdH07XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgcm1pX29wX21lbV9kb25hdGUodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLCB1bnNpZ25lZCBsb25nIGxpc3RfYWRkcixcbitcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGxpc3RfY291bnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0ICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX09QX01FTV9ET05BVEUsIHNyb19oYW5kbGUsIGxpc3RfYWRkciwgbGlzdF9jb3VudCwgZmxhZ3NcbitcdH07XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgcm1pX29wX21lbV9yZWNsYWltKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbitcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsXG4rXHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9jb3VudCxcbitcdFx0XHQgICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnRcbitcdH07XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbit9XG4rXG4raW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbit7XG4rXHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5cykpKSB7XG4rXHRcdC8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovXG4rXHRcdHJldHVybiAtRUJVU1k7XG4rXHR9XG4rXG4rXHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHBoeXMpKTtcbitcbitcdHJldHVybiAwO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChmcmVlX2RlbGVnYXRlZF9wYWdlKTtcbitcbitzdGF0aWMgaW50IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGNvdW50KVxuK3tcbitcdGlmIChXQVJOX09OX09OQ0Uoc3JvLVx1MDAzZWFkZHJfY291bnQgXHUwMDNlIFJNSV9NQVhfQUREUl9MSVNUKSlcbitcdFx0cmV0dXJuIC1FT1ZFUkZMT1c7XG4rXG4rXHRpZiAoY291bnQgXHUwMDNlIFJNSV9NQVhfQUREUl9MSVNUIC0gc3JvLVx1MDAzZWFkZHJfY291bnQpXG4rXHRcdHJldHVybiAtRU5PU1BDO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4rXHRcdFx0XHQgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxuK1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuK1x0XHRcdFx0IHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLFxuK1x0XHRcdFx0IGdmcF90IGdmcClcbit7XG4rXHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9ET05BVEVfU0laRShkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemVfYnl0ZXMgPSBkb25hdGVfcmVxX3RvX3NpemUoZG9uYXRlcmVxKTtcbitcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XG4rXHR1bnNpZ25lZCBsb25nIHN0YXRlID0gUk1JX0RPTkFURV9TVEFURShkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyBzaXplID0gdW5pdF9zaXplX2J5dGVzICogY291bnQ7XG4rXHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XG4rXHRpbnQgcmV0O1xuK1x0dm9pZCAqdmlydDtcbitcdHBoeXNfYWRkcl90IHBoeXM7XG4rXG4rXHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2Mgc3JvLVx1MDAzZWFkZHJfY291bnQ7IGkrKykge1xuK1x0XHR1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLVx1MDAzZWFkZHJfbGlzdFtpXTtcbitcbitcdFx0aWYgKFJNSV9BRERSX1JBTkdFX1NJWkUoZW50cnkpID09IHVuaXRfc2l6ZSBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KSA9PSBjb3VudCBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIElTX0FMSUdORUQoUk1JX0FERFJfUkFOR0VfQUREUihlbnRyeSksIHNpemUpKSB7XG4rXHRcdFx0c3JvLVx1MDAzZWFkZHJfY291bnQtLTtcbitcdFx0XHRzd2FwKHNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdLFxuK1x0XHRcdCAgICAgc3JvLVx1MDAzZWFkZHJfbGlzdFtpXSk7XG4rXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcdH1cbitcbitcdHJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgMSk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0dmlydCA9IGFsbG9jX3BhZ2VzX2V4YWN0KHNpemUsIGdmcCk7XG4rXHRpZiAoIXZpcnQpXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1x0cGh5cyA9IHZpcnRfdG9fcGh5cyh2aXJ0KTtcbitcbitcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCkge1xuK1x0XHRwaHlzX2FkZHJfdCBkZWxlZ2F0ZWRfcGh5cztcbitcbitcdFx0aWYgKHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCBzaXplLCBcdTAwMjZkZWxlZ2F0ZWRfcGh5cykpIHtcbitcdFx0XHRpZiAoIXJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIGRlbGVnYXRlZF9waHlzIC0gcGh5cykpXG4rXHRcdFx0XHRmcmVlX3BhZ2VzX2V4YWN0KHZpcnQsIHNpemUpO1xuK1x0XHRcdHJldHVybiAtRU5YSU87XG4rXHRcdH1cbitcdH1cbitcbitcdGFkZHJfcmFuZ2UgPSBwaHlzIFx1MDAyNiBSTUlfQUREUl9SQU5HRV9BRERSX01BU0s7XG4rXHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCB1bml0X3NpemUpO1xuK1x0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIGNvdW50KTtcbitcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCBzdGF0ZSk7XG4rXG4rXHRzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSA9IGFkZHJfcmFuZ2U7XG4rXG4rb3V0OlxuK1x0cm1pX29wX21lbV9kb25hdGUoc3JvX2hhbmRsZSxcbitcdFx0XHQgIHZpcnRfdG9fcGh5cyhcdTAwMjZzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSksIDEsXG4rXHRcdFx0ICAwLCBvdXRfcmVncyk7XG4rXG4rXHR1bnNpZ25lZCBsb25nIGRvbmF0ZWRfZ3JhbnVsZXMgPSBvdXRfcmVncy1cdTAwM2VhMTtcbitcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplID0gZG9uYXRlZF9ncmFudWxlcyBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbitcbitcdGlmIChkb25hdGVkX2dyYW51bGVzID09IDApIHtcbitcdFx0LyogTm8gcGFnZXMgdXNlZCBieSB0aGUgUk1NICovXG4rXHRcdHNyby1cdTAwM2VhZGRyX2NvdW50Kys7XG4rXHR9IGVsc2UgaWYgKGRvbmF0ZWRfc2l6ZSBcdTAwM2Mgc2l6ZSkge1xuK1x0XHRwaHlzID0gc3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudF0gXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcbitcbitcdFx0LyogTm90IGFsbCBncmFudWxlcyB1c2VkIGJ5IHRoZSBSTU0sIGZyZWUgdGhlIHJlbWFpbmluZyBwYWdlcyAqL1xuK1x0XHRmb3IgKGxvbmcgaSA9IGRvbmF0ZWRfc2l6ZTsgaSBcdTAwM2Mgc2l6ZTsgaSArPSBQQUdFX1NJWkUpIHtcbitcdFx0XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpXG4rXHRcdFx0XHRmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXMgKyBpKTtcbitcdFx0XHRlbHNlXG4rXHRcdFx0XHRfX2ZyZWVfcGFnZShwaHlzX3RvX3BhZ2UocGh5cyArIGkpKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfbm9uY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuK1x0XHRcdFx0ICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLFxuK1x0XHRcdFx0ICAgIGdmcF90IGdmcClcbit7XG4rXHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9ET05BVEVfU0laRShkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemVfYnl0ZXMgPSBkb25hdGVfcmVxX3RvX3NpemUoZG9uYXRlcmVxKTtcbitcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XG4rXHR1bnNpZ25lZCBsb25nIHN0YXRlID0gUk1JX0RPTkFURV9TVEFURShkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyBmb3VuZCA9IDA7XG4rXHR1bnNpZ25lZCBsb25nIGFkZHJfbGlzdF9zdGFydCA9IHNyby1cdTAwM2VhZGRyX2NvdW50O1xuK1x0aW50IHJldDtcbitcbitcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBhZGRyX2xpc3Rfc3RhcnQgXHUwMDI2XHUwMDI2IGZvdW5kIFx1MDAzYyBjb3VudDsgaSsrKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXHUwMDNlYWRkcl9saXN0W2ldO1xuK1xuK1x0XHRpZiAoUk1JX0FERFJfUkFOR0VfU0laRShlbnRyeSkgPT0gdW5pdF9zaXplIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IDEgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBSTUlfQUREUl9SQU5HRV9TVEFURShlbnRyeSkgPT0gc3RhdGUpIHtcbitcdFx0XHRhZGRyX2xpc3Rfc3RhcnQtLTtcbitcdFx0XHRzd2FwKHNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSxcbitcdFx0XHQgICAgIHNyby1cdTAwM2VhZGRyX2xpc3RbaV0pO1xuK1x0XHRcdGZvdW5kKys7XG4rXHRcdFx0aS0tO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIGNvdW50IC0gZm91bmQpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHdoaWxlIChmb3VuZCBcdTAwM2MgY291bnQpIHtcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyX3JhbmdlO1xuK1x0XHR2b2lkICp2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3QodW5pdF9zaXplX2J5dGVzLCBnZnApO1xuK1x0XHRwaHlzX2FkZHJfdCBwaHlzO1xuK1xuK1x0XHRpZiAoIXZpcnQpXG4rXHRcdFx0cmV0dXJuIC1FTk9NRU07XG4rXG4rXHRcdHBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7XG4rXG4rXHRcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCkge1xuK1x0XHRcdHBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzO1xuK1xuK1x0XHRcdGlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgdW5pdF9zaXplX2J5dGVzLFxuK1x0XHRcdFx0XHQgICAgICAgXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XG4rXHRcdFx0XHRpZiAoIXJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIGRlbGVnYXRlZF9waHlzIC0gcGh5cykpXG4rXHRcdFx0XHRcdGZyZWVfcGFnZXNfZXhhY3QodmlydCwgdW5pdF9zaXplX2J5dGVzKTtcbitcdFx0XHRcdHJldHVybiAtRU5YSU87XG4rXHRcdFx0fVxuK1x0XHR9XG4rXG4rXHRcdGFkZHJfcmFuZ2UgPSBwaHlzIFx1MDAyNiBSTUlfQUREUl9SQU5HRV9BRERSX01BU0s7XG4rXHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TSVpFX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIHVuaXRfc2l6ZSk7XG4rXHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCAxKTtcbitcdFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIHN0YXRlKTtcbitcbitcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudCsrXSA9IGFkZHJfcmFuZ2U7XG4rXHRcdGZvdW5kKys7XG4rXHR9XG4rXG4rXHRybWlfb3BfbWVtX2RvbmF0ZShzcm9faGFuZGxlLFxuK1x0XHRcdCAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSksXG4rXHRcdFx0ICBmb3VuZCwgMCwgb3V0X3JlZ3MpO1xuK1xuK1x0dW5zaWduZWQgbG9uZyBkb25hdGVkX2dyYW51bGVzID0gb3V0X3JlZ3MtXHUwMDNlYTE7XG4rXHR1bnNpZ25lZCBsb25nIGdyYW51bGVzX3Blcl91bml0ID0gdW5pdF9zaXplX2J5dGVzIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuK1x0dW5zaWduZWQgbG9uZyBjb25zdW1lZF91bml0cztcbitcbitcdC8qXG4rXHQgKiBUaGUgUk1NIHNob3VsZG4ndCByZXBvcnQgbW9yZSBncmFudWxlcyB0aGFuIHdlIHByb3ZpZGVkLCBidXQgY2xhbXBcbitcdCAqIGp1c3QgaW4gY2FzZS5cbitcdCAqL1xuK1x0aWYgKFdBUk5fT05fT05DRShkb25hdGVkX2dyYW51bGVzIFx1MDAzZSBmb3VuZCAqIGdyYW51bGVzX3Blcl91bml0KSlcbitcdFx0ZG9uYXRlZF9ncmFudWxlcyA9IGZvdW5kICogZ3JhbnVsZXNfcGVyX3VuaXQ7XG4rXG4rXHQvKlxuK1x0ICogVGhlIFJNTSByZXBvcnRzIHRoZSBjb25zdW1lZCBtZW1vcnkgaW4gdGVybXMgb2YgZ3JhbnVsZXMsIGJ1dCB3ZVxuK1x0ICogdHJhY2sgaW4gdGhlIGFkZHJlc3MgbGlzdHMgaW4gdW5pdC1zaXplZCByYW5nZXMuIFNvIGRpdmlkZSB0byBnZXRcbitcdCAqIHRoZSBudW1iZXIgb2YgKGNvbXBsZXRlKSBjb25zdW1lZCB1bml0cy5cbitcdCAqL1xuK1x0Y29uc3VtZWRfdW5pdHMgPSBkb25hdGVkX2dyYW51bGVzIC8gZ3JhbnVsZXNfcGVyX3VuaXQ7XG4rXHRpZiAoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl91bml0KSB7XG4rXHRcdC8qXG4rXHRcdCAqIEEgdW5pdCBoYXMgYmVlbiBwYXJ0aWFsbHkgY29uc3VtZWQsIHRoZSBzdGFydCBpcyBvd25lZCBieVxuK1x0XHQgKiB0aGUgUk1NLCB0aGUgdGFpbCBpcyBvd25lZCBieSB0aGUgaG9zdFxuK1x0XHQgKi9cbitcdFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9XG4rXHRcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgKyBjb25zdW1lZF91bml0c107XG4rXHRcdHBoeXNfYWRkcl90IHBoeXMgPSBSTUlfQUREUl9SQU5HRV9BRERSKGVudHJ5KTtcbitcdFx0dW5zaWduZWQgbG9uZyBkb25hdGVkX3NpemUgPVxuK1x0XHRcdChkb25hdGVkX2dyYW51bGVzICUgZ3JhbnVsZXNfcGVyX3VuaXQpIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuK1xuK1x0XHQvKiBGcmVlIHRoZSB0YWlsIGJhY2sgKi9cbitcdFx0Zm9yICh1bnNpZ25lZCBsb25nIGkgPSBkb25hdGVkX3NpemU7IGkgXHUwMDNjIHVuaXRfc2l6ZV9ieXRlcztcbitcdFx0ICAgICBpICs9IFBBR0VfU0laRSkge1xuK1x0XHRcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRClcbitcdFx0XHRcdGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyArIGkpO1xuK1x0XHRcdGVsc2VcbitcdFx0XHRcdF9fZnJlZV9wYWdlKHBoeXNfdG9fcGFnZShwaHlzICsgaSkpO1xuK1x0XHR9XG4rXG4rXHRcdC8qXG4rXHRcdCAqIFRoaXMgdW5pdCBpcyBub3cgZnVsbHkgJ2NvbnN1bWVkJyAoZWl0aGVyIGhlbGQgYnkgdGhlIFJNTSBvclxuK1x0XHQgKiBmcmVlZClcbitcdFx0ICovXG4rXHRcdGNvbnN1bWVkX3VuaXRzKys7XG4rXHR9XG4rXG4rXHQvKiBLZWVwIGp1c3QgdGhlIHVuaXRzIHRoZSBSTU0gZGlkbid0IHVzZSBpbiBhZGRyX2xpc3QgKi9cbitcdGZvciAodW5zaWduZWQgbG9uZyBpID0gY29uc3VtZWRfdW5pdHM7IGkgXHUwMDNjIGZvdW5kOyBpKyspXG4rXHRcdHNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0ICsgaSAtIGNvbnN1bWVkX3VuaXRzXSA9XG4rXHRcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgKyBpXTtcbitcbitcdHNyby1cdTAwM2VhZGRyX2NvdW50IC09IGNvbnN1bWVkX3VuaXRzO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyxcbitcdFx0XHQgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbitcdFx0XHQgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuK1x0XHRcdCAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyxcbitcdFx0XHQgIGdmcF90IGdmcClcbit7XG4rXHR1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0RPTkFURV9DT1VOVChkb25hdGVyZXEpO1xuK1xuK1x0aWYgKFdBUk5fT05fT05DRSghY291bnQpKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdGlmIChSTUlfRE9OQVRFX0NPTlRJRyhkb25hdGVyZXEpKSB7XG4rXHRcdHJldHVybiBybWlfc3JvX2RvbmF0ZV9jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsXG4rXHRcdFx0XHRcdCAgICAgcmVncywgZ2ZwKTtcbitcdH0gZWxzZSB7XG4rXHRcdHJldHVybiBybWlfc3JvX2RvbmF0ZV9ub25jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsXG4rXHRcdFx0XHRcdFx0cmVncywgZ2ZwKTtcbitcdH1cbit9XG4rXG4rc3RhdGljIGludCBybWlfc3JvX3JlY2xhaW0oc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyxcbitcdFx0XHQgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4rXHRcdFx0ICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBjYXBhY2l0eTtcbitcdGludCByZXQ7XG4rXG4rXHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpO1xuK1x0aWYgKHJldClcbitcdFx0cm1pX3Nyb19mcmVlKHNybyk7XG4rXG4rXHRjYXBhY2l0eSA9IFJNSV9NQVhfQUREUl9MSVNUIC0gc3JvLVx1MDAzZWFkZHJfY291bnQ7XG4rXG4rXHRybWlfb3BfbWVtX3JlY2xhaW0oc3JvX2hhbmRsZSxcbitcdFx0XHQgICB2aXJ0X3RvX3BoeXMoXHUwMDI2c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudF0pLFxuK1x0XHRcdCAgIGNhcGFjaXR5LCBvdXRfcmVncyk7XG4rXG4rXHRpZiAoV0FSTl9PTl9PTkNFKG91dF9yZWdzLVx1MDAzZWExIFx1MDAzZSBjYXBhY2l0eSkpXG4rXHRcdG91dF9yZWdzLVx1MDAzZWExID0gY2FwYWNpdHk7XG4rXG4rXHRzcm8tXHUwMDNlYWRkcl9jb3VudCArPSBvdXRfcmVncy1cdTAwM2VhMTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbit2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuK3tcbitcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBzcm8tXHUwMDNlYWRkcl9jb3VudDsgaSsrKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXHUwMDNlYWRkcl9saXN0W2ldO1xuK1x0XHR1bnNpZ25lZCBsb25nIGFkZHIgPSBSTUlfQUREUl9SQU5HRV9BRERSKGVudHJ5KTtcbitcdFx0dW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfQUREUl9SQU5HRV9TSVpFKGVudHJ5KTtcbitcdFx0dW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KTtcbitcdFx0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KTtcbitcdFx0dW5zaWduZWQgbG9uZyBzaXplID0gZG9uYXRlX3JlcV90b19zaXplKHVuaXRfc2l6ZSkgKiBjb3VudDtcbitcbitcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7XG4rXHRcdFx0aWYgKFdBUk5fT05fT05DRShybWlfdW5kZWxlZ2F0ZV9yYW5nZShhZGRyLCBzaXplKSkpIHtcbitcdFx0XHRcdC8qIExlYWsgdGhlIHBhZ2VzICovXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHR9XG4rXHRcdH1cbitcdFx0ZnJlZV9wYWdlc19leGFjdChwaHlzX3RvX3ZpcnQoYWRkciksIHNpemUpO1xuK1x0fVxuK1xuK1x0c3JvLVx1MDAzZWFkZHJfY291bnQgPSAwO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX2ZyZWUpO1xuK1xuK3Vuc2lnbmVkIGxvbmcgcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywgZ2ZwX3QgZ2ZwKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZTtcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MgPSBcdTAwMjZzcm8tXHUwMDNlcmVncztcbitcbitcdHJtaV9zbWNjY19pbnZva2UocmVncywgcmVncyk7XG4rXG4rXHRzcm9faGFuZGxlID0gcmVncy1cdTAwM2VhMTtcbitcbitcdHdoaWxlIChSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVx1MDAzZWEwKSA9PSBSTUlfSU5DT01QTEVURSkge1xuK1x0XHRib29sIGNhbl9jYW5jZWwgPSBSTUlfUkVUVVJOX0NBTl9DQU5DRUwocmVncy1cdTAwM2VhMCk7XG4rXHRcdGludCByZXQgPSAwO1xuK1xuK1x0XHRzd2l0Y2ggKFJNSV9SRVRVUk5fTUVNUkVRKHJlZ3MtXHUwMDNlYTApKSB7XG4rXHRcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcbitcdFx0XHRybWlfb3BfY29udGludWUoc3JvX2hhbmRsZSwgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkcsXG4rXHRcdFx0XHRcdHJlZ3MpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlIFJNSV9PUF9NRU1fUkVRX0RPTkFURTpcbitcdFx0XHRyZXQgPSBybWlfc3JvX2RvbmF0ZShzcm8sIHNyb19oYW5kbGUsIHJlZ3MtXHUwMDNlYTIsIHJlZ3MsXG4rXHRcdFx0XHRcdCAgICAgZ2ZwKTtcbitcdFx0XHRicmVhaztcbitcdFx0Y2FzZSBSTUlfT1BfTUVNX1JFUV9SRUNMQUlNOlxuK1x0XHRcdHJldCA9IHJtaV9zcm9fcmVjbGFpbShzcm8sIHNyb19oYW5kbGUsIHJlZ3MpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRkZWZhdWx0OlxuK1x0XHRcdHJldCA9IFdBUk5fT05fT05DRSgxKTtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1xuK1x0XHRpZiAocmV0KSB7XG4rXHRcdFx0aWYgKGNhbl9jYW5jZWwpXG4rXHRcdFx0XHRybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpO1xuK1xuK1x0XHRcdGlmIChXQVJOX09OX09OQ0UoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCkgIT0gUk1JX0lOQ09NUExFVEUpKVxuK1x0XHRcdFx0cmV0dXJuIHJldDtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cmV0dXJuIHJlZ3MtXHUwMDNlYTA7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKTtcbitcbisvKiBGb3IgUk1JIGNvbW1hbmRzIHRoYXQgYXJlIHN0YXRlZnVsIGJ1dCBub3QgbWVtb3J5LXRyYW5zZmVycmluZyAqL1xuK3Vuc2lnbmVkIGxvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBzcm9faGFuZGxlO1xuK1xuK1x0cm1pX3NtY2NjX2ludm9rZShyZWdzLCByZWdzKTtcbitcbitcdHNyb19oYW5kbGUgPSByZWdzLVx1MDAzZWExO1xuK1xuK1x0d2hpbGUgKFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3MtXHUwMDNlYTApID09IFJNSV9JTkNPTVBMRVRFKSB7XG4rXHRcdGJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLVx1MDAzZWEwKTtcbitcbitcdFx0c3dpdGNoIChSTUlfUkVUVVJOX01FTVJFUShyZWdzLVx1MDAzZWEwKSkge1xuK1x0XHRjYXNlIFJNSV9PUF9NRU1fUkVRX05PTkU6XG4rXHRcdFx0cm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLFxuK1x0XHRcdFx0XHRyZWdzKTtcbitcdFx0XHRicmVhaztcbitcdFx0ZGVmYXVsdDpcbitcdFx0XHRXQVJOX09OX09OQ0UoMSk7XG4rXHRcdFx0aWYgKCFjYW5fY2FuY2VsKVxuK1x0XHRcdFx0cmV0dXJuIHJlZ3MtXHUwMDNlYTA7XG4rXG4rXHRcdFx0cm1pX29wX2NhbmNlbChzcm9faGFuZGxlLCByZWdzKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cmV0dXJuIHJlZ3MtXHUwMDNlYTA7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fZXhlY3V0ZSk7XG4rXG4rc3RhdGljIGludCBybWlfY2hlY2tfdmVyc2lvbih2b2lkKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbitcdHVuc2lnbmVkIHNob3J0IHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3I7XG4rXHR1bnNpZ25lZCBsb25nIGhvc3RfdmVyc2lvbiA9IFJNSV9BQklfVkVSU0lPTihSTUlfQUJJX01BSk9SX1ZFUlNJT04sXG4rXHRcdFx0XHRcdFx0ICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pO1xuK1x0dW5zaWduZWQgbG9uZyBhYTY0cGZyMCA9IHJlYWRfc2FuaXRpc2VkX2Z0cl9yZWcoU1lTX0lEX0FBNjRQRlIwX0VMMSk7XG4rXG4rXHQvKiBJZiBSTUUgaXNuJ3Qgc3VwcG9ydGVkLCB0aGVuIFJNSSBjYW4ndCBiZSAqL1xuK1x0aWYgKGNwdWlkX2ZlYXR1cmVfZXh0cmFjdF91bnNpZ25lZF9maWVsZChhYTY0cGZyMCwgSURfQUE2NFBGUjBfRUwxX1JNRV9TSElGVCkgPT0gMClcbitcdFx0cmV0dXJuIC1FTlhJTztcbitcbitcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfVkVSU0lPTiwgaG9zdF92ZXJzaW9uLCBcdTAwMjZyZXMpO1xuK1xuK1x0aWYgKHJlcy5hMCA9PSBTTUNDQ19SRVRfTk9UX1NVUFBPUlRFRClcbitcdFx0cmV0dXJuIC1FTlhJTztcbitcbitcdHZlcnNpb25fbWFqb3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHJlcy5hMSk7XG4rXHR2ZXJzaW9uX21pbm9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NSU5PUihyZXMuYTEpO1xuK1xuK1x0aWYgKHJlcy5hMCAhPSBSTUlfU1VDQ0VTUykge1xuK1x0XHR1bnNpZ25lZCBzaG9ydCBoaWdoX3ZlcnNpb25fbWFqb3IsIGhpZ2hfdmVyc2lvbl9taW5vcjtcbitcbitcdFx0aGlnaF92ZXJzaW9uX21ham9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUihyZXMuYTIpO1xuK1x0XHRoaWdoX3ZlcnNpb25fbWlub3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHJlcy5hMik7XG4rXG4rXHRcdHByX2VycihcIlVuc3VwcG9ydGVkIFJNSSBBQkkgKHYlZC4lZCAtIHYlZC4lZCkgd2Ugd2FudCB2JWQuJWRcXG5cIixcbitcdFx0ICAgICAgIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IsXG4rXHRcdCAgICAgICBoaWdoX3ZlcnNpb25fbWFqb3IsIGhpZ2hfdmVyc2lvbl9taW5vcixcbitcdFx0ICAgICAgIFJNSV9BQklfTUFKT1JfVkVSU0lPTixcbitcdFx0ICAgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7XG4rXHRcdHJldHVybiAtRU5YSU87XG4rXHR9XG4rXG4rXHRwcl9pbmZvKFwiUk1JIEFCSSB2ZXJzaW9uICVkLiVkXFxuXCIsIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IpO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcm1pX3JlYWRfZmVhdHVyZXModm9pZClcbit7XG4rXHQvKlxuK1x0ICogU2luY2Ugd2UndmUgbmVnb3RpYXRlZCBhIGNvbXBhdGlibGUgdmVyc2lvbiB0aGVzZSBmZWF0dXJlIHJlZ2lzdGVyc1xuK1x0ICogc2hvdWxkIGFsd2F5cyBiZSBhdmFpbGFibGVcbitcdCAqL1xuK1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIFJNSV9GRUFUX1JFR19DT1VOVDsgaSsrKSB7XG4rXHRcdGlmIChXQVJOX09OKHJtaV9mZWF0dXJlcyhpLCBcdTAwMjZybWlfZmVhdF9yZWdfY2FjaGVbaV0pKSlcbitcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHJtaV9jb25maWd1cmUodm9pZClcbit7XG4rXHR1bnNpZ25lZCBsb25nIHJldDtcbitcdHN0cnVjdCBybW1fY29uZmlnICpjb25maWcgX19mcmVlKGZyZWVfcGFnZSkgPSAoc3RydWN0IHJtbV9jb25maWcgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XG4rXHRzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvIF9fZnJlZShrZnJlZSkgPSAoc3RydWN0IHJtaV9zcm9fc3RhdGUgKilrbWFsbG9jX29iaigqc3JvKTtcbitcbitcdGlmICghY29uZmlnIHx8ICFzcm8pXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0c3dpdGNoIChQQUdFX1NJWkUpIHtcbitcdGNhc2UgU1pfNEs6XG4rXHRcdGNvbmZpZy1cdTAwM2VybWlfZ3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV80S0I7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBTWl8xNks6XG4rXHRcdGNvbmZpZy1cdTAwM2VybWlfZ3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV8xNktCO1xuK1x0XHRicmVhaztcbitcdGNhc2UgU1pfNjRLOlxuK1x0XHRjb25maWctXHUwMDNlcm1pX2dyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNjRLQjtcbitcdFx0YnJlYWs7XG4rXHRkZWZhdWx0OlxuK1x0XHRCVUlMRF9CVUcoKTtcbitcdH1cbitcbitcdC8qXG4rXHQgKiBGb3Igbm93IHdlIHNldCB0aGUgdHJhY2tpbmdfcmVnaW9uX3NpemUgdG8gMCB3aGljaCBpcyB0aGUgb25seSBvcHRpb25cbitcdCAqIGZvciA0S0IgUEFHRV9TSVpFICgxR0IgZm9yIDRLQiBQQUdFX1NJWkUsIDMyTUIvNTEyTUIgZm9yIDE2S0IvNjRLQikuXG4rXHQgKiBUT0RPOiBTdXBwb3J0IG90aGVyIHRyYWNraW5nIHNpemVzIHZpYSBLY29uZmlnIG9wdGlvbiBmb3Igb3RoZXJcbitcdCAqIFBBR0VfU0laRVNcbitcdCAqL1xuK1x0Y29uZmlnLVx1MDAzZXRyYWNraW5nX3JlZ2lvbl9zaXplID0gMDtcbitcbitcdHJldCA9IHJtaV9ybW1fY29uZmlnX3NldCh2aXJ0X3RvX3BoeXMoY29uZmlnKSk7XG4rXHRpZiAocmV0KSB7XG4rXHRcdHByX2VycihcIlJNTSBjb25maWcgc2V0IGZhaWxlZFxcblwiKTtcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHR9XG4rXG4rXHRyZXQgPSBybWlfcm1tX2FjdGl2YXRlKHNybyk7XG4rXHRpZiAocmV0KSB7XG4rXHRcdHByX2VycihcIlJNTSBhY3RpdmF0ZSBmYWlsZWRcXG5cIik7XG4rXHRcdHJldHVybiAtRU5YSU87XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLypcbisgKiBNYWtlIHN1cmUgdGhlIGFyZWEgaXMgdHJhY2tlZCBieSBSTU0gYXQgRklORSBncmFudWxhcml0eS5cbisgKiBXZSBkbyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aGUgdHJhY2tpbmcgeWV0LlxuKyAqL1xuK3N0YXRpYyBpbnQgcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcbit7XG4rXHR3aGlsZSAoc3RhcnQgXHUwMDNjIGVuZCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIHJldCwgY2F0ZWdvcnksIHN0YXRlLCBuZXh0O1xuK1xuK1x0XHRyZXQgPSBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQoc3RhcnQsIGVuZCwgXHUwMDI2Y2F0ZWdvcnksIFx1MDAyNnN0YXRlLCBcdTAwMjZuZXh0KTtcbitcdFx0aWYgKHJldCAhPSBSTUlfU1VDQ0VTUyB8fFxuK1x0XHQgICAgc3RhdGUgIT0gUk1JX1RSQUNLSU5HX0ZJTkUgfHxcbitcdFx0ICAgIGNhdGVnb3J5ICE9IFJNSV9NRU1fQ0FURUdPUllfQ09OVkVOVElPTkFMKSB7XG4rXHRcdFx0LyogVE9ETzogU2V0IGdyYW51bGUgdHJhY2tpbmcgaW4gdGhpcyBjYXNlICovXG4rXHRcdFx0cHJfZXJyKFwiR3JhbnVsZSB0cmFja2luZyBmb3IgcmVnaW9uIGlzbid0IGZpbmUvY29udmVudGlvbmFsOiAlbGx4XFxuXCIsXG4rXHRcdFx0ICAgICAgIHN0YXJ0KTtcbitcdFx0XHRyZXR1cm4gLUVOT0RFVjtcbitcdFx0fVxuK1x0XHRzdGFydCA9IG5leHQ7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBybWlfY3JlYXRlX2dwdHMocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcbit7XG4rXHRzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvO1xuK1x0dW5zaWduZWQgbG9uZyBsMGdwdF9zejtcbitcbitcdHNybyA9IGttYWxsb2Nfb2JqKCpzcm8sIEdGUF9LRVJORUwpO1xuK1x0aWYgKCFzcm8pXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0bDBncHRfc3ogPSAxVUwgXHUwMDNjXHUwMDNjICgzMCArIEZJRUxEX0dFVChSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1osXG4rXHRcdFx0XHRcdCAgcm1pX2ZlYXRfcmVnKDEpKSk7XG4rXHRzdGFydCA9IEFMSUdOX0RPV04oc3RhcnQsIGwwZ3B0X3N6KTtcbitcdGVuZCA9IEFMSUdOKGVuZCwgbDBncHRfc3opO1xuK1xuK1x0d2hpbGUgKHN0YXJ0IFx1MDAzYyBlbmQpIHtcbitcdFx0aW50IHJldCA9IHJtaV9ncHRfbDFfY3JlYXRlKHN0YXJ0LCBzcm8sIEdGUF9LRVJORUwpO1xuK1xuK1x0XHQvKlxuK1x0XHQgKiBNYWtlIHN1cmUgdGhlIEwxIEdQVCB0YWJsZXMgYXJlIGNyZWF0ZWQgZm9yIHRoZSByZWdpb24uXG4rXHRcdCAqIFJNSV9FUlJPUl9HUFQgaW5kaWNhdGVzIHRoZSBMMSB0YWJsZSBhbHJlYWR5IGV4aXN0cy5cbitcdFx0ICovXG4rXHRcdGlmIChyZXQgIT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IFJNSV9SRVRVUk5fU1RBVFVTKHJldCkgIT0gUk1JX0VSUk9SX0dQVCkge1xuK1x0XHRcdHByX2VycihcIkdQVCBMZXZlbDEgdGFibGUgbWlzc2luZyBmb3IgJWxseFxcblwiLCBzdGFydCk7XG4rXHRcdFx0a2ZyZWUoc3JvKTtcbitcdFx0XHRyZXR1cm4gLUVOT01FTTtcbitcdFx0fVxuK1x0XHRzdGFydCArPSBsMGdwdF9zejtcbitcdH1cbitcbitcdGtmcmVlKHNybyk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBybWlfaW5pdF9tZXRhZGF0YSh2b2lkKVxuK3tcbitcdHBoeXNfYWRkcl90IHN0YXJ0LCBlbmQ7XG4rXHRjb25zdCBzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyO1xuK1xuK1x0Zm9yX2VhY2hfbWVtX3JlZ2lvbihyKSB7XG4rXHRcdGludCByZXQ7XG4rXG4rXHRcdHN0YXJ0ID0gbWVtYmxvY2tfcmVnaW9uX21lbW9yeV9iYXNlX3BmbihyKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbitcdFx0ZW5kID0gbWVtYmxvY2tfcmVnaW9uX21lbW9yeV9lbmRfcGZuKHIpIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuK1x0XHRyZXQgPSBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhzdGFydCwgZW5kKTtcbitcdFx0aWYgKHJldClcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHRyZXQgPSBybWlfY3JlYXRlX2dwdHMoc3RhcnQsIGVuZCk7XG4rXHRcdGlmIChyZXQpXG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitib29sIGlzX3JtaV9hdmFpbGFibGUodm9pZClcbit7XG4rXHRyZXR1cm4gYXJtNjRfcm1pX2lzX2F2YWlsYWJsZTtcbit9XG4rXG4rc3RhdGljIGludCBfX2luaXQgYXJtNjRfaW5pdF9ybWkodm9pZClcbit7XG4rXHRpbnQgcmV0O1xuK1xuK1x0LyogQ29udGludWUgd2l0aG91dCByZWFsbSBzdXBwb3J0IGlmIHdlIGNhbid0IGFncmVlIG9uIGEgdmVyc2lvbiAqL1xuK1x0cmV0ID0gcm1pX2NoZWNrX3ZlcnNpb24oKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBybWlfcmVhZF9mZWF0dXJlcygpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IHJtaV9jb25maWd1cmUoKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBybWlfaW5pdF9tZXRhZGF0YSgpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdGFybTY0X3JtaV9pc19hdmFpbGFibGUgPSB0cnVlO1xuK1x0cHJfaW5mbyhcIlJNSSBjb25maWd1cmVkXCIpO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qXG4rICogTm90ZSBhcm02NF9pbml0X3JtaSgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBrdm1faW5pdF9ybWkoKSBvdGhlcndpc2UgS1ZNXG4rICogd2lsbCBub3Qgc3VwcG9ydCByZWFsbSBndWVzdHMuIHN1YnN5c19pbml0Y2FsbCgpIGlzIGNhbGxlZCBiZWZvcmVcbisgKiBtb2R1bGVfaW5pdCgpICh1c2VkIGZvciBLVk0pIHNvIHRoaXMgaXMgT0suXG4rICovXG4rc3Vic3lzX2luaXRjYWxsKGFybTY0X2luaXRfcm1pKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oIGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi4xMzg5ODNhYjRlM2MyMlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaFxuQEAgLTAsMCArMSwyMDUgQEBcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xuKy8qXG4rICogQ29weXJpZ2h0IChDKSAyMDI2IEFSTSBMdGQuXG4rICovXG4rXG4rI2lmbmRlZiBfX0xJTlVYX0FSTV9STUlfQ01EU19IX1xuKyNkZWZpbmUgX19MSU5VWF9BUk1fUk1JX0NNRFNfSF9cbitcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9hcm0tc21jY2Mtcm1pLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9idWcuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcdTAwM2Nhc20vcGFnZS5oXHUwMDNlXG4rXG4rc3RydWN0IHJ0dF9lbnRyeSB7XG4rXHR1bnNpZ25lZCBsb25nIHdhbGtfbGV2ZWw7XG4rXHR1bnNpZ25lZCBsb25nIGRlc2M7XG4rXHRpbnQgc3RhdGU7XG4rXHRpbnQgcmlwYXM7XG4rfTtcbitcbisjZGVmaW5lIFJNSV9NQVhfQUREUl9MSVNUXHQyNTZcbitcbitzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSB7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3M7XG4rXHR1bnNpZ25lZCBsb25nIGFkZHJfY291bnQ7XG4rXHR1bnNpZ25lZCBsb25nIGFkZHJfbGlzdFtSTUlfTUFYX0FERFJfTElTVF07XG4rfTtcbitcbit1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZyh1bnNpZ25lZCBsb25nIGlkKTtcbitcbitpbnQgcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbitcdFx0ICAgICAgIHBoeXNfYWRkcl90ICpvdXRfcGh5cyk7XG4raW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7XG4raW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cyk7XG4rXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX2RlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbit7XG4rXHRyZXR1cm4gcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIFBBR0VfU0laRSwgTlVMTCk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbit7XG4rXHRyZXR1cm4gcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFKTtcbit9XG4rXG4rYm9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpO1xuK1xuK3Vuc2lnbmVkIGxvbmcgcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywgZ2ZwX3QgZ2ZwKTtcbit2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKTtcbit1bnNpZ25lZCBsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKTtcbitcbisjZGVmaW5lIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBnZnAsIC4uLikgKHtcdFx0XHRcdFxcXG4rXHRzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqX19zcm8gPSAoc3JvKTtcdFx0XHRcdFxcXG4rXHQqX19zcm8gPSAoc3RydWN0IHJtaV9zcm9fc3RhdGUpeyAucmVncyA9IHtfX1ZBX0FSR1NfX30gfTtcdFxcXG4rXHRpbnQgX19yZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShfX3NybywgZ2ZwKTtcdFx0XFxcbitcdHJtaV9zcm9fZnJlZShfX3Nybyk7XHRcdFx0XHRcdFx0XFxcbitcdF9fcmV0O1x0XHRcdFx0XHRcdFx0XHRcXFxuK30pXG4rXG4rLyoqXG4rICogcm1pX3JtbV9jb25maWdfc2V0KCkgLSBDb25maWd1cmUgdGhlIFJNTVxuKyAqIEBjZmdfcHRyOiBQQSBvZiBhIHN0cnVjdCBybW1fY29uZmlnXG4rICpcbisgKiBTZXRzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiB0aGUgUk1NLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfcm1tX2NvbmZpZ19zZXQodW5zaWduZWQgbG9uZyBjZmdfcHRyKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbitcbitcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUk1NX0NPTkZJR19TRVQsIGNmZ19wdHIsIFx1MDAyNnJlcyk7XG4rXG4rXHRyZXR1cm4gcmVzLmEwO1xuK31cbitcbisvKipcbisgKiBybWlfcm1tX2FjdGl2YXRlKCkgLSBBY3RpdmF0ZSB0aGUgUk1NXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX3JtbV9hY3RpdmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuK3tcbitcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwgU01DX1JNSV9STU1fQUNUSVZBVEUpO1xuK31cbitcbisvKipcbisgKiBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQoKSAtIEdldCBjb25maWd1cmF0aW9uIG9mIGEgR3JhbnVsZSB0cmFja2luZyByZWdpb25cbisgKiBAc3RhcnQ6IEJhc2UgUEEgb2YgdGhlIHRyYWNraW5nIHJlZ2lvblxuKyAqIEBlbmQ6IEVuZCBvZiB0aGUgUEEgcmVnaW9uXG4rICogQG91dF9jYXRlZ29yeTogTWVtb3J5IGNhdGVnb3J5XG4rICogQG91dF9zdGF0ZTogVHJhY2tpbmcgcmVnaW9uIHN0YXRlXG4rICogQG91dF90b3A6IFRvcCBvZiB0aGUgbWVtb3J5IHJlZ2lvblxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQodW5zaWduZWQgbG9uZyBzdGFydCxcbitcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBlbmQsXG4rXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF9jYXRlZ29yeSxcbitcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3N0YXRlLFxuK1x0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbitcbitcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVQsIHN0YXJ0LCBlbmQsIFx1MDAyNnJlcyk7XG4rXG4rXHRpZiAob3V0X2NhdGVnb3J5KVxuK1x0XHQqb3V0X2NhdGVnb3J5ID0gcmVzLmExO1xuK1x0aWYgKG91dF9zdGF0ZSlcbitcdFx0Km91dF9zdGF0ZSA9IHJlcy5hMjtcbitcdGlmIChvdXRfdG9wKVxuK1x0XHQqb3V0X3RvcCA9IHJlcy5hMztcbitcbitcdHJldHVybiByZXMuYTA7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ncHRfbDFfY3JlYXRlKCkgLSBDcmVhdGUgYSBMZXZlbCAxIEdQVFxuKyAqIEBhZGRyOiBCYXNlIG9mIHBoeXNpY2FsIGFkZHJlc3MgcmVnaW9uIGRlc2NyaWJlZCBieSB0aGUgTDFHUFRcbisgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuKyAqIEBnZnA6IEFsbG9jYXRpb24gZmxhZ3MgZm9yIFNSTyBtZW1vcnkgZG9uYXRpb24gcmVxdWVzdHNcbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX2dwdF9sMV9jcmVhdGUodW5zaWduZWQgbG9uZyBhZGRyLFxuK1x0XHRcdFx0ICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4rXHRcdFx0XHQgICAgZ2ZwX3QgZ2ZwKVxuK3tcbitcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgZ2ZwLCBTTUNfUk1JX0dQVF9MMV9DUkVBVEUsIGFkZHIpO1xuK31cbitcbisvKipcbisgKiBybWlfZmVhdHVyZXMoKSAtIFJlYWQgZmVhdHVyZSByZWdpc3RlclxuKyAqIEBpbmRleDogRmVhdHVyZSByZWdpc3RlciBpbmRleFxuKyAqIEBvdXQ6IEZlYXR1cmUgcmVnaXN0ZXIgdmFsdWUgaXMgd3JpdHRlbiB0byB0aGlzIHBvaW50ZXJcbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX2ZlYXR1cmVzKHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgKm91dClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XG4rXG4rXHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX0ZFQVRVUkVTLCBpbmRleCwgXHUwMDI2cmVzKTtcbitcbitcdGlmIChvdXQpXG4rXHRcdCpvdXQgPSByZXMuYTE7XG4rXHRyZXR1cm4gcmVzLmEwO1xuK31cbitcbisvKipcbisgKiBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSgpIC0gRGVsZWdhdGUgZ3JhbnVsZXNcbisgKiBAYmFzZTogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgb2YgdGhlIHJhbmdlXG4rICogQHRvcDogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgYWZ0ZXIgdGhlIHJhbmdlXG4rICogQG91dF90b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG5vdCBkZWxlZ2F0ZWRcbisgKlxuKyAqIERlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZSBmb3IgdXNlIGJ5IHRoZSByZWFsbSB3b3JsZC4gSWYgdGhlIGVudGlyZSByYW5nZVxuKyAqIHdhcyBkZWxlZ2F0ZWQgdGhlbiBAb3V0X3RvcCA9PSBAdG9wLCBvdGhlcndpc2UgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbisgKiBhZ2FpbiB3aXRoIEBiYXNlID09IEBvdXRfdG9wLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4rXHRcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfR1JBTlVMRV9SQU5HRV9ERUxFR0FURSwgYmFzZSwgdG9wXG4rXHR9O1xuK1x0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChvdXRfdG9wKVxuK1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKCkgLSBVbmRlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZXNcbisgKiBAYmFzZTogQmFzZSBQQSBvZiB0aGUgdGFyZ2V0IHJhbmdlXG4rICogQHRvcDogVG9wIFBBIG9mIHRoZSB0YXJnZXQgcmFuZ2VcbisgKiBAb3V0X3RvcDogUmV0dXJucyB0aGUgdG9wIFBBIG9mIHJhbmdlIHdob3NlIHN0YXRlIGlzIHVuZGVsZWdhdGVkXG4rICpcbisgKiBVbmRlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZXMgdG8gYWxsb3cgdXNlIGJ5IHRoZSBub3JtYWwgd29ybGQuIFdpbGwgZmFpbCBpZlxuKyAqIHRoZSBncmFudWxlcyBhcmUgaW4gdXNlLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSxcbitcdFx0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuK1x0XHRcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfR1JBTlVMRV9SQU5HRV9VTkRFTEVHQVRFLCBiYXNlLCB0b3BcbitcdH07XG4rXHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKG91dF90b3ApXG4rXHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKyNlbmRpZlxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oIGIvaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uYzk2NWU4ODY3NTE4ZjNcbi0tLSAvZGV2L251bGxcbisrKyBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oXG5AQCAtMCwwICsxLDQ5OSBAQFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4rLypcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLlxuKyAqXG4rICogVGhlIHZhbHVlcyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgYXJlIGZyb20gdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvclxuKyAqIHNwZWNpZmljYXRpb24gKERFTjAxMzcpIHZlcnNpb24gMi4wLWJldDI6XG4rICogaHR0cHM6Ly9kZXZlbG9wZXIuYXJtLmNvbS9kb2N1bWVudGF0aW9uL2RlbjAxMzcvMi0wYmV0Mi9cbisgKi9cbitcbisjaWZuZGVmIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IX1xuKyNkZWZpbmUgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYXJtLXNtY2NjLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRmaWVsZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYml0cy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnVpbGRfYnVnLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zaXplcy5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXHUwMDNjYXNtL3BhZ2UuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2FzbS9zeXNyZWcuaFx1MDAzZVxuK1xuKyNkZWZpbmUgU01DX1JNSV9DQUxMKGZ1bmMpXHRcdFx0XHRcXFxuK1x0QVJNX1NNQ0NDX0NBTExfVkFMKEFSTV9TTUNDQ19GQVNUX0NBTEwsXHRcdFxcXG4rXHRcdFx0ICAgQVJNX1NNQ0NDX1NNQ182NCxcdFx0XFxcbitcdFx0XHQgICBBUk1fU01DQ0NfT1dORVJfU1RBTkRBUkQsXHRcXFxuK1x0XHRcdCAgIChmdW5jKSlcbitcbisjZGVmaW5lIFNNQ19STUlfVkVSU0lPTlx0XHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1MClcbitcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVRcdFx0U01DX1JNSV9DQUxMKDB4MDE1MylcbitcbisjZGVmaW5lIFNNQ19STUlfUkVBTE1fQUNUSVZBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTU3KVxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTU4KVxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1OSlcbisjZGVmaW5lIFNNQ19STUlfUkVDX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNWEpXG4rI2RlZmluZSBTTUNfUk1JX1JFQ19ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1YilcbisjZGVmaW5lIFNNQ19STUlfUkVDX0VOVEVSXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1YylcbisjZGVmaW5lIFNNQ19STUlfUlRUX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNWQpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1ZSlcbitcbisjZGVmaW5lIFNNQ19STUlfUlRUX1JFQURfRU5UUllcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTYxKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1ZBTElEQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxNjMpXG4rI2RlZmluZSBTTUNfUk1JX1BTQ0lfQ09NUExFVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTY0KVxuKyNkZWZpbmUgU01DX1JNSV9GRUFUVVJFU1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjUpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9GT0xEXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2NilcbitcbisjZGVmaW5lIFNNQ19STUlfUlRUX0lOSVRfUklQQVNcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTY4KVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1JJUEFTXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2OSlcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2YSlcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNmIpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1JNTV9DT05GSUdfU0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2ZSlcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfSVJRX05PVElGWVx0XHRTTUNfUk1JX0NBTEwoMHgwMTZmKVxuKyNkZWZpbmUgU01DX1JNSV9BVFRFU1RfUExBVF9UT0tFTl9SRUZSRVNIXHRTTUNfUk1JX0NBTEwoMHgwMTcwKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9QREVWX0FCT1JUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3NClcbisjZGVmaW5lIFNNQ19STUlfUERFVl9DT01NVU5JQ0FURVx0XHRTTUNfUk1JX0NBTEwoMHgwMTc1KVxuKyNkZWZpbmUgU01DX1JNSV9QREVWX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzYpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzcpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfR0VUX1NUQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3OClcbitcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fS0VZX1JFRlJFU0hcdFx0U01DX1JNSV9DQUxMKDB4MDE3YSlcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TRVRfUFVCS0VZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3YilcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVE9QXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3YylcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdkKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdlKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0ZPTERcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdmKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9WREVWX0FCT1JUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4NSlcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9DT01NVU5JQ0FURVx0XHRTTUNfUk1JX0NBTEwoMHgwMTg2KVxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODcpXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODgpXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfR0VUX1NUQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4OSlcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9VTkxPQ0tcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMThhKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1MyQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMThiKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9JTlRFUkZBQ0VfUkVQT1JUXHRTTUNfUk1JX0NBTEwoMHgwMWQwKVxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9NRUFTVVJFTUVOVFNcdFx0U01DX1JNSV9DQUxMKDB4MDFkMSlcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9MT0NLXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkMilcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9TVEFSVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZDMpXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfUDJQX0JJTkRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWQ0KVxuKyNkZWZpbmUgU01DX1JNSV9WREVWX1AyUF9VTkJJTkRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWQ1KVxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9FVkVOVF9IQU5ETEVcdFx0U01DX1JNSV9DQUxMKDB4MDFkNilcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfQUNUSVZBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWQ3KVxuKyNkZWZpbmUgU01DX1JNSV9QU01NVV9ERUFDVElWQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZDgpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX1NUX0wyX0NSRUFURVx0XHRTTUNfUk1JX0NBTEwoMHgwMWRiKVxuKyNkZWZpbmUgU01DX1JNSV9QU01NVV9TVF9MMl9ERVNUUk9ZXHRcdFNNQ19STUlfQ0FMTCgweDAxZGMpXG4rI2RlZmluZSBTTUNfUk1JX0RQVF9MMF9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWRkKVxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDBfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZGUpXG4rI2RlZmluZSBTTUNfUk1JX0RQVF9MMV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWRmKVxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDFfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZTApXG4rI2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfR0VUXHRcdFNNQ19STUlfQ0FMTCgweDAxZTEpXG4rXG4rI2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfU0VUXHRcdFNNQ19STUlfQ0FMTCgweDAxZTMpXG4rI2RlZmluZSBTTUNfUk1JX0NNRU1fQUREX1BERVZcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWU0KVxuKyNkZWZpbmUgU01DX1JNSV9DTUVNX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZTUpXG4rI2RlZmluZSBTTUNfUk1JX0NNRU1fREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZTYpXG4rI2RlZmluZSBTTUNfUk1JX0NNRU1fUE9QVUxBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWU3KVxuKyNkZWZpbmUgU01DX1JNSV9DTUVNX1JFTU9WRV9QREVWXHRcdFNNQ19STUlfQ0FMTCgweDAxZTgpXG4rI2RlZmluZSBTTUNfUk1JX0NNRU1fU1RBUlRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWU5KVxuKyNkZWZpbmUgU01DX1JNSV9DTUVNX1NUT1BcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWVhKVxuKyNkZWZpbmUgU01DX1JNSV9DTUVNX1VOUE9QVUxBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWViKVxuKyNkZWZpbmUgU01DX1JNSV9STU1fQ09ORklHX0dFVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZWMpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfTUVDX1JFRlJFU0hcdFx0U01DX1JNSV9DQUxMKDB4MDFlZClcbisjZGVmaW5lIFNNQ19STUlfUk1NX1NUQVRFX0dFVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZWUpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX0VWRU5UX0NPTlNVTUVcdFx0U01DX1JNSV9DQUxMKDB4MDFmMClcbisjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9SQU5HRV9ERUxFR0FURVx0XHRTTUNfUk1JX0NBTEwoMHgwMWYxKVxuKyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEVcdFNNQ19STUlfQ0FMTCgweDAxZjIpXG4rI2RlZmluZSBTTUNfUk1JX0dQVF9MMV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWYzKVxuKyNkZWZpbmUgU01DX1JNSV9HUFRfTDFfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjQpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX01BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjUpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX1VOTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmNilcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9NQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWY3KVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1VOTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmOClcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FSQ0hfREVWX01BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWY5KVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVJDSF9ERVZfVU5NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmYSlcbisjZGVmaW5lIFNNQ19STUlfUlRUX1VOUFJPVF9NQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZiKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmMpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfUFJPVF9NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmZClcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmUpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX01BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZmKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1VOUFJPVF9VTk1BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAwKVxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9URVJNSU5BVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAxKVxuKyNkZWZpbmUgU01DX1JNSV9STU1fQUNUSVZBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAyKVxuKyNkZWZpbmUgU01DX1JNSV9PUF9DT05USU5VRVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMDMpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTk5FQ1RcdFx0U01DX1JNSV9DQUxMKDB4MDIwNClcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fRElTQ09OTkVDVFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA1KVxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9DT01QTEVURVx0XHRTTUNfUk1JX0NBTEwoMHgwMjA2KVxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUFVSR0VcdFx0U01DX1JNSV9DQUxMKDB4MDIwNylcbisjZGVmaW5lIFNNQ19STUlfT1BfTUVNX0RPTkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMDgpXG4rI2RlZmluZSBTTUNfUk1JX09QX01FTV9SRUNMQUlNXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwOSlcbisjZGVmaW5lIFNNQ19STUlfT1BfQ0FOQ0VMXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwYSlcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfRkVBVFVSRVNcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBiKVxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9DTURfR0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwYylcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0NPTVBMRVRFXHRcdFNNQ19STUlfQ0FMTCgweDAyMGQpXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX0lORk9cdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBlKVxuK1xuKyNkZWZpbmUgUk1JX0FCSV9NQUpPUl9WRVJTSU9OXHQyXG4rI2RlZmluZSBSTUlfQUJJX01JTk9SX1ZFUlNJT05cdDBcbitcbisjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IodmVyc2lvbikgKCh2ZXJzaW9uKSBcdTAwM2VcdTAwM2UgMTYpXG4rI2RlZmluZSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHZlcnNpb24pICgodmVyc2lvbikgXHUwMDI2IDB4RkZGRilcbisjZGVmaW5lIFJNSV9BQklfVkVSU0lPTihtYWpvciwgbWlub3IpICAgICAgKCgobWFqb3IpIFx1MDAzY1x1MDAzYyAxNikgfCAobWlub3IpKVxuK1xuKyNkZWZpbmUgUk1JX1JFVFVSTl9TVEFUVVNfTUFTS1x0XHQoMHhGRlVMKVxuKyNkZWZpbmUgUk1JX1JFVFVSTl9JTkRFWF9NQVNLXHRcdCgweEZGVUwgXHUwMDNjXHUwMDNjIDgpXG4rI2RlZmluZSBSTUlfUkVUVVJOX01FTVJFUV9NQVNLXHRcdCgweDNVTCBcdTAwM2NcdTAwM2MgOClcbisjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLXHQoMHgxVUwgXHUwMDNjXHUwMDNjIDEwKVxuK1xuKyNkZWZpbmUgUk1JX1JFVFVSTl9TVEFUVVMocmV0KVx0XHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9TVEFUVVNfTUFTSywgcmV0KVxuKyNkZWZpbmUgUk1JX1JFVFVSTl9JTkRFWChyZXQpXHRcdEZJRUxEX0dFVChSTUlfUkVUVVJOX0lOREVYX01BU0ssIHJldClcbisjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRKHJldClcdFx0RklFTERfR0VUKFJNSV9SRVRVUk5fTUVNUkVRX01BU0ssIHJldClcbisjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZXQpXHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMX01BU0ssIHJldClcbitcbisjZGVmaW5lIFJNSV9TVUNDRVNTXHRcdFx0MFxuKyNkZWZpbmUgUk1JX0VSUk9SX0lOUFVUXHRcdFx0MVxuKyNkZWZpbmUgUk1JX0VSUk9SX1JFQUxNXHRcdFx0MlxuKyNkZWZpbmUgUk1JX0VSUk9SX1JFQ1x0XHRcdDNcbisjZGVmaW5lIFJNSV9FUlJPUl9SVFRcdFx0XHQ0XG4rI2RlZmluZSBSTUlfRVJST1JfTk9UX1NVUFBPUlRFRFx0XHQ1XG4rI2RlZmluZSBSTUlfRVJST1JfREVWSUNFXHRcdDZcbisjZGVmaW5lIFJNSV9FUlJPUl9SVFRfQVVYXHRcdDdcbisjZGVmaW5lIFJNSV9FUlJPUl9QU01NVV9TVFx0XHQ4XG4rI2RlZmluZSBSTUlfRVJST1JfRFBUXHRcdFx0OVxuKyNkZWZpbmUgUk1JX0JVU1lcdFx0XHQxMFxuKyNkZWZpbmUgUk1JX0VSUk9SX0dMT0JBTFx0XHQxMVxuKyNkZWZpbmUgUk1JX0VSUk9SX1RSQUNLSU5HXHRcdDEyXG4rI2RlZmluZSBSTUlfSU5DT01QTEVURVx0XHRcdDEzXG4rI2RlZmluZSBSTUlfQkxPQ0tFRFx0XHRcdDE0XG4rI2RlZmluZSBSTUlfRVJST1JfR1BUXHRcdFx0MTVcbisjZGVmaW5lIFJNSV9FUlJPUl9HUkFOVUxFXHRcdDE2XG4rXG4rI2RlZmluZSBSTUlfQ09OVElOVUVfS0VFUF9HT0lOR1x0XHQwXG4rI2RlZmluZSBSTUlfQ09OVElOVUVfU1RPUFx0XHQxXG4rXG4rI2RlZmluZSBSTUlfT1BfTUVNX1JFUV9OT05FXHRcdDBcbisjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX0RPTkFURVx0XHQxXG4rI2RlZmluZSBSTUlfT1BfTUVNX1JFUV9SRUNMQUlNXHRcdDJcbitcbisjZGVmaW5lIFJNSV9ET05BVEVfU0laRV9NQVNLXHRcdDNVTFxuKyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVF9NQVNLXHRcdEdFTk1BU0soMTUsIDIpXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJR19NQVNLXHRcdEJJVCgxNilcbisjZGVmaW5lIFJNSV9ET05BVEVfU1RBVEVfTUFTS1x0XHRCSVQoMTcpXG4rXG4rI2RlZmluZSBSTUlfRE9OQVRFX1NJWkUocmVxKVx0XHRGSUVMRF9HRVQoUk1JX0RPTkFURV9TSVpFX01BU0ssIHJlcSlcbisjZGVmaW5lIFJNSV9ET05BVEVfQ09VTlQocmVxKVx0XHRGSUVMRF9HRVQoUk1JX0RPTkFURV9DT1VOVF9NQVNLLCByZXEpXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJRyhyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPTlRJR19NQVNLLCByZXEpXG4rI2RlZmluZSBSTUlfRE9OQVRFX1NUQVRFKHJlcSlcdFx0RklFTERfR0VUKFJNSV9ET05BVEVfU1RBVEVfTUFTSywgcmVxKVxuK1xuKyNkZWZpbmUgUk1JX09QX01FTV9ERUxFR0FURURcdFx0MFxuKyNkZWZpbmUgUk1JX09QX01FTV9VTkRFTEVHQVRFRFx0XHQxXG4rXG4rI2RlZmluZSBSTUlfQUREUl9UWVBFX05PTkVcdFx0MFxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9TSU5HTEVcdFx0MVxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9MSVNUXHRcdDJcbitcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTS1x0R0VOTUFTSygxLCAwKVxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTS1x0R0VOTUFTSyhQQUdFX1NISUZUIC0gMSwgMilcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFJfTUFTS1x0KFBBR0VfTUFTSyBcdTAwMjYgR0VOTUFTSyg1MSwgMCkpXG4rI2RlZmluZSBSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLXHRCSVQoNjMpXG4rXG4rI2RlZmluZSBSTUlfQUREUl9SQU5HRV9TSVpFKGFyKVx0XHQoRklFTERfR0VUKFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTSywgXFxcbitcdFx0XHRcdFx0XHQgICAoYXIpKSlcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0NPVU5UKGFyKVx0KEZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcXFxuK1x0XHRcdFx0XHRcdCAgIChhcikpKVxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQUREUihhcilcdFx0KChhcikgXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSylcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NUQVRFKGFyKVx0KEZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcXFxuK1x0XHRcdFx0XHRcdCAgIChhcikpKVxuK1xuK2VudW0gcm1pX3JpcGFzIHtcbitcdFJNSV9FTVBUWSA9IDAsXG4rXHRSTUlfUkFNID0gMSxcbitcdFJNSV9ERVNUUk9ZRUQgPSAyLFxuK1x0Uk1JX0RFViA9IDMsXG4rfTtcbitcbisjZGVmaW5lIFJNSV9OT19NRUFTVVJFX0NPTlRFTlRcdDBcbisjZGVmaW5lIFJNSV9NRUFTVVJFX0NPTlRFTlRcdDFcbitcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUzJTWlx0XHRHRU5NQVNLKDcsIDApXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX0xQQTJcdFx0QklUKDgpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1NWRVx0XHRCSVQoOSlcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFX1ZMXHRcdEdFTk1BU0soMTMsIDEwKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9OVU1fQlBTXHRcdEdFTk1BU0soMTksIDE0KVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9OVU1fV1BTXHRcdEdFTk1BU0soMjUsIDIwKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVcdFx0QklUKDI2KVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVfTlVNX0NUUlNcdEdFTk1BU0soMzEsIDI3KVxuK1xuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl80S0JcdEJJVCgwKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl8xNktCXHRCSVQoMSlcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNjRLQlx0QklUKDIpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzI1Nlx0QklUKDMpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzM4NFx0QklUKDQpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzUxMlx0QklUKDUpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX01BWF9SRUNTX09SREVSXHRHRU5NQVNLKDksIDYpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1pcdFx0R0VOTUFTSygxMywgMTApXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1BQU1x0XHRHRU5NQVNLKDE2LCAxNClcbitcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfREFcdFx0QklUKDApXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0RBX0NPSFx0XHRCSVQoMSlcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVlNNTVVcdFx0QklUKDIpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0FUU1x0XHRCSVQoMylcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfTUFYX1ZERVZTX09SREVSXHRHRU5NQVNLKDcsIDQpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1ZERVZfS1JPVVx0QklUKDgpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX05PTl9URUVfU1RSRUFNXHRCSVQoOSlcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfUDJQXHRcdEJJVCgxMClcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQ01FTV9DWExcdFx0QklUKDExKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9NQVhfQ01FTVx0XHRHRU5NQVNLKDE5LCAxMilcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQ01FTV9UU0VfUkVRXHRCSVQoMjApXG4rXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX01BWF9OVU1fQVVYX1BMQU5FU1x0R0VOTUFTSygzLCAwKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19SVFRfUExBTkVcdFx0R0VOTUFTSyg1LCA0KVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19SVFRfUzJBUF9JTkRJUkVDVFx0QklUKDYpXG4rXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl80X01FQ19DT1VOVFx0XHRHRU5NQVNLKDYzLCAwKVxuK1xuKyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUxcdFx0MFxuKyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9ERVZfTkNPSFx0XHQxXG4rI2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0RFVl9DT0hcdFx0MlxuK1xuKyNkZWZpbmUgUk1JX1RSQUNLSU5HX1JFU0VSVkVEXHRcdFx0MFxuKyNkZWZpbmUgUk1JX1RSQUNLSU5HX05PTkVcdFx0XHQxXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfRklORVx0XHRcdDJcbisjZGVmaW5lIFJNSV9UUkFDS0lOR19DT0FSU0VcdFx0XHQzXG4rXG4rI2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzRLQlx0MFxuKyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV8xNktCXHQxXG4rI2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzY0S0JcdDJcbitcbisvKlxuKyAqIE5vdGUgbWFueSBvZiB0aGVzZSBmaWVsZHMgYXJlIHNtYWxsZXIgdGhhbiB1NjQgYnV0IGFsbCBmaWVsZHMgaGF2ZSB1NjRcbisgKiBhbGlnbm1lbnQsIHNvIHVzZSB1NjQgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50LlxuKyAqL1xuK3N0cnVjdCBybW1fY29uZmlnIHtcbitcdHVuaW9uIHsgLyogMHgwICovXG4rXHRcdHN0cnVjdCB7XG4rXHRcdFx0dTY0IHRyYWNraW5nX3JlZ2lvbl9zaXplO1xuK1x0XHRcdHU2NCBybWlfZ3JhbnVsZV9zaXplO1xuK1x0XHR9O1xuK1x0XHR1OCBzaXplcltTWl80S107XG4rXHR9O1xuK307XG4rXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJtbV9jb25maWcpID09IFNaXzRLKTtcbitcbisjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0xQQTJcdFx0QklUKDApXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19TVkVcdFx0QklUKDEpXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19QTVVcdFx0QklUKDIpXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19EQVx0XHRcdEJJVCgzKVxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfTEZBX1BPTElDWVx0XHRHRU5NQVNLKDYsIDUpXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19NRUNfUE9MSUNZXHRcdEdFTk1BU0soOCwgNylcbitcbisjZGVmaW5lIFJNSV9IQVNIX1NIQV8yNTZcdFx0XHQwXG4rI2RlZmluZSBSTUlfSEFTSF9TSEFfNTEyXHRcdFx0MVxuKyNkZWZpbmUgUk1JX0hBU0hfU0hBXzM4NFx0XHRcdDJcbitcbitzdHJ1Y3QgcmVhbG1fcGFyYW1zIHtcbitcdHVuaW9uIHsgLyogMHgwICovXG4rXHRcdHN0cnVjdCB7XG4rXHRcdFx0dTY0IGZsYWdzMDtcbitcdFx0XHR1NjQgczJzejtcbitcdFx0XHR1NjQgc3ZlX3ZsO1xuK1x0XHRcdHU2NCBudW1fYnBzO1xuK1x0XHRcdHU2NCBudW1fd3BzO1xuK1x0XHRcdHU2NCBwbXVfbnVtX2N0cnM7XG4rXHRcdFx0dTY0IGhhc2hfYWxnbztcbitcdFx0XHR1NjQgbnVtX2F1eF9wbGFuZXM7XG4rXHRcdH07XG4rXHRcdHU4IHBhZGRpbmcwWzB4NDAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4NDAwICovXG4rXHRcdHN0cnVjdCB7XG4rXHRcdFx0dTggcnB2WzY0XTtcbitcdFx0XHR1NjQgYXRzX3BsYW5lO1xuK1x0XHR9O1xuK1x0XHR1OCBwYWRkaW5nMVsweDQwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDgwMCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHU2NCBwYWRkaW5nO1xuK1x0XHRcdHU2NCBydHRfYmFzZTtcbitcdFx0XHRzNjQgcnR0X2xldmVsX3N0YXJ0O1xuK1x0XHRcdHU2NCBydHRfbnVtX3N0YXJ0O1xuK1x0XHRcdHU2NCBmbGFnczE7XG4rXHRcdFx0dTY0IGF1eF9ydHRfYmFzZVszXTtcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzJbMHg4MDBdO1xuK1x0fTtcbit9O1xuK1xuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWFsbV9wYXJhbXMpID09IFNaXzRLKTtcbitcbisvKlxuKyAqIFRoZSBudW1iZXIgb2YgR1BScyAoc3RhcnRpbmcgZnJvbSBYMCkgdGhhdCBhcmVcbisgKiBjb25maWd1cmVkIGJ5IHRoZSBob3N0IHdoZW4gYSBSRUMgaXMgY3JlYXRlZC5cbisgKi9cbisjZGVmaW5lIFJFQ19DUkVBVEVfTlJfR1BSU1x0XHQ4XG4rXG4rI2RlZmluZSBSRUNfUEFSQU1TX0ZMQUdfUlVOTkFCTEVcdEJJVF9VTEwoMClcbitcbitzdHJ1Y3QgcmVjX3BhcmFtcyB7XG4rXHR1bmlvbiB7IC8qIDB4MCAqL1xuK1x0XHR1NjQgZmxhZ3M7XG4rXHRcdHU4IHBhZGRpbmcwWzB4MTAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4MTAwICovXG4rXHRcdHU2NCBtcGlkcjtcbitcdFx0dTggcGFkZGluZzFbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHgyMDAgKi9cbitcdFx0dTY0IHBjO1xuK1x0XHR1OCBwYWRkaW5nMlsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDMwMCAqL1xuK1x0XHR1NjQgZ3Byc1tSRUNfQ1JFQVRFX05SX0dQUlNdO1xuK1x0XHR1OCBwYWRkaW5nM1sweGQwMF07XG4rXHR9O1xuK307XG4rXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19wYXJhbXMpID09IFNaXzRLKTtcbitcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0VNVUxBVEVEX01NSU9cdEJJVCgwKVxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfSU5KRUNUX1NFQVx0QklUKDEpXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGSVx0XHRCSVQoMilcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1RSQVBfV0ZFXHRcdEJJVCgzKVxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfUklQQVNfUkVTUE9OU0VcdEJJVCg0KVxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfUzJBUF9SRVNQT05TRVx0QklUKDUpXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19ERVZfTUVNX1JFU1BPTlNFXHRCSVQoNilcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0ZPUkNFX1AwXHRcdEJJVCg3KVxuK1xuKyNkZWZpbmUgUkVDX1JVTl9HUFJTXHRcdFx0MzFcbisjZGVmaW5lIFJFQ19NQVhfR0lDX05VTV9MUlNcdFx0MTZcbitcbisjZGVmaW5lIFJNSV9QRVJNSVRURURfR0lDVjNfSENSX0JJVFNcdChJQ0hfSENSX0VMMl9VSUUgfFx0XHRcXFxuK1x0XHRcdFx0XHQgSUNIX0hDUl9FTDJfTFJFTlBJRSB8XHRcdFxcXG4rXHRcdFx0XHRcdCBJQ0hfSENSX0VMMl9OUElFIHxcdFx0XFxcbitcdFx0XHRcdFx0IElDSF9IQ1JfRUwyX1ZHcnAwRUlFIHxcdFx0XFxcbitcdFx0XHRcdFx0IElDSF9IQ1JfRUwyX1ZHcnAwRElFIHxcdFx0XFxcbitcdFx0XHRcdFx0IElDSF9IQ1JfRUwyX1ZHcnAxRUlFIHxcdFx0XFxcbitcdFx0XHRcdFx0IElDSF9IQ1JfRUwyX1ZHcnAxRElFIHxcdFx0XFxcbitcdFx0XHRcdFx0IElDSF9IQ1JfRUwyX1RESVIpXG4rXG4rc3RydWN0IHJlY19lbnRlciB7XG4rXHR1bmlvbiB7IC8qIDB4MDAwICovXG4rXHRcdHU2NCBmbGFncztcbitcdFx0dTggcGFkZGluZzBbMHgyMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHgyMDAgKi9cbitcdFx0dTY0IGdwcnNbUkVDX1JVTl9HUFJTXTtcbitcdFx0dTggcGFkZGluZzFbMHgxMDBdO1xuK1x0fTtcbitcdHU4IHBhZGRpbmczWzB4NTAwXTtcbit9O1xuK1xuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfZW50ZXIpID09IFNaXzJLKTtcbitcbisjZGVmaW5lIFJNSV9FWElUX1NZTkNcdFx0XHQweDAwXG4rI2RlZmluZSBSTUlfRVhJVF9JUlFcdFx0XHQweDAxXG4rI2RlZmluZSBSTUlfRVhJVF9GSVFcdFx0XHQweDAyXG4rI2RlZmluZSBSTUlfRVhJVF9QU0NJXHRcdFx0MHgwM1xuKyNkZWZpbmUgUk1JX0VYSVRfUklQQVNfQ0hBTkdFXHRcdDB4MDRcbisjZGVmaW5lIFJNSV9FWElUX0hPU1RfQ0FMTFx0XHQweDA1XG4rI2RlZmluZSBSTUlfRVhJVF9TRVJST1JcdFx0XHQweDA2XG4rI2RlZmluZSBSTUlfRVhJVF9TMkFQX0NIQU5HRVx0XHQweDA3XG4rI2RlZmluZSBSTUlfRVhJVF9WREVWX1ZBTElEQVRFX01BUFBJTkdcdDB4MDhcbisjZGVmaW5lIFJNSV9FWElUX1ZTTU1VX0NPTU1BTkRcdFx0MHgwYVxuKyNkZWZpbmUgUk1JX0VYSVRfVkRFVl9QMlBfQklORElOR1x0MHgwYlxuK1xuK3N0cnVjdCByZWNfZXhpdCB7XG4rXHR1bmlvbiB7IC8qIDB4MDAwICovXG4rXHRcdHU4IGV4aXRfcmVhc29uO1xuK1x0XHR1OCBwYWRkaW5nMFsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDEwMCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHU2NCBlc3I7XG4rXHRcdFx0dTY0IGZhcjtcbitcdFx0XHR1NjQgaHBmYXI7XG4rXHRcdFx0dTY0IHJ0dF90cmVlO1xuK1x0XHR9O1xuK1x0XHR1OCBwYWRkaW5nMVsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDIwMCAqL1xuK1x0XHR1NjQgZ3Byc1tSRUNfUlVOX0dQUlNdO1xuK1x0XHR1OCBwYWRkaW5nMlsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDMwMCAqL1xuK1x0XHR1OCBwYWRkaW5nM1sweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDQwMCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHU2NCBjbnRwX2N0bDtcbitcdFx0XHR1NjQgY250cF9jdmFsO1xuK1x0XHRcdHU2NCBjbnR2X2N0bDtcbitcdFx0XHR1NjQgY250dl9jdmFsO1xuK1x0XHR9O1xuK1x0XHR1OCBwYWRkaW5nNFsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDUwMCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHU2NCByaXBhc19iYXNlO1xuK1x0XHRcdHU2NCByaXBhc190b3A7XG4rXHRcdFx0dTggcmlwYXNfdmFsdWU7XG4rXHRcdFx0dTggcGFkZGluZzhbMTVdO1xuK1x0XHRcdHU2NCBzMmFwX2Jhc2U7XG4rXHRcdFx0dTY0IHMyYXBfdG9wO1xuK1x0XHRcdHU2NCB2ZGV2X2lkXzE7XG4rXHRcdFx0dTY0IHZkZXZfaWRfMjtcbitcdFx0XHR1NjQgZGV2X21lbV9iYXNlO1xuK1x0XHRcdHU2NCBkZXZfbWVtX3RvcDtcbitcdFx0XHR1NjQgZGV2X21lbV9wYTtcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzVbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHg2MDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1MTYgaW1tO1xuK1x0XHRcdHUxNiBwYWRkaW5nOTtcbitcdFx0XHR1NjQgcGxhbmU7XG4rXHRcdH07XG4rXHRcdHU4IHBhZGRpbmc2WzB4MTAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4NzAwICovXG4rXHRcdHN0cnVjdCB7XG4rXHRcdFx0dTggcG11X292Zl9zdGF0dXM7XG4rXHRcdFx0dTggcGFkZGluZzEwWzE1XTtcbitcdFx0XHR1NjQgdnNtbXU7XG4rXHRcdH07XG4rXHRcdHU4IHBhZGRpbmc3WzB4MTAwXTtcbitcdH07XG4rfTtcbitcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2V4aXQpID09IFNaXzJLKTtcbitcbitzdHJ1Y3QgcmVjX3J1biB7XG4rXHRzdHJ1Y3QgcmVjX2VudGVyIGVudGVyO1xuK1x0c3RydWN0IHJlY19leGl0IGV4aXQ7XG4rfTtcbitcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3J1bikgPT0gU1pfNEspO1xuK1xuKy8qIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHUyBkZWZpbml0aW9ucyAqL1xuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX09BRERSX1RZUEVcdEdFTk1BU0soMSwgMClcbisjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UXHRHRU5NQVNLKDE1LCAyKVxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX01FTUFUVFJcdEdFTk1BU0soMTgsIDE2KVxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX1MyQVBcdFx0R0VOTUFTSygyMiwgMTkpXG4rXG4rLyogUk1JX1JUVF9EQVRBX01BUF9GTEFHUyBkZWZpbml0aW9ucyAqL1xuKyNkZWZpbmUgUk1JX1JUVF9QUk9UX01BUF9GTEFHU19PQUREUl9UWVBFXHRHRU5NQVNLKDEsIDApXG4rI2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX0xJU1RfQ09VTlRcdEdFTk1BU0soMTUsIDIpXG4rXG4rLyogUzJBUCBEaXJlY3QgRW5jb2RpbmdzLCB1c2VkIGluIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQICovXG4rI2RlZmluZSBSTUlfUzJBUF9ESVJFQ1RfV1JJVEVcdFx0XHRCSVQoMClcbisjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9SRUFEXHRcdFx0QklUKDEpXG4rXG4rI2VuZGlmIC8qIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IXyAqL1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMjE6Mjk6NTUuNDA4MjgzODI1WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTIwNjkyOTYzNzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBSZWFjaGFiaWxpdHkgb2YgUk1NL1JNSSBDb2RlIGluIGEgVmlydHVhbGl6ZWQgRW52aXJvbm1lbnQqKlxuXG5Pa2F5LCBzbyB3ZSd2ZSBnb3QgdGhpcyBwYXRjaCBhZGRpbmcgUmVhbG0gTWFuYWdlbWVudCBNb25pdG9yIChSTU0pIHN1cHBvcnQgZm9yIEFSTTY0LiBJdCBzZWVtcyBwcmV0dHkgc2VsZi1jb250YWluZWQsIGFkZGluZyB0aGUgbmVjZXNzYXJ5IGhlYWRlciBmaWxlcyBhbmQgZHJpdmVyIGNvZGU6IGBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmhgLCBgZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWdgLCBgZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlYCwgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuY2AsIGBpbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oYCwgYW5kIGBpbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaGAuICBJdCBpbnRyb2R1Y2VzIGBDT05GSUdfQVJNX1JNTWAsIHdoaWNoIGlzIGdvb2QsIGFuZCBpdOKAmXMgZGVwZW5kZW50IG9uIGBBUkNIX1NVUFBPUlRTX1JNTWAuIEl0IHByb3ZpZGVzIGhvc3Qtc2lkZSBSTUkgc3VwcG9ydCwgd2hpY2ggaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBLVk0gZm9yIHRoaW5ncyBsaWtlIGRldGVjdGluZyBhIGNvbXBhdGlibGUgUk1NLCBjb25maWd1cmluZyBpdCwgbWFuYWdpbmcgZGVsZWdhdGVkIG1lbW9yeSwgYW5kIGVuYWJsaW5nIFJlYWxtIGd1ZXN0cy5cblxuTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGFzc2VzcyBpdHMgcmVhY2hhYmlsaXR5IHdpdGhpbiBhIHZpcnR1YWxpemVkIHNldHRpbmcsIHBhcnRpY3VsYXJseSBRRU1VLiBUaGUgY29kZSBkb2VzIGEgY2hlY2sgZm9yIFJNRSAoUmVhbG0gTWFuYWdlbWVudCBFeHRlbnNpb24pIHN1cHBvcnQgaW4gdGhlIENQVSB1c2luZyB0aGUgYElEX0FBNjRQRlIwX0VMMWAgcmVnaXN0ZXIuIFRoaXMgaXMga2V5LCBhcyBSTUkgaXMgY29udGluZ2VudCBvbiBSTUUuIElmIFJNRSBpc24ndCBwcmVzZW50LCB0aGUgaW5pdGlhbGl6YXRpb24gZmFpbHMuIFFFTVUgZG9lcyBzdXBwb3J0IFJNRSBlbXVsYXRpb24gaW4gaXRzIGB2aXJ0YCBtYWNoaW5lIHR5cGUsIGJ1dCBpdCBuZWVkcyBzcGVjaWZpYyBzZXR1cCB3aGljaCBwcm9iYWJseSBpbmNsdWRlcyBURi1BIGFuZCBSTU0uXG5cblN5emthbGxlciBpcyBhIGNvbmNlcm4sIGFzIGl0IG9mdGVuIHJ1bnMgd2l0aCBkZWZhdWx0IFFFTVUgQ1BVcywgc3VjaCBhcyBgbWF4YCBvciBgY29ydGV4LWE1N2AuIEkgbmVlZCB0byB2ZXJpZnkgd2hldGhlciB0aGUgZGVmYXVsdCBRRU1VIENQVXMgYXJlIGNvbmZpZ3VyZWQgd2l0aCBSTUUgc3VwcG9ydC4gIFRoZSBjb2RlIGl0c2VsZiwgc3BlY2lmaWNhbGx5IGBhcm02NF9pbml0X3JtaWAsIGlzIGEgYHN1YnN5c19pbml0Y2FsbGAuIEl0IGNoZWNrcyBmb3IgdGhlIGBJRF9BQTY0UEZSMF9FTDFfUk1FX1NISUZUYCBiaXQuIElmIFJNRSBpc24ndCBwcmVzZW50LCB0aGUgaW5pdGlhbGl6YXRpb24gd2lsbCByZXR1cm4gYC1FTlhJT2AuIElmIFJNRSBpcyBwcmVzZW50LCBpdCBkb2VzIFNNQyBjYWxscyB0byBSTU0uIElmIFJNTSBpcyBub3QgcHJlc2VudCwgdGhlIFNNQyBjYWxscyByZXR1cm4gYFNNQ0NDX1JFVF9OT1RfU1VQUE9SVEVEYC4gIFNvIGl0J3MgaGFyZHdhcmUtIGFuZCBmaXJtd2FyZS1kZXBlbmRlbnQuIEhvd2V2ZXIsIHN5emthbGxlciBtaWdodCBiZSBhYmxlIHRvIGZ1enogdGhlIFNNQyBjYWxscyBpZiB0aGVyZSdzIGEgd2F5IHRvIG1vY2sgdGhlbS5cblxuVGhlIHByb2JsZW0gc3RhdGVtZW50IG1lbnRpb25zIHVucmVhY2hhYmxlIGNvZGUgcGF0aHMgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsIGV2ZW4gd2l0aCBlbXVsYXRlZCBoYXJkd2FyZS4gU28gdGhlIHF1ZXN0aW9uIGlzOiBpcyBSTUUgc3VwcG9ydGVkIGluIFFFTVU/IFllcywgUUVNVSBoYXMgUk1FIGVtdWxhdGlvbi4gVGhlIHBhdGNoIGl0c2VsZiBqdXN0IGFkZHMgdGhlIFJNSSBsaWJyYXJ5IGZ1bmN0aW9ucyBhbmQgdGhlIGluaXRpYWxpemF0aW9uLiBUaGVyZSBhcmUgbm8gc3lzY2FsbHMgb3IgaW9jdGxzIGV4cG9zZWQgZGlyZWN0bHkgdG8gdXNlci1zcGFjZSBpbiAqdGhpcyogcGF0Y2guIFRoZXNlIGFyZSBleHBvcnRlZCB1c2luZyBgRVhQT1JUX1NZTUJPTF9HUExgIChlLmcuLCBgcm1pX2RlbGVnYXRlX3JhbmdlYCwgYHJtaV91bmRlbGVnYXRlX3JhbmdlYCwgZXRjLikuXG5cblRoZXNlIGZ1bmN0aW9ucyBhcmUgcmVhbGx5IG1lYW50IGZvciBLVk0uIFRoZSBwYXRjaCBkZXNjcmlwdGlvbiBjb25maXJtcyB0aGlzOiBcIlRoaXMgb3B0aW9uIGJ1aWxkcyB0aGUgaG9zdC1zaWRlIFJNSSBzdXBwb3J0IHVzZWQgYnkgS1ZNLi4uXCIuIENydWNpYWxseSwgdGhlICpLVk0qIHN1cHBvcnQgaXRzZWxmIGlzbid0ICppbiogdGhpcyBwYXRjaC4gVGhlIHBhdGNoIG9ubHkgKmFkZHMqIHRoZSBidWlsZGluZyBibG9ja3MgZm9yIEtWTSB0byB1c2UgbGF0ZXIuIFNvIHdpdGhvdXQgS1ZNIHVzaW5nIHRoZW0sIHRoZXNlIGV4cG9ydGVkIGZ1bmN0aW9ucyBhcmUgZGVhZCBjb2RlLiBHaXZlbiB0aGF0IHRoZSBjaGFuZ2VzIGFyZSBBTFJFQURZIGNvbW1pdHRlZCBhcyBIRUFELCBJIHNob3VsZCBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgZm9sbG93LXVwIHBhdGNoIHRoYXQgYWRkcyB0aGUgS1ZNIGNvZGUuIEkgbXVzdCBzZWFyY2ggZm9yIHdoZXJlIEtWTSB1c2VzIHRoZXNlIGZ1bmN0aW9ucyBpbiB0aGUgY3VycmVudCB0cmVlLiBUaGUgcHJvbXB0IHNheXMgdGhlIGNvZGUgaXMgYWxyZWFkeSBpbiBIRUFELCBzbyBsZXQgbWUgc2VhcmNoIGZvciBgcm1pX2RlbGVnYXRlX3JhbmdlYCBvciBgcm1pX3Nyb19leGVjdXRlYCBpbiB0aGUgdHJlZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjU4MjcsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5MDYsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQyMTozMDowNy40Nzc1ODQwNjdaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzQyNjA1NzU5NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJybWlfZGVsZWdhdGVfcmFuZ2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jPTI4PUVYUE9SVF9TWU1CT0xfR1BMKHJtaV9mZWF0X3JlZyk7XFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTI5LVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYzozMDppbnQgcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTMxLVxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsXFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtNTItfVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYzo1MzpFWFBPUlRfU1lNQk9MX0dQTChybWlfZGVsZWdhdGVfcmFuZ2UpO1xcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy01NC1cXG4tLVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYz0xNjY9c3RhdGljIGludCBybWlfc3JvX2RvbmF0ZV9jb250aWcoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyxcXG4tLVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy0yMDgtXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjIwOTpcXHRcXHRpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIHNpemUsIFxcdTAwMjZkZWxlZ2F0ZWRfcGh5cykpIHtcXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtMjEwLVxcdFxcdFxcdGlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSlcXG4tLVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYz0yNDk9c3RhdGljIGludCBybWlfc3JvX2RvbmF0ZV9ub25jb250aWcoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyxcXG4tLVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy0yOTMtXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjI5NDpcXHRcXHRcXHRpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIHVuaXRfc2l6ZV9ieXRlcyxcXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtMjk1LVxcdFxcdFxcdFxcdFxcdCAgICAgICBcXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oPTMwPXVuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaWQpO1xcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmgtMzEtXFxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaDozMjppbnQgcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcXG5pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oLTMzLVxcdFxcdCAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpO1xcbi0tXFxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaD0zNz1zdGF0aWMgaW5saW5lIGludCBybWlfZGVsZWdhdGVfcGFnZShwaHlzX2FkZHJfdCBwaHlzKVxcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmgtMzgte1xcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmg6Mzk6XFx0cmV0dXJuIHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCBQQUdFX1NJWkUsIE5VTEwpO1xcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmgtNDAtfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQyMTozMDoxMC45MDM2NTI4MTFaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMDM3MzA3OTUxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkludmVzdGlnYXRpbmcgUk1JIEZ1bmN0aW9uIFVzYWdlKipcblxuT2theSwgc28gS1ZNIGlzbid0IGFjdGl2ZWx5IHVzaW5nIHRoaXMgcGFydGljdWxhciBmdW5jdGlvbi4gVGhhdCdzIGdvb2QgdG8ga25vdywgYnV0IGRvZXNuJ3QgcnVsZSBvdXQgaXRzIG92ZXJhbGwgc2lnbmlmaWNhbmNlLiBJIHNob3VsZCBicm9hZGVuIHRoZSBzZWFyY2guIEkgbmVlZCB0byBtYWtlIHN1cmUgSSdtIG5vdCBtaXNzaW5nIHNvbWV0aGluZyBzdWJ0bHkgY29ubmVjdGVkLiBMZXQncyBzZWUgaWYgS1ZNIG1pZ2h0IGJlIGluZGlyZWN0bHkgbGV2ZXJhZ2luZyBhbnkgb2YgdGhlc2UgYHJtaV9gIGZ1bmN0aW9ucy4gUGVyaGFwcyBzb21ldGhpbmcgbGlrZSBgcm1pX3JlYWxtX2NyZWF0ZWAgb3IgYSByZWxhdGVkIGZ1bmN0aW9uIGNvdWxkIGJlIHRoZSBrZXkuIEkgbmVlZCB0byBlbnN1cmUgYSBjb21wcmVoZW5zaXZlIG92ZXJ2aWV3IG9mIGhvdyBpdCBpcyB1c2VkLCBvciBub3QgdXNlZC4gSSBuZWVkIHRvIGRvIGEgdGhvcm91Z2ggY2hlY2sgb2YgdGhlIGNvZGUgYmFzZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjgyMTcsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQyMTozMDoxMy45NDA5NjM2NjJaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjUyMTk0OTA0OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJybWlfcmVhbG1fY3JlYXRlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaD0xMzY9c3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX2FjdGl2YXRlKHVuc2lnbmVkIGxvbmcgcmQpXFxuLS1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMTQ1LS8qKlxcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaDoxNDY6ICogcm1pX3JlYWxtX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgcmVhbG1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMTQ3LSAqIEByZDogUEEgb2YgdGhlIFJEXFxuLS1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMTU0LSAqL1xcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaDoxNTU6c3RhdGljIGlubGluZSBpbnQgcm1pX3JlYWxtX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHBhcmFtcyxcXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMTU2LVxcdFxcdFxcdFxcdCAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDIxOjMwOjE2LjQ2MjkxOTdaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNjAxNDU0NTAxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93biwgZ2l2ZW4gbXkgZXhwZXJ0aXNlOlxuXG4qKktWTSBJbnRlZ3JhdGlvbiBDb25jZXJucyoqXG5cblJpZ2h0LCBzbyBJIHNlZSB0aGlzIHBhdGNoLCBhbmQgaXQgbG9va3MgbGlrZSBpdCdzIGludHJvZHVjaW5nIHRoZSBSZW1vdGUgTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgbGlicmFyeSBhbmQgaXRzIGluaXRpYWxpemF0aW9uLCBidXQgaXQncyBub3QgaW1tZWRpYXRlbHkgY2xlYXIgaG93IEtWTSBpcyBsZXZlcmFnaW5nIGl0IGluIHRoZSBjdXJyZW50IHNvdXJjZSB0cmVlLiBUaGF0J3MgYSBiaXQgb2YgYSByZWQgZmxhZzsgeW91IGRvbid0IHdhbnQgdG8ganVzdCBhZGQgY29kZSB0aGF0J3Mgbm90IGFjdGl2ZWx5IGJlaW5nIHVzZWQsIGl0IGFkZHMgdG8gdGhlIGNvZGViYXNlIGJsb2F0IGFuZCBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzIGlmIGl0J3Mgbm90IGJlaW5nIHVzZWQuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBcIk9rYXksIGlzIHRoaXMgcHJlbWF0dXJlIG9wdGltaXphdGlvbiwgb3IgaXMgdGhlcmUgYSBwbGFuIGluIHBsYWNlP1wiXG5cblRoZSBuZXh0IGxvZ2ljYWwgc3RlcCBpcyB0byBkaXZlIGluIGFuZCBsb29rIGZvciBjYWxsZXJzIG9mIGBybWlfc3JvX2V4ZWN1dGVgLiBUaGF0J3Mgd2hlcmUgSSBuZWVkIHRvIHN0YXJ0IGRpZ2dpbmcgdG8gc2VlICp3aHkqIHRoaXMgaGFzIGJlZW4gYWRkZWQuIEFyZSB0aGVyZSBleGlzdGluZyBtb2R1bGVzLCBkcml2ZXJzLCBvciBoeXBlcnZpc29yIGNvbXBvbmVudHMgYWxyZWFkeSBzbGF0ZWQgdG8gdXNlIGl0IGluIGZ1dHVyZSBjb21taXRzLCBvciBkb2VzIHRoaXMgcGF0Y2ggcmVwcmVzZW50IGFuIHVuaW50ZWdyYXRlZCBwaWVjZSBvZiB0aGUgcHV6emxlIHRoYXQgbmVlZHMgZnVydGhlciBkZXZlbG9wbWVudD8gVW5kZXJzdGFuZGluZyAqd2hlcmUqIHRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkLCBhbmQgaG93IGl0J3MgYmVpbmcgdXNlZCwgaXMgZ29pbmcgdG8gaW5mb3JtIG15IGFzc2Vzc21lbnQgb2YgdGhlIHBhdGNoJ3MgcHVycG9zZSBhbmQgaXRzIHJlYWRpbmVzcy4gTGV0J3Mgc2VlIGlmIHdlIGNhbiBmaW5kIHNvbWUgdXNhZ2UhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI4NjM3LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMjE6MzA6MjAuMDY0Mzc3NjUxWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI5NzE1NjQ4MzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicm1pX3Nyb19leGVjdXRlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaD0yNT1zdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2RhdGFfbWFwX2luaXQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBkYXRhLFxcbi0tXFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTMyLVxcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaDozMzpcXHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMzQtfVxcbi0tXFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTQ3PXN0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfZGF0YV9tYXAodW5zaWduZWQgbG9uZyByZCxcXG4tLVxcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC01OC1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg6NTk6XFx0cmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtNjAtXFxuLS1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg9ODI9c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9kYXRhX3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsXFxuLS1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtOTUtXFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oOjk2OlxcdHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTk3LVxcbi0tXFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTI2Nz1zdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJ0dCxcXG4tLVxcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC0yNzMtXFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oOjI3NDpcXHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMjc1LX1cXG4tLVxcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaD0yOTE9c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXFxuLS1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMjk5LVxcdH07XFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oOjMwMDpcXHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMzAxLVxcbi0tXFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTMyMj1zdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2ZvbGQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBpcGEsXFxuLS1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMzI3LVxcdH07XFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oOjMyODpcXHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMzI5LVxcbi0tXFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTM0Nz1zdGF0aWMgaW5saW5lIGludCBybWlfcnR0X2luaXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBiYXNlLFxcbi0tXFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTM1Mi1cXHR9O1xcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaDozNTM6XFx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oLTM1NC1cXG4tLVxcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaD0zNzQ9c3RhdGljIGlubGluZSBpbnQgcm1pX3J0dF91bnByb3RfbWFwKHVuc2lnbmVkIGxvbmcgcmQsXFxuLS1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMzgzLVxcdH07XFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oOjM4NDpcXHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtMzg1LVxcbi0tXFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oPTQwNT1zdGF0aWMgaW5saW5lIGludCBybWlfcnR0X3NldF9yaXBhcyh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJlYyxcXG4tLVxcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC00MTEtXFx0fTtcXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg6NDEyOlxcdGludCByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbmFyY2gvYXJtNjQvaW5jbHVkZS9hc20vcm1pX2NtZHMuaC00MTMtXFxuLS1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmg9NDM1PXN0YXRpYyBpbmxpbmUgaW50IHJtaV9ydHRfdW5wcm90X3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsXFxuLS1cXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtNDQ2LVxcdH07XFxuYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ybWlfY21kcy5oOjQ0NzpcXHRpbnQgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG5hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3JtaV9jbWRzLmgtNDQ4LVxcbi0tXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jPTQ3OD1FWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX21lbXhmZXJfZXhlY3V0ZSk7XFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtNDgwLS8qIEZvciBSTUkgY29tbWFuZHMgdGhhdCBhcmUgc3RhdGVmdWwgYnV0IG5vdCBtZW1vcnktdHJhbnNmZXJyaW5nICovXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjQ4MTp1bnNpZ25lZCBsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy00ODIte1xcbi0tXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTUwNy19XFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjUwODpFWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX2V4ZWN1dGUpO1xcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy01MDktXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oPTUwPXZvaWQgcm1pX3Nyb19mcmVlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pO1xcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmg6NTE6dW5zaWduZWQgbG9uZyBybWlfc3JvX2V4ZWN1dGUoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyk7XFxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaC01Mi1cXG4tLVxcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmg9MTY0PXN0YXRpYyBpbmxpbmUgaW50IHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSxcXG4tLVxcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmgtMTcwLVxcdH07XFxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaDoxNzE6XFx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaC0xNzItXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oPTE5MD1zdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSxcXG4tLVxcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmgtMTk2LVxcdH07XFxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaDoxOTc6XFx0aW50IHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaC0xOTgtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDIxOjMwOjIzLjAzNTk1MDU0MloiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjI4MjM2MzgwOTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIHNlZSB3aGF0J3MgZ29pbmcgb24gaGVyZS5cblxuKipLVk0gSW5xdWlyeTogSW5pdGlhbCBDb25mdXNpb24gYW5kIEZvY3VzZWQgSW52ZXN0aWdhdGlvbioqXG5cbkhtbSwgc28gaXQgc2VlbXMgS1ZNIGlzbid0IGFjdGl2ZWx5ICppbiB1c2UqIGp1c3QgeWV0LiBUaGF04oCZcyBhIGJpdCBvZGQuIEJ1dCB3YWl0LCBgYXJtNjRfaW5pdF9ybWlgIGlzIGdldHRpbmcgY2FsbGVkIGR1cmluZyB0aGUgYm9vdCBwcm9jZXNzLiBPa2F5LCB0aGF0IHNwYXJrcyBteSBpbnRlcmVzdC4gVGhpcyBzdWdnZXN0cyBzb21ldGhpbmcgaXMgaGFwcGVuaW5nIHVuZGVyIHRoZSBob29kLiBUaW1lIHRvIGRpZyBpbnRvIGBhcm02NF9pbml0X3JtaWAgYW5kIHVuZGVyc3RhbmQgcHJlY2lzZWx5IHdoYXQgcm9sZSBpdCBwbGF5cy4gTGV0J3Mgc2VlIHdoYXQgd2UgY2FuIGZpbmQuIEknbSBrZWVuIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgaXMgYmVpbmcgaW5pdGlhbGl6ZWQsIGV2ZW4gaWYgS1ZNIGl0c2VsZiBpc24ndCB5ZXQgdmlzaWJseSBhY3RpdmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMwNzAxLCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMjE6MzA6MjUuODU5NTkzMzE2WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTM3MTg3NjU5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImFybTY0X2luaXRfcm1pXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYz02ODc9Ym9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpXFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtNjkxLVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYzo2OTI6c3RhdGljIGludCBfX2luaXQgYXJtNjRfaW5pdF9ybWkodm9pZClcXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtNjkzLXtcXG4tLVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy03MTktLypcXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6NzIwOiAqIE5vdGUgYXJtNjRfaW5pdF9ybWkoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUga3ZtX2luaXRfcm1pKCkgb3RoZXJ3aXNlIEtWTVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy03MjEtICogd2lsbCBub3Qgc3VwcG9ydCByZWFsbSBndWVzdHMuIHN1YnN5c19pbml0Y2FsbCgpIGlzIGNhbGxlZCBiZWZvcmVcXG4tLVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy03MjMtICovXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjcyNDpzdWJzeXNfaW5pdGNhbGwoYXJtNjRfaW5pdF9ybWkpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQyMTozMDoyOC4zOTY4MjI4NzVaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTA5OTkyMjM3MDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqUk1JIEluaXRpYWxpemF0aW9uIGFuZCBSZWFjaGFiaWxpdHkgQW5hbHlzaXMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGBhcm02NF9pbml0X3JtaWAgZnVuY3Rpb24sIGFuZCBpdCdzIHByZXR0eSBzdHJhaWdodGZvcndhcmQ6IGl0IGNhbGxzIGEgc2VyaWVzIG9mIGBybWlfKmAgZnVuY3Rpb25zIGZvciBpbml0aWFsaXphdGlvbiBkdXJpbmcgYm9vdC4gU2VlbXMgbGlrZSB0aGlzIGludm9sdmVzIFNlY3VyZSBNb25pdG9yIENhbGwgKFNNQykgaW50ZXJhY3Rpb25zLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgY2FuIHRoaXMgYmUgZnV6emVkPyBTeXprYWxsZXIgaXMgYSBmYW50YXN0aWMgdG9vbCBmb3IgU01DIGZ1enppbmcsIGJ1dCBpdCB1c3VhbGx5IHJlbGllcyBvbiBlaXRoZXIgaW50ZXJjZXB0aW5nIHRoZSBjYWxscyBvciBmdXp6aW5nIGEgaHlwZXJ2aXNvci4gSGVyZSwgTGludXggKmlzKiB0aGUgaG9zdCwgY2FsbGluZyBpbnRvIHRoZSBSTU0gKFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvciksIHdoaWNoIGlzIGZpcm13YXJlLiBTeXprYWxsZXIgZG9lc24ndCB0eXBpY2FsbHkgdGFyZ2V0IGZpcm13YXJlIGRpcmVjdGx5IHVubGVzcyB0aGVyZSdzIGEgbW9jayBkcml2ZXIgaW4gcGxhY2UuXG5cbkhvd2V2ZXIsIEkgcmVhbGl6ZSB0aGlzIGlzIGVhcmx5IGJvb3QgY29kZS4gSWYgS1ZNIGlzbid0IHVzaW5nIGl0IHlldCAod2hpY2ggSSBzdXNwZWN0IGl0IGlzbid0LCBnaXZlbiB0aGlzIGlzIGEgbmV3IHBhdGNoKSwgdGhlICpvbmx5KiBwbGFjZSB0aGlzIGNvZGUgY2FuIGJlIHJlYWNoZWQgaXMgdGhlIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlLiBBIHF1aWNrIGNoZWNrIG9mIHRoZSBjb2RlIGNvbmZpcm1zIHRoaXM6IGlmIFJNRSBpc24ndCBzdXBwb3J0ZWQsIGl0IHJldHVybnMgYC1FTlhJT2AuIE9uIGEgc3RhbmRhcmQgc3l6a2FsbGVyIFZNLCB0aGlzIGlzIHRoZSBleHBlY3RlZCBvdXRjb21lLCBzaW5jZSBSTUUgaXMgbm90IGVuYWJsZWQgaW4gdGhlIGRlZmF1bHQgUUVNVSBzZXR1cC5cblxuU28gdGhlIHF1ZXN0aW9uIGlzLCBjYW4gd2UgYWN0dWFsbHkgKnJlYWNoKiB0aGUgcmVzdCBvZiB0aGUgY29kZT8gSXQgaGluZ2VzIG9uIHRoZSBDUFUgc3VwcG9ydGluZyBSTUUuIFN5emthbGxlciB1c3VhbGx5IHJ1bnMgd2l0aCBgcWVtdS1zeXN0ZW0tYWFyY2g2NCAtbWFjaGluZSB2aXJ0IC1jcHUgbWF4YC4gRG9lcyBgLWNwdSBtYXhgIGV2ZW4gKmhhdmUqIFJNRSBlbmFibGVkPyBJdCBsb29rcyBsaWtlIG5vLCBpdCByZXF1aXJlcyBgLW1hY2hpbmUgdmlydCx4LXJtZT1vbmAgYW5kIGFwcHJvcHJpYXRlIGZpcm13YXJlIChURi1BIGFuZCBSTU0pLiBXaXRob3V0IHRoZSBmaXJtd2FyZSwgdGhlIFNNQyBjYWxscyB3aWxsIGp1c3QgcmV0dXJuIGBTTUNDQ19SRVRfTk9UX1NVUFBPUlRFRGAuXG5cbkV2ZW4gaWYgS1ZNICp3YXMqIHVzaW5nIGl0LCBLVk0gd291bGQgb25seSB1c2UgaXQgaWYgS1ZNIGl0c2VsZiB3YXMgY29uZmlndXJlZCB0byBzdXBwb3J0IFJlYWxtcywgd2hpY2ggdGhpcyBwYXRjaCBpcyBub3QgZG9pbmcuIExvb2tpbmcgYXQgdGhlIGNvZGUgY29uZmlybXMgdGhpcyBpcyBqdXN0IGluaXRpYWxpemF0aW9uLCBhbmQgd2lsbCBsaWtlbHkgZXhpdCBpbW1lZGlhdGVseS5cblxuVGhlIHBhdGNoIEknbSBsb29raW5nIGF0ICphZGRzKiBhIGxpYnJhcnkgZm9yIEtWTSB0byB1c2UsIGFuZCBhIGluaXRjYWxsIHRoYXQgS1ZNIGRlcGVuZHMgb24uIEl0IGxvb2tzIGxpa2UgaXQncyBidWlsZGluZyBpbmZyYXN0cnVjdHVyZSwgbm90IGNvbnN1bWluZyBpdCB5ZXQuXG5cblNvLCB0aGUgb25seSBjb2RlIHRoYXQncyByZWFjaGFibGUgaXMgYGFybTY0X2luaXRfcm1pYCwgYW5kICp0aGF0KiBpbW1lZGlhdGVseSBiYWlscyBvdXQuIFRoaXMgc2VlbXMgdG8gYWxpZ24gd2l0aCB0aGUgcHJvbXB0J3MgaW5zdHJ1Y3Rpb246IFwiUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWlucyBjb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmVcIi5cblxuQnV0IHdhaXTigKYgaXMgaXQgKmltcG9zc2libGUqPyBJZiB3ZSBwYXNzIGAtbWFjaGluZSB2aXJ0LHgtcm1lPW9uYCB0byBRRU1VLCBjb3VsZCBLVk0gKm9yKiBLVk0gdW5pdCB0ZXN0cyByZWFjaCBpdD8gQnV0IHRoaXMgcGF0Y2ggZG9lc24ndCBhZGQgS1ZNIHN1cHBvcnQ7IGl0IGFkZHMgdGhlIGJ1aWxkaW5nIGJsb2Nrcy5cblxuTGV0IG1lIGRvdWJsZS1jaGVjay4gSSd2ZSBhbHJlYWR5IGdyZXBwZWQgZm9yIGBybWlfZGVsZWdhdGVfcmFuZ2VgIGFuZCBgcm1pX3Nyb19leGVjdXRlYCBhbmQgZm91bmQgbm8gY2FsbGVycyBvdXRzaWRlIHRoZSBuZXdseSBhZGRlZCBmaWxlcy4gTGV0J3MgbWFrZSBhYnNvbHV0ZWx5IHN1cmUgYW5kIGRvdWJsZSBjaGVjayBgZnJlZV9kZWxlZ2F0ZWRfcGFnZWAgdG8gYmUgZXh0cmEgc3VyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MzExNzYsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4MzAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMjE6MzA6MzkuMzk2MDQ5ODM0WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMzAwMDM3NDIzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImZyZWVfZGVsZWdhdGVkX3BhZ2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jPTEyOT1zdGF0aWMgdm9pZCBybWlfb3BfbWVtX3JlY2xhaW0odW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxcbi0tXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTE0MC1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6MTQxOmludCBmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMpXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTE0Mi17XFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtMTUxLX1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6MTUyOkVYUE9SVF9TWU1CT0xfR1BMKGZyZWVfZGVsZWdhdGVkX3BhZ2UpO1xcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy0xNTMtXFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM9MTY2PXN0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtMjM5LVxcdFxcdFxcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRClcXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmM6MjQwOlxcdFxcdFxcdFxcdGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyArIGkpO1xcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYy0yNDEtXFx0XFx0XFx0ZWxzZVxcbi0tXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jPTI0OT1zdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxcbi0tXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jLTM0Ni1cXHRcXHRcXHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jOjM0NzpcXHRcXHRcXHRcXHRmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXMgKyBpKTtcXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMtMzQ4LVxcdFxcdFxcdGVsc2VcXG4tLVxcbmluY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmg9MzQ9aW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7XFxuaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaDozNTppbnQgZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzX2FkZHJfdCBwaHlzKTtcXG5pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oLTM2LVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQyMTozMDo0MS42OTYwOTI0ODdaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTU1MTY0NDg0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiB0aGUgUk1JIENvZGUgZm9yIEZ1enppbmcgUG90ZW50aWFsKipcblxuT2theSwgc28gSSd2ZSBsb29rZWQgdGhyb3VnaCB0aGUgY29kZSwgc3BlY2lmaWNhbGx5IHRoZSBgZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jYCBmaWxlLiBUaGUgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIGNsZWFyOiB0aGVyZSBhcmUgbm8gZW50cnkgcG9pbnRzIGZvciBleHRlcm5hbCBjYWxsZXJzIG91dHNpZGUgb2YgdGhpcyBzcGVjaWZpYyBmaWxlLiBUaGlzIGltbWVkaWF0ZWx5IHN1Z2dlc3RzIHRoYXQgS1ZNIHN1cHBvcnQsIHdoaWNoIGlzIHdoYXQgSSdtIHByaW1hcmlseSBpbnRlcmVzdGVkIGluLCBpcyAqbm90KiBwcmVzZW50IGhlcmUuXG5cbk15IGZvY3VzIG5hcnJvd3MgdG8gdGhlIGBhcm02NF9pbml0X3JtaSgpYCBmdW5jdGlvbi4gSXQncyB0aGUgb25seSBjb2RlIHRoYXQgYXBwZWFycyB0byBleGVjdXRlLiBMZXQncyBzZWUgaWYgdGhpcyBpcyBmdXp6YWJsZS4gSXQncyBjYWxsZWQgb25jZSBhdCBib290LiBJdCBjaGVja3MgaWYgUk1FIGlzIHN1cHBvcnRlZCBieSByZWFkaW5nIGEgQ1BVIHJlZ2lzdGVyLCBhbmQgaWYgbm90IGl0IHJldHVybnMgYW4gZXJyb3IuIElmIFJNRSBpcyBzdXBwb3J0ZWQsIGl0IGNhbGxzIGBTTUNfUk1JX1ZFUlNJT05gLiBJZiB0aGF0IGFsc28gZmFpbHMsIGl0IGdpdmVzIGFuIGVycm9yLiBJZiB0aGF0IHN1Y2NlZWRzIGl0IHJlYWRzIGZlYXR1cmVzLCBjb25maWd1cmVzIFJNTSwgYW5kIGluaXRpYWxpemVzIG1ldGFkYXRhLlxuXG5UaGUgY2hhbGxlbmdlIGhlcmUgaXMgb2J2aW91czogaXQncyBhICpvbmUtdGltZSogYm9vdCBpbml0aWFsaXphdGlvbi4gSXQgZXhwZWN0cyBzcGVjaWZpYyBoYXJkd2FyZSBhbmQgZmlybXdhcmUg4oCTIFJNTS4gU3RhbmRhcmQgU3l6a2FsbGVyIGVudmlyb25tZW50cywgd2hpY2ggaXMgbXkgcHJpbWFyeSBmdXp6aW5nIHRvb2wsIGRvbid0IHR5cGljYWxseSBoYXZlIHRoaXMuIEkgY2FuJ3QgdHJpZ2dlciB0aGlzIGNvZGUgcmVwZWF0ZWRseSBmcm9tIHVzZXItc3BhY2UsIG5vciBkb2VzIGl0IHNlZW0gdG8gZXhwb3NlIGFueSB1c2VyLXNwYWNlIGludGVyZmFjZSwgbGlrZSBhIHN5c2NhbGwsIGlvY3RsLCBvciBzeXNmcyBlbnRyeS4gU3l6a2FsbGVyIHdvcmtzIGJ5IGV4ZWN1dGluZyBzeXNjYWxscywgc28gdGhpcyBwcmVzZW50cyBhIGZ1bmRhbWVudGFsIHByb2JsZW0uXG5cbldhaXQsIGlzIHRoZXJlICphbnkqIGRldmljZSBleHBvc2VkPyBOb3BlLiBBbGwgSSBzZWUgaXMgYGFybTY0X3JtaV9pc19hdmFpbGFibGUgPSB0cnVlYCBiZWluZyBzZXQsIGFsb25nIHdpdGggc29tZSBzeW1ib2wgZXhwb3J0cy4gVGhpcyBpcyBjb21wbGV0ZWx5IHVzZWxlc3MgZm9yIGZ1enppbmcuIFN5emthbGxlciBjYW4ndCB0b3VjaCBhbnkgb2YgdGhpcy4gS1ZNIHN1cHBvcnQgaXMgbWlzc2luZy5cblxuTGV0J3MgZG91YmxlLWNoZWNrIHRoZSBLY29uZmlnLiBUaGUgcGF0Y2ggYWRkcyBgQ09ORklHX0FSTV9STU1gLCB3aGljaCBkZWZhdWx0cyB0byBcInlcIiBhbmQgZGVwZW5kcyBvbiBgQVJDSF9TVVBQT1JUU19STU1gLlxuXG5TaW5jZSBLVk0gaXMgKm5vdCogcHJlc2VudCwgYW5kIEtWTSBpcyB0aGUgaW50ZW5kZWQgY29uc3VtZXIsIGFuZCBLVk0gaXNuJ3QgdXNpbmcgdGhpcyBsaWJyYXJ5IHlldCwgdGhpcyBpcyBwdXJlbHkgZGVhZCBjb2RlLiBJdCdzIGxpYnJhcnkgZnVuY3Rpb25zIGFuZCBhIGJvb3QtdGltZSBjaGVjayB0aGF0J2xsIGZhaWwgaW4gb3VyIHN0YW5kYXJkIGVudmlyb25tZW50cy4gSXQncyBub3Qgd29ydGggdGhlIGVmZm9ydCB0byBmdXp6IGl0LlxuXG5Pa2F5LCBsZXQncyB2ZXJpZnkgaWYgS1ZNIHVzZXMgdGhpcyB0aHJvdWdoIGEgZGlmZmVyZW50IHJvdXRlLiBXYXMgS1ZNIG1lcmdlZCwgYnV0IHRoaXMgcGF0Y2ggd2FzIG1pc3Npbmc/IE5vcGUsIEtWTSdzIFJNRSBzdXBwb3J0IGlzIGEgbGFyZ2Ugc2VyaWVzLCBhbmQgdGhpcyBpcyBvbmUgb2YgdGhlIGZpcnN0IHBhdGNoZXMuXG5cblRoZXJlZm9yZSwgbXkgY29uY2x1c2lvbiBpcyB0aGF0IHRoZSBjb2RlIGlzIG5vdCB3b3J0aCBmdXp6aW5nLiBJJ2xsIHJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgYmVjYXVzZSBLVk0gc3VwcG9ydCBpcyBub3QgeWV0IHByZXNlbnQuIFRoZSBhZGRlZCBSTUkgbGlicmFyeSBmdW5jdGlvbnMgYXJlIHVucmVhY2hhYmxlIGZyb20gdXNlci1zcGFjZSwgYW5kIHRoZSBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gcmVsaWVzIG9uIHNwZWNpZmljIGZpcm13YXJlIChSTU0pIG5vdCBwcmVzZW50IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzMyMzgsIk91dHB1dFRva2VucyI6MTQyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTcwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDIxOjMwOjUxLjI0Nzc0MjMzWiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjU3ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBob3N0LXNpZGUgUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgbGlicmFyeSBmdW5jdGlvbnMgYW5kIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiBmb3IgS1ZNIHRvIHVzZS4gSG93ZXZlciwgS1ZNIHN1cHBvcnQgZm9yIFJlYWxtcyBpcyBub3QgaW5jbHVkZWQgaW4gdGhpcyBwYXRjaCwgbWFraW5nIHRoZSBleHBvcnRlZCBsaWJyYXJ5IGZ1bmN0aW9ucyB1bnJlYWNoYWJsZSBmcm9tIHVzZXItc3BhY2UuIEZ1cnRoZXJtb3JlLCB0aGUgYm9vdC10aW1lIGluaXRpYWxpemF0aW9uIHJlcXVpcmVzIHNwZWNpZmljIGhhcmR3YXJlL2Zpcm13YXJlIChSTU0pIHN1cHBvcnQgdGhhdCBpcyBub3QgcHJlc2VudCBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMsIGFuZCBpdCB3aWxsIHNpbXBseSBiYWlsIG91dCBlYXJseS4gVGhlcmUgYXJlIG5vIHN5c2NhbGxzLCBpb2N0bHMsIG9yIG90aGVyIHVzZXItc3BhY2UgaW50ZXJmYWNlcyBpbnRyb2R1Y2VkIHRoYXQgc3l6a2FsbGVyIGNvdWxkIGZ1enouXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIGhvc3Qtc2lkZSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBsaWJyYXJ5IGZ1bmN0aW9ucyBhbmQgYm9vdC10aW1lIGluaXRpYWxpemF0aW9uIGZvciBLVk0gdG8gdXNlLiBIb3dldmVyLCBLVk0gc3VwcG9ydCBmb3IgUmVhbG1zIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGlzIHBhdGNoLCBtYWtpbmcgdGhlIGV4cG9ydGVkIGxpYnJhcnkgZnVuY3Rpb25zIHVucmVhY2hhYmxlIGZyb20gdXNlci1zcGFjZS4gRnVydGhlcm1vcmUsIHRoZSBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gcmVxdWlyZXMgc3BlY2lmaWMgaGFyZHdhcmUvZmlybXdhcmUgKFJNTSkgc3VwcG9ydCB0aGF0IGlzIG5vdCBwcmVzZW50IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgYW5kIGl0IHdpbGwgc2ltcGx5IGJhaWwgb3V0IGVhcmx5LiBUaGVyZSBhcmUgbm8gc3lzY2FsbHMsIGlvY3Rscywgb3Igb3RoZXIgdXNlci1zcGFjZSBpbnRlcmZhY2VzIGludHJvZHVjZWQgdGhhdCBzeXprYWxsZXIgY291bGQgZnV6ei5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },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-workflowrtdc2[1] Phase: Running StartedAt: 2026-07-15 21:31:03 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrtdc2[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-07-15 21:31:03 +0000 UTC FinishedAt: 2026-07-15 21:32:10 +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,}