Ly8gRmlsZTogYmFzaXN1X3RyYW5zY29kZXJfcHliaW5kMTEuY3BwCi8vIHB5YmluZDExIG5hdGl2ZSBiaW5kaW5ncyBmb3IgdGhlIHRyYW5zY29kZXIncyBwdXJlIEMgQVBJIGJhc2lzdV93YXNtX3RyYW5zY29kZXJfYXBpLmgKCiNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPgojaW5jbHVkZSA8c3RkaW50Lmg+CgojaW5jbHVkZSAiLi4vZW5jb2Rlci9iYXNpc3Vfd2FzbV90cmFuc2NvZGVyX2FwaS5oIgoKbmFtZXNwYWNlIHB5ID0gcHliaW5kMTE7CgovLyB3YXNtX2Jvb2xfdCBpcyB1aW50MzJfdCCXIGNvbnZlcnQgdG8gUHl0aG9uIGJvb2wKc3RhdGljIGlubGluZSBib29sIHRvX2Jvb2wod2FzbV9ib29sX3QgdikgeyByZXR1cm4gdiAhPSAwOyB9CgpQWUJJTkQxMV9NT0RVTEUoYmFzaXN1X3RyYW5zY29kZXJfcHl0aG9uLCBtKSB7CiAgICBtLmRvYygpID0gIk5hdGl2ZSBCYXNpcyBVbml2ZXJzYWwgdHJhbnNjb2RlciAocHliaW5kMTEgYmluZGluZyBvdmVyIGJhc2lzdV93YXNtX3RyYW5zY29kZXJfYXBpKSI7CgogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBIaWdoLWxldmVsIGZ1bmN0aW9ucwogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBtLmRlZigiZ2V0X3ZlcnNpb24iLCAmYnRfZ2V0X3ZlcnNpb24sCiAgICAgICAgICAiR2V0IEJhc2lzVSB0cmFuc2NvZGVyIHZlcnNpb24iKTsKCiAgICBtLmRlZigiZW5hYmxlX2RlYnVnX3ByaW50ZiIsCiAgICAgICAgICBbXShib29sIGZsYWcpIHsgYnRfZW5hYmxlX2RlYnVnX3ByaW50ZihmbGFnID8gMXUgOiAwdSk7IH0sCiAgICAgICAgICAiRW5hYmxlIG9yIGRpc2FibGUgZGVidWcgcHJpbnRmIG91dHB1dCIpOwoKICAgIG0uZGVmKCJpbml0IiwgJmJ0X2luaXQsCiAgICAgICAgICAiSW5pdGlhbGl6ZSB0cmFuc2NvZGVyIGxpYnJhcnkiKTsKCiAgICBtLmRlZigiYWxsb2MiLCAmYnRfYWxsb2MsCiAgICAgICAgICAiQWxsb2NhdGUgYSBidWZmZXIsIHJldHVybnMgdWludDY0IG9mZnNldC9wb2ludGVyIik7CiAgICBtLmRlZigiZnJlZSIsICZidF9mcmVlLAogICAgICAgICAgIkZyZWUgYSBidWZmZXIgYWxsb2NhdGVkIGJ5IGJ0X2FsbG9jIik7CgoKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gYmFzaXNfdGV4X2Zvcm1hdCBoZWxwZXJzCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIG0uZGVmKCJiYXNpc190ZXhfZm9ybWF0X2lzX3h1YXN0Y19sZHIiLAogICAgICAgICAgW10odWludDMyX3QgZm10KSB7IHJldHVybiB0b19ib29sKGJ0X2Jhc2lzX3RleF9mb3JtYXRfaXNfeHVhc3RjX2xkcihmbXQpKTsgfSk7CgogICAgbS5kZWYoImJhc2lzX3RleF9mb3JtYXRfaXNfYXN0Y19sZHIiLAogICAgICAgICAgW10odWludDMyX3QgZm10KSB7IHJldHVybiB0b19ib29sKGJ0X2Jhc2lzX3RleF9mb3JtYXRfaXNfYXN0Y19sZHIoZm10KSk7IH0pOwoKICAgIG0uZGVmKCJiYXNpc190ZXhfZm9ybWF0X2dldF9ibG9ja193aWR0aCIsCiAgICAgICAgICAmYnRfYmFzaXNfdGV4X2Zvcm1hdF9nZXRfYmxvY2tfd2lkdGgpOwoKICAgIG0uZGVmKCJiYXNpc190ZXhfZm9ybWF0X2dldF9ibG9ja19oZWlnaHQiLAogICAgICAgICAgJmJ0X2Jhc2lzX3RleF9mb3JtYXRfZ2V0X2Jsb2NrX2hlaWdodCk7CgogICAgbS5kZWYoImJhc2lzX3RleF9mb3JtYXRfaXNfaGRyIiwKICAgICAgICAgIFtdKHVpbnQzMl90IGZtdCkgeyByZXR1cm4gdG9fYm9vbChidF9iYXNpc190ZXhfZm9ybWF0X2lzX2hkcihmbXQpKTsgfSk7CgogICAgbS5kZWYoImJhc2lzX3RleF9mb3JtYXRfaXNfbGRyIiwKICAgICAgICAgIFtdKHVpbnQzMl90IGZtdCkgeyByZXR1cm4gdG9fYm9vbChidF9iYXNpc190ZXhfZm9ybWF0X2lzX2xkcihmbXQpKTsgfSk7CgoKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdCBoZWxwZXJzCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIG0uZGVmKCJiYXNpc19nZXRfYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsIiwKICAgICAgICAgICZidF9iYXNpc19nZXRfYnl0ZXNfcGVyX2Jsb2NrX29yX3BpeGVsKTsKCiAgICBtLmRlZigiYmFzaXNfdHJhbnNjb2Rlcl9mb3JtYXRfaGFzX2FscGhhIiwKICAgICAgICAgIFtdKHVpbnQzMl90IHRmbXQpIHsgcmV0dXJuIHRvX2Jvb2woYnRfYmFzaXNfdHJhbnNjb2Rlcl9mb3JtYXRfaGFzX2FscGhhKHRmbXQpKTsgfSk7CgogICAgbS5kZWYoImJhc2lzX3RyYW5zY29kZXJfZm9ybWF0X2lzX2hkciIsCiAgICAgICAgICBbXSh1aW50MzJfdCB0Zm10KSB7IHJldHVybiB0b19ib29sKGJ0X2Jhc2lzX3RyYW5zY29kZXJfZm9ybWF0X2lzX2hkcih0Zm10KSk7IH0pOwoKICAgIG0uZGVmKCJiYXNpc190cmFuc2NvZGVyX2Zvcm1hdF9pc19sZHIiLAogICAgICAgICAgW10odWludDMyX3QgdGZtdCkgeyByZXR1cm4gdG9fYm9vbChidF9iYXNpc190cmFuc2NvZGVyX2Zvcm1hdF9pc19sZHIodGZtdCkpOyB9KTsKCiAgICBtLmRlZigiYmFzaXNfdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdF9pc19hc3RjIiwKICAgICAgICAgIFtdKHVpbnQzMl90IHRmbXQpIHsgcmV0dXJuIHRvX2Jvb2woYnRfYmFzaXNfdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdF9pc19hc3RjKHRmbXQpKTsgfSk7CgogICAgbS5kZWYoImJhc2lzX3RyYW5zY29kZXJfZm9ybWF0X2lzX3VuY29tcHJlc3NlZCIsCiAgICAgICAgICBbXSh1aW50MzJfdCB0Zm10KSB7IHJldHVybiB0b19ib29sKGJ0X2Jhc2lzX3RyYW5zY29kZXJfZm9ybWF0X2lzX3VuY29tcHJlc3NlZCh0Zm10KSk7IH0pOwoKICAgIG0uZGVmKCJiYXNpc19nZXRfdW5jb21wcmVzc2VkX2J5dGVzX3Blcl9waXhlbCIsCiAgICAgICAgICAmYnRfYmFzaXNfZ2V0X3VuY29tcHJlc3NlZF9ieXRlc19wZXJfcGl4ZWwpOwoKICAgIG0uZGVmKCJiYXNpc19nZXRfYmxvY2tfd2lkdGgiLAogICAgICAgICAgJmJ0X2Jhc2lzX2dldF9ibG9ja193aWR0aCk7CgogICAgbS5kZWYoImJhc2lzX2dldF9ibG9ja19oZWlnaHQiLAogICAgICAgICAgJmJ0X2Jhc2lzX2dldF9ibG9ja19oZWlnaHQpOwoKICAgIG0uZGVmKCJiYXNpc19nZXRfdHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdF9mcm9tX2Jhc2lzX3RleF9mb3JtYXQiLAogICAgICAgICAgJmJ0X2Jhc2lzX2dldF90cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0X2Zyb21fYmFzaXNfdGV4X2Zvcm1hdCk7CgogICAgbS5kZWYoImJhc2lzX2lzX2Zvcm1hdF9zdXBwb3J0ZWQiLAogICAgICAgICAgW10odWludDMyX3QgdGZtdCwgdWludDMyX3QgYmFzaXNfZm10KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRvX2Jvb2woYnRfYmFzaXNfaXNfZm9ybWF0X3N1cHBvcnRlZCh0Zm10LCBiYXNpc19mbXQpKTsKICAgICAgICAgIH0pOwoKICAgIG0uZGVmKCJiYXNpc19jb21wdXRlX3RyYW5zY29kZWRfaW1hZ2Vfc2l6ZV9pbl9ieXRlcyIsCiAgICAgICAgICAmYnRfYmFzaXNfY29tcHV0ZV90cmFuc2NvZGVkX2ltYWdlX3NpemVfaW5fYnl0ZXMpOwoKCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIEtUWDIgb3Blbi9jbG9zZSAmIGJhc2ljIGluZm8KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgbS5kZWYoImt0eDJfb3BlbiIsICZidF9rdHgyX29wZW4sCiAgICAgICAgICAiT3BlbiBhIEtUWDIgaW1hZ2UgZnJvbSBtZW1vcnk7IHJldHVybnMgaGFuZGxlIik7CgogICAgbS5kZWYoImt0eDJfY2xvc2UiLCAmYnRfa3R4Ml9jbG9zZSwKICAgICAgICAgICJDbG9zZSBhIHByZXZpb3VzbHkgb3BlbmVkIEtUWDIgaGFuZGxlIik7CgogICAgbS5kZWYoImt0eDJfZ2V0X3dpZHRoIiwgICZidF9rdHgyX2dldF93aWR0aCk7CiAgICBtLmRlZigia3R4Ml9nZXRfaGVpZ2h0IiwgJmJ0X2t0eDJfZ2V0X2hlaWdodCk7CiAgICBtLmRlZigia3R4Ml9nZXRfbGV2ZWxzIiwgJmJ0X2t0eDJfZ2V0X2xldmVscyk7CiAgICBtLmRlZigia3R4Ml9nZXRfZmFjZXMiLCAgJmJ0X2t0eDJfZ2V0X2ZhY2VzKTsKICAgIG0uZGVmKCJrdHgyX2dldF9sYXllcnMiLCAmYnRfa3R4Ml9nZXRfbGF5ZXJzKTsKCiAgICBtLmRlZigia3R4Ml9nZXRfYmFzaXNfdGV4X2Zvcm1hdCIsICZidF9rdHgyX2dldF9iYXNpc190ZXhfZm9ybWF0KTsKCiAgICBtLmRlZigia3R4Ml9pc19ldGMxcyIsCiAgICAgICAgICBbXSh1aW50NjRfdCBoKSB7IHJldHVybiB0b19ib29sKGJ0X2t0eDJfaXNfZXRjMXMoaCkpOyB9KTsKCiAgICBtLmRlZigia3R4Ml9pc191YXN0Y19sZHJfNHg0IiwKICAgICAgICAgIFtdKHVpbnQ2NF90IGgpIHsgcmV0dXJuIHRvX2Jvb2woYnRfa3R4Ml9pc191YXN0Y19sZHJfNHg0KGgpKTsgfSk7CgogICAgbS5kZWYoImt0eDJfaXNfaGRyIiwKICAgICAgICAgIFtdKHVpbnQ2NF90IGgpIHsgcmV0dXJuIHRvX2Jvb2woYnRfa3R4Ml9pc19oZHIoaCkpOyB9KTsKCiAgICBtLmRlZigia3R4Ml9pc19oZHJfNHg0IiwKICAgICAgICAgIFtdKHVpbnQ2NF90IGgpIHsgcmV0dXJuIHRvX2Jvb2woYnRfa3R4Ml9pc19oZHJfNHg0KGgpKTsgfSk7CgogICAgbS5kZWYoImt0eDJfaXNfaGRyXzZ4NiIsCiAgICAgICAgICBbXSh1aW50NjRfdCBoKSB7IHJldHVybiB0b19ib29sKGJ0X2t0eDJfaXNfaGRyXzZ4NihoKSk7IH0pOwoKICAgIG0uZGVmKCJrdHgyX2lzX2xkciIsCiAgICAgICAgICBbXSh1aW50NjRfdCBoKSB7IHJldHVybiB0b19ib29sKGJ0X2t0eDJfaXNfbGRyKGgpKTsgfSk7CgogICAgbS5kZWYoImt0eDJfaXNfYXN0Y19sZHIiLAogICAgICAgICAgW10odWludDY0X3QgaCkgeyByZXR1cm4gdG9fYm9vbChidF9rdHgyX2lzX2FzdGNfbGRyKGgpKTsgfSk7CgogICAgbS5kZWYoImt0eDJfaXNfeHVhc3RjX2xkciIsCiAgICAgICAgICBbXSh1aW50NjRfdCBoKSB7IHJldHVybiB0b19ib29sKGJ0X2t0eDJfaXNfeHVhc3RjX2xkcihoKSk7IH0pOwoKICAgIG0uZGVmKCJrdHgyX2dldF9ibG9ja193aWR0aCIsICZidF9rdHgyX2dldF9ibG9ja193aWR0aCk7CgkKICAgIG0uZGVmKCJrdHgyX2dldF9ibG9ja19oZWlnaHQiLCAmYnRfa3R4Ml9nZXRfYmxvY2tfaGVpZ2h0KTsKCiAgICBtLmRlZigia3R4Ml9oYXNfYWxwaGEiLAogICAgICAgICAgW10odWludDY0X3QgaCkgeyByZXR1cm4gdG9fYm9vbChidF9rdHgyX2hhc19hbHBoYShoKSk7IH0pOwoKICAgIG0uZGVmKCJrdHgyX2dldF9kZmRfY29sb3JfbW9kZWwiLCAgICAgICZidF9rdHgyX2dldF9kZmRfY29sb3JfbW9kZWwpOwogICAgbS5kZWYoImt0eDJfZ2V0X2RmZF9jb2xvcl9wcmltYXJpZXMiLCAgJmJ0X2t0eDJfZ2V0X2RmZF9jb2xvcl9wcmltYXJpZXMpOwogICAgbS5kZWYoImt0eDJfZ2V0X2RmZF90cmFuc2Zlcl9mdW5jIiwgICAgJmJ0X2t0eDJfZ2V0X2RmZF90cmFuc2Zlcl9mdW5jKTsKCiAgICBtLmRlZigia3R4Ml9pc19zcmdiIiwKICAgICAgICAgIFtdKHVpbnQ2NF90IGgpIHsgcmV0dXJuIHRvX2Jvb2woYnRfa3R4Ml9pc19zcmdiKGgpKTsgfSk7CgogICAgbS5kZWYoImt0eDJfZ2V0X2RmZF9mbGFncyIsICAgICAgICAgICAgJmJ0X2t0eDJfZ2V0X2RmZF9mbGFncyk7CiAgICBtLmRlZigia3R4Ml9nZXRfZGZkX3RvdGFsX3NhbXBsZXMiLCAgICAmYnRfa3R4Ml9nZXRfZGZkX3RvdGFsX3NhbXBsZXMpOwogICAgbS5kZWYoImt0eDJfZ2V0X2RmZF9jaGFubmVsX2lkMCIsICAgICAgJmJ0X2t0eDJfZ2V0X2RmZF9jaGFubmVsX2lkMCk7CiAgICBtLmRlZigia3R4Ml9nZXRfZGZkX2NoYW5uZWxfaWQxIiwgICAgICAmYnRfa3R4Ml9nZXRfZGZkX2NoYW5uZWxfaWQxKTsKCiAgICBtLmRlZigia3R4Ml9pc192aWRlbyIsCiAgICAgICAgICBbXSh1aW50NjRfdCBoKSB7IHJldHVybiB0b19ib29sKGJ0X2t0eDJfaXNfdmlkZW8oaCkpOyB9KTsKCiAgICBtLmRlZigia3R4Ml9nZXRfbGRyX2hkcl91cGNvbnZlcnNpb25fbml0X211bHRpcGxpZXIiLAogICAgICAgICAgJmJ0X2t0eDJfZ2V0X2xkcl9oZHJfdXBjb252ZXJzaW9uX25pdF9tdWx0aXBsaWVyKTsKCgogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBLVFgyIHBlci1sZXZlbCBpbmZvCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIG0uZGVmKCJrdHgyX2dldF9sZXZlbF9vcmlnX3dpZHRoIiwKICAgICAgICAgICZidF9rdHgyX2dldF9sZXZlbF9vcmlnX3dpZHRoKTsKCiAgICBtLmRlZigia3R4Ml9nZXRfbGV2ZWxfb3JpZ19oZWlnaHQiLAogICAgICAgICAgJmJ0X2t0eDJfZ2V0X2xldmVsX29yaWdfaGVpZ2h0KTsKCiAgICBtLmRlZigia3R4Ml9nZXRfbGV2ZWxfYWN0dWFsX3dpZHRoIiwKICAgICAgICAgICZidF9rdHgyX2dldF9sZXZlbF9hY3R1YWxfd2lkdGgpOwoKICAgIG0uZGVmKCJrdHgyX2dldF9sZXZlbF9hY3R1YWxfaGVpZ2h0IiwKICAgICAgICAgICZidF9rdHgyX2dldF9sZXZlbF9hY3R1YWxfaGVpZ2h0KTsKCiAgICBtLmRlZigia3R4Ml9nZXRfbGV2ZWxfbnVtX2Jsb2Nrc194IiwKICAgICAgICAgICZidF9rdHgyX2dldF9sZXZlbF9udW1fYmxvY2tzX3gpOwoKICAgIG0uZGVmKCJrdHgyX2dldF9sZXZlbF9udW1fYmxvY2tzX3kiLAogICAgICAgICAgJmJ0X2t0eDJfZ2V0X2xldmVsX251bV9ibG9ja3NfeSk7CgogICAgbS5kZWYoImt0eDJfZ2V0X2xldmVsX3RvdGFsX2Jsb2NrcyIsCiAgICAgICAgICAmYnRfa3R4Ml9nZXRfbGV2ZWxfdG90YWxfYmxvY2tzKTsKCiAgICBtLmRlZigia3R4Ml9nZXRfbGV2ZWxfYWxwaGFfZmxhZyIsCiAgICAgICAgICBbXSh1aW50NjRfdCBoLCB1aW50MzJfdCBsZXZlbCwgdWludDMyX3QgbGF5ZXIsIHVpbnQzMl90IGZhY2UpIHsKICAgICAgICAgICAgICByZXR1cm4gdG9fYm9vbChidF9rdHgyX2dldF9sZXZlbF9hbHBoYV9mbGFnKGgsIGxldmVsLCBsYXllciwgZmFjZSkpOwogICAgICAgICAgfSk7CgogICAgbS5kZWYoImt0eDJfZ2V0X2xldmVsX2lmcmFtZV9mbGFnIiwKICAgICAgICAgIFtdKHVpbnQ2NF90IGgsIHVpbnQzMl90IGxldmVsLCB1aW50MzJfdCBsYXllciwgdWludDMyX3QgZmFjZSkgewogICAgICAgICAgICAgIHJldHVybiB0b19ib29sKGJ0X2t0eDJfZ2V0X2xldmVsX2lmcmFtZV9mbGFnKGgsIGxldmVsLCBsYXllciwgZmFjZSkpOwogICAgICAgICAgfSk7CgoKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gVHJhbnNjb2Rpbmcgc3RhdGUgYW5kIG9wZXJhdGlvbnMKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgbS5kZWYoImt0eDJfc3RhcnRfdHJhbnNjb2RpbmciLAogICAgICAgICAgW10odWludDY0X3QgaCkgeyByZXR1cm4gdG9fYm9vbChidF9rdHgyX3N0YXJ0X3RyYW5zY29kaW5nKGgpKTsgfSk7CgogICAgbS5kZWYoImt0eDJfY3JlYXRlX3RyYW5zY29kZV9zdGF0ZSIsCiAgICAgICAgICAmYnRfa3R4Ml9jcmVhdGVfdHJhbnNjb2RlX3N0YXRlKTsKCiAgICBtLmRlZigia3R4Ml9kZXN0cm95X3RyYW5zY29kZV9zdGF0ZSIsCiAgICAgICAgICAmYnRfa3R4Ml9kZXN0cm95X3RyYW5zY29kZV9zdGF0ZSk7CgogICAgbS5kZWYoImt0eDJfdHJhbnNjb2RlX2ltYWdlX2xldmVsIiwKICAgICAgICAgIFtdKHVpbnQ2NF90IGt0eDJfaGFuZGxlLAogICAgICAgICAgICAgdWludDMyX3QgbGV2ZWxfaW5kZXgsIHVpbnQzMl90IGxheWVyX2luZGV4LCB1aW50MzJfdCBmYWNlX2luZGV4LAogICAgICAgICAgICAgdWludDY0X3Qgb3V0X21lbV9vZnMsCiAgICAgICAgICAgICB1aW50MzJfdCBvdXRfYmxvY2tzX29yX3BpeGVscywKICAgICAgICAgICAgIHVpbnQzMl90IHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXRfdTMyLAogICAgICAgICAgICAgdWludDMyX3QgZGVjb2RlX2ZsYWdzLAogICAgICAgICAgICAgdWludDMyX3Qgcm93X3BpdGNoX2Jsb2Nrc19vcl9waXhlbHMsCiAgICAgICAgICAgICB1aW50MzJfdCByb3dzX2luX3BpeGVscywKICAgICAgICAgICAgIGludCBjaGFubmVsMCwgaW50IGNoYW5uZWwxLAogICAgICAgICAgICAgdWludDY0X3Qgc3RhdGVfaGFuZGxlKQogICAgICAgICAgewogICAgICAgICAgICAgIHJldHVybiB0b19ib29sKGJ0X2t0eDJfdHJhbnNjb2RlX2ltYWdlX2xldmVsKAogICAgICAgICAgICAgICAgICBrdHgyX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgbGV2ZWxfaW5kZXgsIGxheWVyX2luZGV4LCBmYWNlX2luZGV4LAogICAgICAgICAgICAgICAgICBvdXRfbWVtX29mcywKICAgICAgICAgICAgICAgICAgb3V0X2Jsb2Nrc19vcl9waXhlbHMsCiAgICAgICAgICAgICAgICAgIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXRfdTMyLAogICAgICAgICAgICAgICAgICBkZWNvZGVfZmxhZ3MsCiAgICAgICAgICAgICAgICAgIHJvd19waXRjaF9ibG9ja3Nfb3JfcGl4ZWxzLAogICAgICAgICAgICAgICAgICByb3dzX2luX3BpeGVscywKICAgICAgICAgICAgICAgICAgY2hhbm5lbDAsIGNoYW5uZWwxLAogICAgICAgICAgICAgICAgICBzdGF0ZV9oYW5kbGUpKTsKICAgICAgICAgIH0sCiAgICAgICAgICBweTo6YXJnKCJrdHgyX2hhbmRsZSIpLAogICAgICAgICAgcHk6OmFyZygibGV2ZWxfaW5kZXgiKSwKICAgICAgICAgIHB5OjphcmcoImxheWVyX2luZGV4IiksCiAgICAgICAgICBweTo6YXJnKCJmYWNlX2luZGV4IiksCiAgICAgICAgICBweTo6YXJnKCJvdXRwdXRfYmxvY2tfbWVtX29mcyIpLAogICAgICAgICAgcHk6OmFyZygib3V0cHV0X2Jsb2Nrc19idWZfc2l6ZV9pbl9ibG9ja3Nfb3JfcGl4ZWxzIiksCiAgICAgICAgICBweTo6YXJnKCJ0cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0X3UzMiIpLAogICAgICAgICAgcHk6OmFyZygiZGVjb2RlX2ZsYWdzIiksCiAgICAgICAgICBweTo6YXJnKCJvdXRwdXRfcm93X3BpdGNoX2luX2Jsb2Nrc19vcl9waXhlbHMiKSA9IDAsCiAgICAgICAgICBweTo6YXJnKCJvdXRwdXRfcm93c19pbl9waXhlbHMiKSA9IDAsCiAgICAgICAgICBweTo6YXJnKCJjaGFubmVsMCIpID0gLTEsCiAgICAgICAgICBweTo6YXJnKCJjaGFubmVsMSIpID0gLTEsCiAgICAgICAgICBweTo6YXJnKCJzdGF0ZV9oYW5kbGUiKSA9IDApOwoKCW0uZGVmKCJyZWFkX21lbW9yeSIsCgkgICAgW10odWludDY0X3QgcHRyLCB1aW50MzJfdCBzaXplKSB7CgkgICAgICAgIHJldHVybiBweTo6Ynl0ZXMoKGNvbnN0IGNoYXIqKXB0ciwgc2l6ZSk7CgkgICAgfSwKCSAgICAiUmVhZCBgc2l6ZWAgYnl0ZXMgc3RhcnRpbmcgYXQgbmF0aXZlIG1lbW9yeSBhZGRyZXNzIGBwdHJgIik7CgkKCW0uZGVmKCJ3cml0ZV9tZW1vcnkiLAoJICAgIFtdKHVpbnQ2NF90IGRlc3RfcHRyLCBweTo6YnVmZmVyIHNyYykgewoJICAgICAgICBweTo6YnVmZmVyX2luZm8gaW5mbyA9IHNyYy5yZXF1ZXN0KCk7CgkgICAgICAgIG1lbWNweSgodm9pZCopZGVzdF9wdHIsIGluZm8ucHRyLCBpbmZvLnNpemUgKiBpbmZvLml0ZW1zaXplKTsKCSAgICB9LAoJICAgICJXcml0ZSBieXRlcy9idWZmZXItbGlrZSBvYmplY3QgaW50byBuYXRpdmUgbWVtb3J5IGF0IGFkZHJlc3MgYHB0cmAiKTsKfQo=