Ly89PT0tLSBBTURHUFVLZXJuZWxDb2RlVC5oIC0gUHJpbnQgQU1ER1BVIGFzc2VtYmx5IGNvZGUgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCi8vCi8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKLy8KLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLy8KLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLy8vIFxmaWxlIEFNREtlcm5lbENvZGVULmgKLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KCiNpZm5kZWYgQU1ES0VSTkVMQ09ERVRfSAojZGVmaW5lIEFNREtFUk5FTENPREVUX0gKCiNpbmNsdWRlIDxjc3RkZGVmPgojaW5jbHVkZSA8Y3N0ZGludD4KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLy8gQU1EIEtlcm5lbCBDb2RlLCBhbmQgaXRzIGRlcGVuZGVuY2llcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCgp0eXBlZGVmIHVpbnQ4X3QgaHNhX3Bvd2VydHdvOF90Owp0eXBlZGVmIHVpbnQzMl90IGhzYV9leHRfY29kZV9raW5kX3Q7CnR5cGVkZWYgdWludDhfdCBoc2FfZXh0X2JyaWdfcHJvZmlsZThfdDsKdHlwZWRlZiB1aW50OF90IGhzYV9leHRfYnJpZ19tYWNoaW5lX21vZGVsOF90Owp0eXBlZGVmIHVpbnQ2NF90IGhzYV9leHRfY29udHJvbF9kaXJlY3RpdmVfcHJlc2VudDY0X3Q7CnR5cGVkZWYgdWludDE2X3QgaHNhX2V4dF9leGNlcHRpb25fa2luZDE2X3Q7CnR5cGVkZWYgdWludDMyX3QgaHNhX2V4dF9jb2RlX2tpbmQzMl90OwoKdHlwZWRlZiBzdHJ1Y3QgaHNhX2RpbTNfcyB7CiAgdWludDMyX3QgeDsKICB1aW50MzJfdCB5OwogIHVpbnQzMl90IHo7Cn0gaHNhX2RpbTNfdDsKCi8vLyBUaGUgdmVyc2lvbiBvZiB0aGUgYW1kXypfY29kZV90IHN0cnVjdC4gTWlub3IgdmVyc2lvbnMgbXVzdCBiZQovLy8gYmFja3dhcmQgY29tcGF0aWJsZS4KdHlwZWRlZiB1aW50MzJfdCBhbWRfY29kZV92ZXJzaW9uMzJfdDsKZW51bSBhbWRfY29kZV92ZXJzaW9uX3QgewogIEFNRF9DT0RFX1ZFUlNJT05fTUFKT1IgPSAwLAogIEFNRF9DT0RFX1ZFUlNJT05fTUlOT1IgPSAxCn07CgovLy8gVGhlIHZhbHVlcyB1c2VkIHRvIGRlZmluZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHVzZSBmb3IgdGhlCi8vLyBzd2l6emxlIGVsZW1lbnQgc2l6ZS4KZW51bSBhbWRfZWxlbWVudF9ieXRlX3NpemVfdCB7CiAgQU1EX0VMRU1FTlRfMl9CWVRFUyA9IDAsCiAgQU1EX0VMRU1FTlRfNF9CWVRFUyA9IDEsCiAgQU1EX0VMRU1FTlRfOF9CWVRFUyA9IDIsCiAgQU1EX0VMRU1FTlRfMTZfQllURVMgPSAzCn07CgovLy8gU2hhZGVyIHByb2dyYW0gc2V0dGluZ3MgZm9yIENTLiBDb250YWlucyBDT01QVVRFX1BHTV9SU1JDMSBhbmQKLy8vIENPTVBVVEVfUEdNX1JTUkMyIHJlZ2lzdGVycy4KdHlwZWRlZiB1aW50NjRfdCBhbWRfY29tcHV0ZV9wZ21fcmVzb3VyY2VfcmVnaXN0ZXI2NF90OwoKLy8vIEV2ZXJ5IGFtZF8qX2NvZGVfdCBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzLCB3aGljaCBhcmUgY29tcG9zZWQgb2YKLy8vIGEgbnVtYmVyIG9mIGJpdCBmaWVsZHMuIEV2ZXJ5IGJpdCBmaWVsZCBoYXMgYSBtYXNrIChBTURfQ09ERV9QUk9QRVJUWV8qKSwKLy8vIGJpdCB3aWR0aCAoQU1EX0NPREVfUFJPUEVSVFlfKl9XSURUSCwgYW5kIGJpdCBzaGlmdCBhbW91bnQKLy8vIChBTURfQ09ERV9QUk9QRVJUWV8qX1NISUZUKSBmb3IgY29udmVuaWVudCBhY2Nlc3MuIFVudXNlZCBiaXRzIG11c3QgYmUgMC4KLy8vCi8vLyAoTm90ZSB0aGF0IGJpdCBmaWVsZHMgY2Fubm90IGJlIHVzZWQgYXMgdGhlaXIgbGF5b3V0IGlzCi8vLyBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGluIHRoZSBDIHN0YW5kYXJkIGFuZCBzbyBjYW5ub3QgYmUgdXNlZCB0bwovLy8gc3BlY2lmeSBhbiBBQkkpCnR5cGVkZWYgdWludDMyX3QgYW1kX2NvZGVfcHJvcGVydHkzMl90OwplbnVtIGFtZF9jb2RlX3Byb3BlcnR5X21hc2tfdCB7CgogIC8vLyBFbmFibGUgdGhlIHNldHVwIG9mIHRoZSBTR1BSIHVzZXIgZGF0YSByZWdpc3RlcnMKICAvLy8gKEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSXyopLCBzZWUgZG9jdW1lbnRhdGlvbiBvZiBhbWRfa2VybmVsX2NvZGVfdAogIC8vLyBmb3IgaW5pdGlhbCByZWdpc3RlciBzdGF0ZS4KICAvLy8KICAvLy8gVGhlIHRvdGFsIG51bWJlciBvZiBTR1BSdXNlciBkYXRhIHJlZ2lzdGVycyByZXF1ZXN0ZWQgbXVzdCBub3QKICAvLy8gZXhjZWVkIDE2LiBBbnkgcmVxdWVzdHMgYmV5b25kIDE2IHdpbGwgYmUgaWdub3JlZC4KICAvLy8KICAvLy8gVXNlZCB0byBzZXQgQ09NUFVURV9QR01fUlNSQzIuVVNFUl9TR1BSIChzZXQgdG8gdG90YWwgY291bnQgb2YKICAvLy8gU0dQUiB1c2VyIGRhdGEgcmVnaXN0ZXJzIGVuYWJsZWQgdXAgdG8gMTYpLgoKICBBTURfQ09ERV9QUk9QRVJUWV9FTkFCTEVfU0dQUl9QUklWQVRFX1NFR01FTlRfQlVGRkVSX1NISUZUID0gMCwKICBBTURfQ09ERV9QUk9QRVJUWV9FTkFCTEVfU0dQUl9QUklWQVRFX1NFR01FTlRfQlVGRkVSX1dJRFRIID0gMSwKICBBTURfQ09ERV9QUk9QRVJUWV9FTkFCTEVfU0dQUl9QUklWQVRFX1NFR01FTlRfQlVGRkVSID0gKCgxIDw8IEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX1BSSVZBVEVfU0VHTUVOVF9CVUZGRVJfV0lEVEgpIC0gMSkgPDwgQU1EX0NPREVfUFJPUEVSVFlfRU5BQkxFX1NHUFJfUFJJVkFURV9TRUdNRU5UX0JVRkZFUl9TSElGVCwKCiAgQU1EX0NPREVfUFJPUEVSVFlfRU5BQkxFX1NHUFJfRElTUEFUQ0hfUFRSX1NISUZUID0gMSwKICBBTURfQ09ERV9QUk9QRVJUWV9FTkFCTEVfU0dQUl9ESVNQQVRDSF9QVFJfV0lEVEggPSAxLAogIEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX0RJU1BBVENIX1BUUiA9ICgoMSA8PCBBTURfQ09ERV9QUk9QRVJUWV9FTkFCTEVfU0dQUl9ESVNQQVRDSF9QVFJfV0lEVEgpIC0gMSkgPDwgQU1EX0NPREVfUFJPUEVSVFlfRU5BQkxFX1NHUFJfRElTUEFUQ0hfUFRSX1NISUZULAoKICBBTURfQ09ERV9QUk9QRVJUWV9FTkFCTEVfU0dQUl9RVUVVRV9QVFJfU0hJRlQgPSAyLAogIEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX1FVRVVFX1BUUl9XSURUSCA9IDEsCiAgQU1EX0NPREVfUFJPUEVSVFlfRU5BQkxFX1NHUFJfUVVFVUVfUFRSID0gKCgxIDw8IEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX1FVRVVFX1BUUl9XSURUSCkgLSAxKSA8PCBBTURfQ09ERV9QUk9QRVJUWV9FTkFCTEVfU0dQUl9RVUVVRV9QVFJfU0hJRlQsCgogIEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX0tFUk5BUkdfU0VHTUVOVF9QVFJfU0hJRlQgPSAzLAogIEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX0tFUk5BUkdfU0VHTUVOVF9QVFJfV0lEVEggPSAxLAogIEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX0tFUk5BUkdfU0VHTUVOVF9QVFIgPSAoKDEgPDwgQU1EX0NPREVfUFJPUEVSVFlfRU5BQkxFX1NHUFJfS0VSTkFSR19TRUdNRU5UX1BUUl9XSURUSCkgLSAxKSA8PCBBTURfQ09ERV9QUk9QRVJUWV9FTkFCTEVfU0dQUl9LRVJOQVJHX1NFR01FTlRfUFRSX1NISUZULAoKICBBTURfQ09ERV9QUk9QRVJUWV9FTkFCTEVfU0dQUl9ESVNQQVRDSF9JRF9TSElGVCA9IDQsCiAgQU1EX0NPREVfUFJPUEVSVFlfRU5BQkxFX1NHUFJfRElTUEFUQ0hfSURfV0lEVEggPSAxLAogIEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX0RJU1BBVENIX0lEID0gKCgxIDw8IEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX0RJU1BBVENIX0lEX1dJRFRIKSAtIDEpIDw8IEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX0RJU1BBVENIX0lEX1NISUZULAoKICBBTURfQ09ERV9QUk9QRVJUWV9FTkFCTEVfU0dQUl9GTEFUX1NDUkFUQ0hfSU5JVF9TSElGVCA9IDUsCiAgQU1EX0NPREVfUFJPUEVSVFlfRU5BQkxFX1NHUFJfRkxBVF9TQ1JBVENIX0lOSVRfV0lEVEggPSAxLAogIEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX0ZMQVRfU0NSQVRDSF9JTklUID0gKCgxIDw8IEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX0ZMQVRfU0NSQVRDSF9JTklUX1dJRFRIKSAtIDEpIDw8IEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX0ZMQVRfU0NSQVRDSF9JTklUX1NISUZULAoKICBBTURfQ09ERV9QUk9QRVJUWV9FTkFCTEVfU0dQUl9QUklWQVRFX1NFR01FTlRfU0laRV9TSElGVCA9IDYsCiAgQU1EX0NPREVfUFJPUEVSVFlfRU5BQkxFX1NHUFJfUFJJVkFURV9TRUdNRU5UX1NJWkVfV0lEVEggPSAxLAogIEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX1BSSVZBVEVfU0VHTUVOVF9TSVpFID0gKCgxIDw8IEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX1BSSVZBVEVfU0VHTUVOVF9TSVpFX1dJRFRIKSAtIDEpIDw8IEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX1BSSVZBVEVfU0VHTUVOVF9TSVpFX1NISUZULAoKICBBTURfQ09ERV9QUk9QRVJUWV9FTkFCTEVfU0dQUl9HUklEX1dPUktHUk9VUF9DT1VOVF9YX1NISUZUID0gNywKICBBTURfQ09ERV9QUk9QRVJUWV9FTkFCTEVfU0dQUl9HUklEX1dPUktHUk9VUF9DT1VOVF9YX1dJRFRIID0gMSwKICBBTURfQ09ERV9QUk9QRVJUWV9FTkFCTEVfU0dQUl9HUklEX1dPUktHUk9VUF9DT1VOVF9YID0gKCgxIDw8IEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX0dSSURfV09SS0dST1VQX0NPVU5UX1hfV0lEVEgpIC0gMSkgPDwgQU1EX0NPREVfUFJPUEVSVFlfRU5BQkxFX1NHUFJfR1JJRF9XT1JLR1JPVVBfQ09VTlRfWF9TSElGVCwKCiAgQU1EX0NPREVfUFJPUEVSVFlfRU5BQkxFX1NHUFJfR1JJRF9XT1JLR1JPVVBfQ09VTlRfWV9TSElGVCA9IDgsCiAgQU1EX0NPREVfUFJPUEVSVFlfRU5BQkxFX1NHUFJfR1JJRF9XT1JLR1JPVVBfQ09VTlRfWV9XSURUSCA9IDEsCiAgQU1EX0NPREVfUFJPUEVSVFlfRU5BQkxFX1NHUFJfR1JJRF9XT1JLR1JPVVBfQ09VTlRfWSA9ICgoMSA8PCBBTURfQ09ERV9QUk9QRVJUWV9FTkFCTEVfU0dQUl9HUklEX1dPUktHUk9VUF9DT1VOVF9ZX1dJRFRIKSAtIDEpIDw8IEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX0dSSURfV09SS0dST1VQX0NPVU5UX1lfU0hJRlQsCgogIEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX0dSSURfV09SS0dST1VQX0NPVU5UX1pfU0hJRlQgPSA5LAogIEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX0dSSURfV09SS0dST1VQX0NPVU5UX1pfV0lEVEggPSAxLAogIEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9TR1BSX0dSSURfV09SS0dST1VQX0NPVU5UX1ogPSAoKDEgPDwgQU1EX0NPREVfUFJPUEVSVFlfRU5BQkxFX1NHUFJfR1JJRF9XT1JLR1JPVVBfQ09VTlRfWl9XSURUSCkgLSAxKSA8PCBBTURfQ09ERV9QUk9QRVJUWV9FTkFCTEVfU0dQUl9HUklEX1dPUktHUk9VUF9DT1VOVF9aX1NISUZULAoKICAvLy8gQ29udHJvbCB3YXZlIElEIGJhc2UgY291bnRlciBmb3IgR0RTIG9yZGVyZWQtYXBwZW5kLiBVc2VkIHRvIHNldAogIC8vLyBDT01QVVRFX0RJU1BBVENIX0lOSVRJQVRPUi5PUkRFUkVEX0FQUEVORF9FTkJMLiAoTm90IHN1cmUgaWYKICAvLy8gT1JERVJFRF9BUFBFTkRfTU9ERSBhbHNvIG5lZWRzIHRvIGJlIHNldHRhYmxlKQogIEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9PUkRFUkVEX0FQUEVORF9HRFNfU0hJRlQgPSAxMCwKICBBTURfQ09ERV9QUk9QRVJUWV9FTkFCTEVfT1JERVJFRF9BUFBFTkRfR0RTX1dJRFRIID0gMSwKICBBTURfQ09ERV9QUk9QRVJUWV9FTkFCTEVfT1JERVJFRF9BUFBFTkRfR0RTID0gKCgxIDw8IEFNRF9DT0RFX1BST1BFUlRZX0VOQUJMRV9PUkRFUkVEX0FQUEVORF9HRFNfV0lEVEgpIC0gMSkgPDwgQU1EX0NPREVfUFJPUEVSVFlfRU5BQkxFX09SREVSRURfQVBQRU5EX0dEU19TSElGVCwKCiAgLy8vIFRoZSBpbnRlcmxlYXZlIChzd2l6emxlKSBlbGVtZW50IHNpemUgaW4gYnl0ZXMgcmVxdWlyZWQgYnkgdGhlCiAgLy8vIGNvZGUgZm9yIHByaXZhdGUgbWVtb3J5LiBUaGlzIG11c3QgYmUgMiwgNCwgOCBvciAxNi4gVGhpcyB2YWx1ZQogIC8vLyBpcyBwcm92aWRlZCB0byB0aGUgZmluYWxpemVyIHdoZW4gaXQgaXMgaW52b2tlZCBhbmQgaXMgcmVjb3JkZWQKICAvLy8gaGVyZS4gVGhlIGhhcmR3YXJlIHdpbGwgaW50ZXJsZWF2ZSB0aGUgbWVtb3J5IHJlcXVlc3RzIG9mIGVhY2gKICAvLy8gbGFuZSBvZiBhIHdhdmVmcm9udCBieSB0aGlzIGVsZW1lbnQgc2l6ZSB0byBlbnN1cmUgZWFjaAogIC8vLyB3b3JrLWl0ZW0gZ2V0cyBhIGRpc3RpbmN0IG1lbW9yeSBtZW1vcnkgbG9jYXRpb24uIFRoZXJlZm9yZSwgdGhlCiAgLy8vIGZpbmFsaXplciBlbnN1cmVzIHRoYXQgYWxsIGxvYWQgYW5kIHN0b3JlIG9wZXJhdGlvbnMgZG9uZSB0bwogIC8vLyBwcml2YXRlIG1lbW9yeSBkbyBub3QgZXhjZWVkIHRoaXMgc2l6ZS4gRm9yIGV4YW1wbGUsIGlmIHRoZQogIC8vLyBlbGVtZW50IHNpemUgaXMgNCAoMzItYml0cyBvciBkd29yZCkgYW5kIGEgNjQtYml0IHZhbHVlIG11c3QgYmUKICAvLy8gbG9hZGVkLCB0aGUgZmluYWxpemVyIHdpbGwgZ2VuZXJhdGUgdHdvIDMyLWJpdCBsb2Fkcy4gVGhpcwogIC8vLyBlbnN1cmVzIHRoYXQgdGhlIGludGVybGVhdmluZyB3aWxsIGdldCB0aGUgdGhlIHdvcmstaXRlbQogIC8vLyBzcGVjaWZpYyBkd29yZCBmb3IgYm90aCBoYWx2ZXMgb2YgdGhlIDY0LWJpdCB2YWx1ZS4gSWYgaXQganVzdAogIC8vLyBkaWQgYSA2NC1iaXQgbG9hZCB0aGVuIGl0IHdvdWxkIGdldCBvbmUgZHdvcmQgd2hpY2ggYmVsb25nZWQgdG8KICAvLy8gaXRzIG93biB3b3JrLWl0ZW0sIGJ1dCB0aGUgc2Vjb25kIGR3b3JkIHdvdWxkIGJlbG9uZyB0byB0aGUKICAvLy8gYWRqYWNlbnQgbGFuZSB3b3JrLWl0ZW0gc2luY2UgdGhlIGludGVybGVhdmluZyBpcyBpbiBkd29yZHMuCiAgLy8vCiAgLy8vIFRoZSB2YWx1ZSB1c2VkIG11c3QgbWF0Y2ggdGhlIHZhbHVlIHRoYXQgdGhlIHJ1bnRpbWUgY29uZmlndXJlcwogIC8vLyB0aGUgR1BVIGZsYXQgc2NyYXRjaCAoU0hfU1RBVElDX01FTV9DT05GSUcuRUxFTUVOVF9TSVpFKS4gVGhpcwogIC8vLyBpcyBnZW5lcmFsbHkgRFdPUkQuCiAgLy8vCiAgLy8vIFVzZSB2YWx1ZXMgZnJvbSB0aGUgYW1kX2VsZW1lbnRfYnl0ZV9zaXplX3QgZW51bS4KICBBTURfQ09ERV9QUk9QRVJUWV9QUklWQVRFX0VMRU1FTlRfU0laRV9TSElGVCA9IDExLAogIEFNRF9DT0RFX1BST1BFUlRZX1BSSVZBVEVfRUxFTUVOVF9TSVpFX1dJRFRIID0gMiwKICBBTURfQ09ERV9QUk9QRVJUWV9QUklWQVRFX0VMRU1FTlRfU0laRSA9ICgoMSA8PCBBTURfQ09ERV9QUk9QRVJUWV9QUklWQVRFX0VMRU1FTlRfU0laRV9XSURUSCkgLSAxKSA8PCBBTURfQ09ERV9QUk9QRVJUWV9QUklWQVRFX0VMRU1FTlRfU0laRV9TSElGVCwKCiAgLy8vIEFyZSBnbG9iYWwgbWVtb3J5IGFkZHJlc3NlcyA2NCBiaXRzLiBNdXN0IG1hdGNoCiAgLy8vIGFtZF9rZXJuZWxfY29kZV90LmhzYWlsX21hY2hpbmVfbW9kZWwgPT0KICAvLy8gSFNBX01BQ0hJTkVfTEFSR0UuIE11c3QgYWxzbyBtYXRjaAogIC8vLyBTSF9NRU1fQ09ORklHLlBUUjMyIChHRlg2IChTSSkvR0ZYNyAoQ0kpKSwKICAvLy8gU0hfTUVNX0NPTkZJRy5BRERSRVNTX01PREUgKEdGWDggKFZJKSspLgogIEFNRF9DT0RFX1BST1BFUlRZX0lTX1BUUjY0X1NISUZUID0gMTMsCiAgQU1EX0NPREVfUFJPUEVSVFlfSVNfUFRSNjRfV0lEVEggPSAxLAogIEFNRF9DT0RFX1BST1BFUlRZX0lTX1BUUjY0ID0gKCgxIDw8IEFNRF9DT0RFX1BST1BFUlRZX0lTX1BUUjY0X1dJRFRIKSAtIDEpIDw8IEFNRF9DT0RFX1BST1BFUlRZX0lTX1BUUjY0X1NISUZULAoKICAvLy8gSW5kaWNhdGUgaWYgdGhlIGdlbmVyYXRlZCBJU0EgaXMgdXNpbmcgYSBkeW5hbWljYWxseSBzaXplZCBjYWxsCiAgLy8vIHN0YWNrLiBUaGlzIGNhbiBoYXBwZW4gaWYgY2FsbHMgYXJlIGltcGxlbWVudGVkIHVzaW5nIGEgY2FsbAogIC8vLyBzdGFjayBhbmQgcmVjdXJzaW9uLCBhbGxvY2Egb3IgY2FsbHMgdG8gaW5kaXJlY3QgZnVuY3Rpb25zIGFyZQogIC8vLyBwcmVzZW50LiBJbiB0aGVzZSBjYXNlcyB0aGUgRmluYWxpemVyIGNhbm5vdCBjb21wdXRlIHRoZSB0b3RhbAogIC8vLyBwcml2YXRlIHNlZ21lbnQgc2l6ZSBhdCBjb21waWxlIHRpbWUuIEluIHRoaXMgY2FzZSB0aGUKICAvLy8gd29ya2l0ZW1fcHJpdmF0ZV9zZWdtZW50X2J5dGVfc2l6ZSBvbmx5IHNwZWNpZmllcyB0aGUgc3RhdGljYWxseQogIC8vLyBrbm93IHByaXZhdGUgc2VnbWVudCBzaXplLCBhbmQgYWRkaXRpb25hbCBzcGFjZSBtdXN0IGJlIGFkZGVkCiAgLy8vIGZvciB0aGUgY2FsbCBzdGFjay4KICBBTURfQ09ERV9QUk9QRVJUWV9JU19EWU5BTUlDX0NBTExTVEFDS19TSElGVCA9IDE0LAogIEFNRF9DT0RFX1BST1BFUlRZX0lTX0RZTkFNSUNfQ0FMTFNUQUNLX1dJRFRIID0gMSwKICBBTURfQ09ERV9QUk9QRVJUWV9JU19EWU5BTUlDX0NBTExTVEFDSyA9ICgoMSA8PCBBTURfQ09ERV9QUk9QRVJUWV9JU19EWU5BTUlDX0NBTExTVEFDS19XSURUSCkgLSAxKSA8PCBBTURfQ09ERV9QUk9QRVJUWV9JU19EWU5BTUlDX0NBTExTVEFDS19TSElGVCwKCiAgLy8vIEluZGljYXRlIGlmIGNvZGUgZ2VuZXJhdGVkIGhhcyBzdXBwb3J0IGZvciBkZWJ1Z2dpbmcuCiAgQU1EX0NPREVfUFJPUEVSVFlfSVNfREVCVUdfU1VQUE9SVEVEX1NISUZUID0gMTUsCiAgQU1EX0NPREVfUFJPUEVSVFlfSVNfREVCVUdfU1VQUE9SVEVEX1dJRFRIID0gMSwKICBBTURfQ09ERV9QUk9QRVJUWV9JU19ERUJVR19TVVBQT1JURUQgPSAoKDEgPDwgQU1EX0NPREVfUFJPUEVSVFlfSVNfREVCVUdfU1VQUE9SVEVEX1dJRFRIKSAtIDEpIDw8IEFNRF9DT0RFX1BST1BFUlRZX0lTX0RFQlVHX1NVUFBPUlRFRF9TSElGVAp9OwoKLy8vIEBicmllZiBUaGUgaHNhX2V4dF9jb250cm9sX2RpcmVjdGl2ZXNfdCBzcGVjaWZpZXMgdGhlIHZhbHVlcyBmb3IgdGhlIEhTQUlMCi8vLyBjb250cm9sIGRpcmVjdGl2ZXMuIFRoZXNlIGNvbnRyb2wgaG93IHRoZSBmaW5hbGl6ZXIgZ2VuZXJhdGVzIGNvZGUuIFRoaXMKLy8vIHN0cnVjdCBpcyB1c2VkIGJvdGggYXMgYW4gYXJndW1lbnQgdG8gaHNhRmluYWxpemVLZXJuZWwgdG8gc3BlY2lmeSB2YWx1ZXMgZm9yCi8vLyB0aGUgY29udHJvbCBkaXJlY3RpdmVzLCBhbmQgaXMgdXNlZCBpbiBIc2FLZXJuZWxDb2RlIHRvIHJlY29yZCB0aGUgdmFsdWVzIG9mCi8vLyB0aGUgY29udHJvbCBkaXJlY3RpdmVzIHRoYXQgdGhlIGZpbmFsaXplIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBjb2RlIHdoaWNoCi8vLyBlaXRoZXIgY2FtZSBmcm9tIHRoZSBmaW5hbGl6ZXIgYXJndW1lbnQgb3IgZXhwbGljaXQgSFNBSUwgY29udHJvbAovLy8gZGlyZWN0aXZlcy4gU2VlIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjb250cm9sIGRpcmVjdGl2ZXMgaW4gSFNBIFByb2dyYW1tZXIncwovLy8gUmVmZXJlbmNlIE1hbnVhbCB3aGljaCBhbHNvIGRlZmluZXMgaG93IHRoZSB2YWx1ZXMgc3BlY2lmaWVkIGFzIGZpbmFsaXplcgovLy8gYXJndW1lbnRzIGhhdmUgdG8gYWdyZWUgd2l0aCB0aGUgY29udHJvbCBkaXJlY3RpdmVzIGluIHRoZSBIU0FJTCBjb2RlLgp0eXBlZGVmIHN0cnVjdCBoc2FfZXh0X2NvbnRyb2xfZGlyZWN0aXZlc19zIHsKICAvLy8gVGhpcyBpcyBhIGJpdCBzZXQgaW5kaWNhdGluZyB3aGljaCBjb250cm9sIGRpcmVjdGl2ZXMgaGF2ZSBiZWVuCiAgLy8vIHNwZWNpZmllZC4gSWYgdGhlIHZhbHVlIGlzIDAgdGhlbiB0aGVyZSBhcmUgbm8gY29udHJvbCBkaXJlY3RpdmVzIHNwZWNpZmllZAogIC8vLyBhbmQgdGhlIHJlc3Qgb2YgdGhlIGZpZWxkcyBjYW4gYmUgaWdub3JlZC4gVGhlIGJpdHMgYXJlIGFjY2Vzc2VkIHVzaW5nIHRoZQogIC8vLyBoc2FfZXh0X2NvbnRyb2xfZGlyZWN0aXZlc19wcmVzZW50X21hc2tfdC4gQW55IGNvbnRyb2wgZGlyZWN0aXZlIHRoYXQgaXMgbm90CiAgLy8vIGVuYWJsZWQgaW4gdGhpcyBiaXQgc2V0IG11c3QgaGF2ZSB0aGUgdmFsdWUgb2YgYWxsIDBzLgogIGhzYV9leHRfY29udHJvbF9kaXJlY3RpdmVfcHJlc2VudDY0X3QgZW5hYmxlZF9jb250cm9sX2RpcmVjdGl2ZXM7CgogIC8vLyBJZiBlbmFibGVCcmVha0V4Y2VwdGlvbnMgaXMgbm90IGVuYWJsZWQgdGhlbiBtdXN0IGJlIDAsIG90aGVyd2lzZSBtdXN0IGJlCiAgLy8vIG5vbi0wIGFuZCBzcGVjaWZpZXMgdGhlIHNldCBvZiBIU0FJTCBleGNlcHRpb25zIHRoYXQgbXVzdCBoYXZlIHRoZSBCUkVBSwogIC8vLyBwb2xpY3kgZW5hYmxlZC4gSWYgdGhpcyBzZXQgaXMgbm90IGVtcHR5IHRoZW4gdGhlIGdlbmVyYXRlZCBjb2RlIG1heSBoYXZlCiAgLy8vIGxvd2VyIHBlcmZvcm1hbmNlIHRoYW4gaWYgdGhlIHNldCBpcyBlbXB0eS4gSWYgdGhlIGtlcm5lbCBiZWluZyBmaW5hbGl6ZWQKICAvLy8gaGFzIGFueSBlbmFibGVicmVha2V4Y2VwdGlvbnMgY29udHJvbCBkaXJlY3RpdmVzLCB0aGVuIHRoZSB2YWx1ZXMgc3BlY2lmaWVkCiAgLy8vIGJ5IHRoaXMgYXJndW1lbnQgYXJlIHVuaW9uZWQgd2l0aCB0aGUgdmFsdWVzIGluIHRoZXNlIGNvbnRyb2wKICAvLy8gZGlyZWN0aXZlcy4gSWYgYW55IG9mIHRoZSBmdW5jdGlvbnMgdGhlIGtlcm5lbCBjYWxscyBoYXZlIGFuCiAgLy8vIGVuYWJsZWJyZWFrZXhjZXB0aW9ucyBjb250cm9sIGRpcmVjdGl2ZSwgdGhlbiB0aGV5IG11c3QgYmUgZXF1YWwgb3IgYQogIC8vLyBzdWJzZXQgb2YsIHRoaXMgdW5pb24uCiAgaHNhX2V4dF9leGNlcHRpb25fa2luZDE2X3QgZW5hYmxlX2JyZWFrX2V4Y2VwdGlvbnM7CgogIC8vLyBJZiBlbmFibGVEZXRlY3RFeGNlcHRpb25zIGlzIG5vdCBlbmFibGVkIHRoZW4gbXVzdCBiZSAwLCBvdGhlcndpc2UgbXVzdCBiZQogIC8vLyBub24tMCBhbmQgc3BlY2lmaWVzIHRoZSBzZXQgb2YgSFNBSUwgZXhjZXB0aW9ucyB0aGF0IG11c3QgaGF2ZSB0aGUgREVURUNUCiAgLy8vIHBvbGljeSBlbmFibGVkLiBJZiB0aGlzIHNldCBpcyBub3QgZW1wdHkgdGhlbiB0aGUgZ2VuZXJhdGVkIGNvZGUgbWF5IGhhdmUKICAvLy8gbG93ZXIgcGVyZm9ybWFuY2UgdGhhbiBpZiB0aGUgc2V0IGlzIGVtcHR5LiBIb3dldmVyLCBhbiBpbXBsZW1lbnRhdGlvbgogIC8vLyBzaG91bGQgZW5kZWF2b3VyIHRvIG1ha2UgdGhlIHBlcmZvcm1hbmNlIGltcGFjdCBzbWFsbC4gSWYgdGhlIGtlcm5lbCBiZWluZwogIC8vLyBmaW5hbGl6ZWQgaGFzIGFueSBlbmFibGVkZXRlY3RleGNlcHRpb25zIGNvbnRyb2wgZGlyZWN0aXZlcywgdGhlbiB0aGUKICAvLy8gdmFsdWVzIHNwZWNpZmllZCBieSB0aGlzIGFyZ3VtZW50IGFyZSB1bmlvbmVkIHdpdGggdGhlIHZhbHVlcyBpbiB0aGVzZQogIC8vLyBjb250cm9sIGRpcmVjdGl2ZXMuIElmIGFueSBvZiB0aGUgZnVuY3Rpb25zIHRoZSBrZXJuZWwgY2FsbHMgaGF2ZSBhbgogIC8vLyBlbmFibGVkZXRlY3RleGNlcHRpb25zIGNvbnRyb2wgZGlyZWN0aXZlLCB0aGVuIHRoZXkgbXVzdCBiZSBlcXVhbCBvciBhCiAgLy8vIHN1YnNldCBvZiwgdGhpcyB1bmlvbi4KICBoc2FfZXh0X2V4Y2VwdGlvbl9raW5kMTZfdCBlbmFibGVfZGV0ZWN0X2V4Y2VwdGlvbnM7CgogIC8vLyBJZiBtYXhEeW5hbWljR3JvdXBTaXplIGlzIG5vdCBlbmFibGVkIHRoZW4gbXVzdCBiZSAwLCBhbmQgYW55IGFtb3VudCBvZgogIC8vLyBkeW5hbWljIGdyb3VwIHNlZ21lbnQgY2FuIGJlIGFsbG9jYXRlZCBmb3IgYSBkaXNwYXRjaCwgb3RoZXJ3aXNlIHRoZSB2YWx1ZQogIC8vLyBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIG9mIGR5bmFtaWMgZ3JvdXAgc2VnbWVudCB0aGF0IGNhbiBiZQogIC8vLyBhbGxvY2F0ZWQgZm9yIGEgZGlzcGF0Y2guIElmIHRoZSBrZXJuZWwgYmVpbmcgZmluYWxpemVkIGhhcyBhbnkKICAvLy8gbWF4ZHluYW1pY3NpemUgY29udHJvbCBkaXJlY3RpdmVzLCB0aGVuIHRoZSB2YWx1ZXMgbXVzdCBiZSB0aGUgc2FtZSwgYW5kCiAgLy8vIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhpcyBhcmd1bWVudCBpZiBpdCBpcyBlbmFibGVkLiBUaGlzIHZhbHVlIGNhbiBiZSB1c2VkCiAgLy8vIGJ5IHRoZSBmaW5hbGl6ZXIgdG8gZGV0ZXJtaW5lIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBvZiBncm91cCBtZW1vcnkKICAvLy8gdXNlZCBieSBlYWNoIHdvcmstZ3JvdXAgYnkgYWRkaW5nIHRoaXMgdmFsdWUgdG8gdGhlIGdyb3VwIG1lbW9yeSByZXF1aXJlZAogIC8vLyBmb3IgYWxsIGdyb3VwIHNlZ21lbnQgdmFyaWFibGVzIHVzZWQgYnkgdGhlIGtlcm5lbCBhbmQgYWxsIGZ1bmN0aW9ucyBpdAogIC8vLyBjYWxscywgYW5kIGdyb3VwIG1lbW9yeSB1c2VkIHRvIGltcGxlbWVudCBvdGhlciBIU0FJTCBmZWF0dXJlcyBzdWNoIGFzCiAgLy8vIGZiYXJyaWVycyBhbmQgdGhlIGRldGVjdCBleGNlcHRpb24gb3BlcmF0aW9ucy4gVGhpcyBjYW4gYWxsb3cgdGhlIGZpbmFsaXplcgogIC8vLyB0byBkZXRlcm1pbmUgdGhlIGV4cGVjdGVkIG51bWJlciBvZiB3b3JrLWdyb3VwcyB0aGF0IGNhbiBiZSBleGVjdXRlZCBieSBhCiAgLy8vIGNvbXB1dGUgdW5pdCBhbmQgYWxsb3cgbW9yZSByZXNvdXJjZXMgdG8gYmUgYWxsb2NhdGVkIHRvIHRoZSB3b3JrLWl0ZW1zIGlmCiAgLy8vIGl0IGlzIGtub3duIHRoYXQgZmV3ZXIgd29yay1ncm91cHMgY2FuIGJlIGV4ZWN1dGVkIGR1ZSB0byBncm91cCBtZW1vcnkKICAvLy8gbGltaXRhdGlvbnMuCiAgdWludDMyX3QgbWF4X2R5bmFtaWNfZ3JvdXBfc2l6ZTsKCiAgLy8vIElmIG1heEZsYXRHcmlkU2l6ZSBpcyBub3QgZW5hYmxlZCB0aGVuIG11c3QgYmUgMCwgb3RoZXJ3aXNlIG11c3QgYmUgZ3JlYXRlcgogIC8vLyB0aGFuIDAuIFNlZSBIU0EgUHJvZ3JhbW1lcidzIFJlZmVyZW5jZSBNYW51YWwgZGVzY3JpcHRpb24gb2YKICAvLy8gbWF4ZmxhdGdyaWRzaXplIGNvbnRyb2wgZGlyZWN0aXZlLgogIHVpbnQzMl90IG1heF9mbGF0X2dyaWRfc2l6ZTsKCiAgLy8vIElmIG1heEZsYXRXb3JrZ3JvdXBTaXplIGlzIG5vdCBlbmFibGVkIHRoZW4gbXVzdCBiZSAwLCBvdGhlcndpc2UgbXVzdCBiZQogIC8vLyBncmVhdGVyIHRoYW4gMC4gU2VlIEhTQSBQcm9ncmFtbWVyJ3MgUmVmZXJlbmNlIE1hbnVhbCBkZXNjcmlwdGlvbiBvZgogIC8vLyBtYXhmbGF0d29ya2dyb3Vwc2l6ZSBjb250cm9sIGRpcmVjdGl2ZS4KICB1aW50MzJfdCBtYXhfZmxhdF93b3JrZ3JvdXBfc2l6ZTsKCiAgLy8vIElmIHJlcXVlc3RlZFdvcmtncm91cHNQZXJDdSBpcyBub3QgZW5hYmxlZCB0aGVuIG11c3QgYmUgMCwgYW5kIHRoZQogIC8vLyBmaW5hbGl6ZXIgaXMgZnJlZSB0byBnZW5lcmF0ZSBJU0EgdGhhdCBtYXkgcmVzdWx0IGluIGFueSBudW1iZXIgb2YKICAvLy8gd29yay1ncm91cHMgZXhlY3V0aW5nIG9uIGEgc2luZ2xlIGNvbXB1dGUgdW5pdC4gT3RoZXJ3aXNlLCB0aGUgZmluYWxpemVyCiAgLy8vIHNob3VsZCBhdHRlbXB0IHRvIGdlbmVyYXRlIElTQSB0aGF0IHdpbGwgYWxsb3cgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YKICAvLy8gd29yay1ncm91cHMgdG8gZXhlY3V0ZSBvbiBhIHNpbmdsZSBjb21wdXRlIHVuaXQuIFRoaXMgaXMgb25seSBhIGhpbnQgYW5kCiAgLy8vIGNhbiBiZSBpZ25vcmVkIGJ5IHRoZSBmaW5hbGl6ZXIuIElmIHRoZSBrZXJuZWwgYmVpbmcgZmluYWxpemVkLCBvciBhbnkgb2YKICAvLy8gdGhlIGZ1bmN0aW9ucyBpdCBjYWxscywgaGFzIGEgcmVxdWVzdGVkIGNvbnRyb2wgZGlyZWN0aXZlLCB0aGVuIHRoZSB2YWx1ZXMKICAvLy8gbXVzdCBiZSB0aGUgc2FtZS4gVGhpcyBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiByZXNvdXJjZXMKICAvLy8gdGhhdCBzaG91bGQgYmUgYWxsb2NhdGVkIHRvIGEgc2luZ2xlIHdvcmstZ3JvdXAgYW5kIHdvcmstaXRlbS4gRm9yIGV4YW1wbGUsCiAgLy8vIGEgbG93IHZhbHVlIG1heSBhbGxvdyBtb3JlIHJlc291cmNlcyB0byBiZSBhbGxvY2F0ZWQsIHJlc3VsdGluZyBpbiBoaWdoZXIKICAvLy8gcGVyIHdvcmstaXRlbSBwZXJmb3JtYW5jZSwgYXMgaXQgaXMga25vd24gdGhlcmUgd2lsbCBuZXZlciBiZSBtb3JlIHRoYW4gdGhlCiAgLy8vIHNwZWNpZmllZCBudW1iZXIgb2Ygd29yay1ncm91cHMgYWN0dWFsbHkgZXhlY3V0aW5nIG9uIHRoZSBjb21wdXRlCiAgLy8vIHVuaXQuIENvbnZlcnNlbHksIGEgaGlnaCB2YWx1ZSBtYXkgYWxsb2NhdGUgZmV3ZXIgcmVzb3VyY2VzLCByZXN1bHRpbmcgaW4KICAvLy8gbG93ZXIgcGVyIHdvcmstaXRlbSBwZXJmb3JtYW5jZSwgd2hpY2ggaXMgb2Zmc2V0IGJ5IHRoZSBmYWN0IGl0IGFsbG93cyBtb3JlCiAgLy8vIHdvcmstZ3JvdXBzIHRvIGFjdHVhbGx5IGV4ZWN1dGUgb24gdGhlIGNvbXB1dGUgdW5pdC4KICB1aW50MzJfdCByZXF1ZXN0ZWRfd29ya2dyb3Vwc19wZXJfY3U7CgogIC8vLyBJZiBub3QgZW5hYmxlZCB0aGVuIGFsbCBlbGVtZW50cyBmb3IgRGltMyBtdXN0IGJlIDAsIG90aGVyd2lzZSBldmVyeQogIC8vLyBlbGVtZW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuIFNlZSBIU0EgUHJvZ3JhbW1lcidzIFJlZmVyZW5jZSBNYW51YWwKICAvLy8gZGVzY3JpcHRpb24gb2YgcmVxdWlyZWRncmlkc2l6ZSBjb250cm9sIGRpcmVjdGl2ZS4KICBoc2FfZGltM190IHJlcXVpcmVkX2dyaWRfc2l6ZTsKCiAgLy8vIElmIHJlcXVpcmVkV29ya2dyb3VwU2l6ZSBpcyBub3QgZW5hYmxlZCB0aGVuIGFsbCBlbGVtZW50cyBmb3IgRGltMyBtdXN0IGJlCiAgLy8vIDAsIGFuZCB0aGUgcHJvZHVjZWQgY29kZSBjYW4gYmUgZGlzcGF0Y2hlZCB3aXRoIGFueSBsZWdhbCB3b3JrLWdyb3VwIHJhbmdlCiAgLy8vIGNvbnNpc3RlbnQgd2l0aCB0aGUgZGlzcGF0Y2ggZGltZW5zaW9ucy4gT3RoZXJ3aXNlLCB0aGUgY29kZSBwcm9kdWNlZCBtdXN0CiAgLy8vIGFsd2F5cyBiZSBkaXNwYXRjaGVkIHdpdGggdGhlIHNwZWNpZmllZCB3b3JrLWdyb3VwIHJhbmdlLiBObyBlbGVtZW50IG9mIHRoZQogIC8vLyBzcGVjaWZpZWQgcmFuZ2UgbXVzdCBiZSAwLiBJdCBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCByZXF1aXJlZF9kaW1lbnNpb25zCiAgLy8vIGFuZCBtYXhfZmxhdF93b3JrZ3JvdXBfc2l6ZS4gSWYgdGhlIGtlcm5lbCBiZWluZyBmaW5hbGl6ZWQsIG9yIGFueSBvZiB0aGUKICAvLy8gZnVuY3Rpb25zIGl0IGNhbGxzLCBoYXMgYSByZXF1aXJlZHdvcmtncm91cHNpemUgY29udHJvbCBkaXJlY3RpdmUsIHRoZW4gdGhlCiAgLy8vIHZhbHVlcyBtdXN0IGJlIHRoZSBzYW1lLiBTcGVjaWZ5aW5nIGEgdmFsdWUgY2FuIGFsbG93IHRoZSBmaW5hbGl6ZXIgdG8KICAvLy8gb3B0aW1pemUgd29yay1ncm91cCBpZCBvcGVyYXRpb25zLCBhbmQgaWYgdGhlIG51bWJlciBvZiB3b3JrLWl0ZW1zIGluIHRoZQogIC8vLyB3b3JrLWdyb3VwIGlzIGxlc3MgdGhhbiB0aGUgV0FWRVNJWkUgdGhlbiBiYXJyaWVyIG9wZXJhdGlvbnMgY2FuIGJlCiAgLy8vIG9wdGltaXplZCB0byBqdXN0IGEgbWVtb3J5IGZlbmNlLgogIGhzYV9kaW0zX3QgcmVxdWlyZWRfd29ya2dyb3VwX3NpemU7CgogIC8vLyBJZiByZXF1aXJlZERpbSBpcyBub3QgZW5hYmxlZCB0aGVuIG11c3QgYmUgMCBhbmQgdGhlIHByb2R1Y2VkIGtlcm5lbCBjb2RlCiAgLy8vIGNhbiBiZSBkaXNwYXRjaGVkIHdpdGggMSwgMiBvciAzIGRpbWVuc2lvbnMuIElmIGVuYWJsZWQgdGhlbiB0aGUgdmFsdWUgaXMKICAvLy8gMS4uMyBhbmQgdGhlIGNvZGUgcHJvZHVjZWQgbXVzdCBvbmx5IGJlIGRpc3BhdGNoZWQgd2l0aCBhIGRpbWVuc2lvbiB0aGF0CiAgLy8vIG1hdGNoZXMuIE90aGVyIHZhbHVlcyBhcmUgaWxsZWdhbC4gSWYgdGhlIGtlcm5lbCBiZWluZyBmaW5hbGl6ZWQsIG9yIGFueSBvZgogIC8vLyB0aGUgZnVuY3Rpb25zIGl0IGNhbGxzLCBoYXMgYSByZXF1aXJlZGRpbXNpemUgY29udHJvbCBkaXJlY3RpdmUsIHRoZW4gdGhlCiAgLy8vIHZhbHVlcyBtdXN0IGJlIHRoZSBzYW1lLiBUaGlzIGNhbiBiZSB1c2VkIHRvIG9wdGltaXplIHRoZSBjb2RlIGdlbmVyYXRlZCB0bwogIC8vLyBjb21wdXRlIHRoZSBhYnNvbHV0ZSBhbmQgZmxhdCB3b3JrLWdyb3VwIGFuZCB3b3JrLWl0ZW0gaWQsIGFuZCB0aGUgZGltCiAgLy8vIEhTQUlMIG9wZXJhdGlvbnMuCiAgdWludDhfdCByZXF1aXJlZF9kaW07CgogIC8vLyBSZXNlcnZlZC4gTXVzdCBiZSAwLgogIHVpbnQ4X3QgcmVzZXJ2ZWRbNzVdOwp9IGhzYV9leHRfY29udHJvbF9kaXJlY3RpdmVzX3Q7CgovLy8gQU1EIEtlcm5lbCBDb2RlIE9iamVjdCAoYW1kX2tlcm5lbF9jb2RlX3QpLiBHUFUgQ1AgdXNlcyB0aGUgQU1EIEtlcm5lbAovLy8gQ29kZSBPYmplY3QgdG8gc2V0IHVwIHRoZSBoYXJkd2FyZSB0byBleGVjdXRlIHRoZSBrZXJuZWwgZGlzcGF0Y2guCi8vLwovLy8gSW5pdGlhbCBLZXJuZWwgUmVnaXN0ZXIgU3RhdGUuCi8vLwovLy8gSW5pdGlhbCBrZXJuZWwgcmVnaXN0ZXIgc3RhdGUgd2lsbCBiZSBzZXQgdXAgYnkgQ1AvU1BJIHByaW9yIHRvIHRoZSBzdGFydAovLy8gb2YgZXhlY3V0aW9uIG9mIGV2ZXJ5IHdhdmVmcm9udC4gVGhpcyBpcyBsaW1pdGVkIGJ5IHRoZSBjb25zdHJhaW50cyBvZiB0aGUKLy8vIGN1cnJlbnQgaGFyZHdhcmUuCi8vLwovLy8gVGhlIG9yZGVyIG9mIHRoZSBTR1BSIHJlZ2lzdGVycyBpcyBkZWZpbmVkLCBidXQgdGhlIEZpbmFsaXplciBjYW4gc3BlY2lmeQovLy8gd2hpY2ggb25lcyBhcmUgYWN0dWFsbHkgc2V0dXAgaW4gdGhlIGFtZF9rZXJuZWxfY29kZV90IG9iamVjdCB1c2luZyB0aGUKLy8vIGVuYWJsZV9zZ3ByXyogYml0IGZpZWxkcy4gVGhlIHJlZ2lzdGVyIG51bWJlcnMgdXNlZCBmb3IgZW5hYmxlZCByZWdpc3RlcnMKLy8vIGFyZSBkZW5zZSBzdGFydGluZyBhdCBTR1BSMDogdGhlIGZpcnN0IGVuYWJsZWQgcmVnaXN0ZXIgaXMgU0dQUjAsIHRoZSBuZXh0Ci8vLyBlbmFibGVkIHJlZ2lzdGVyIGlzIFNHUFIxIGV0Yy47IGRpc2FibGVkIHJlZ2lzdGVycyBkbyBub3QgaGF2ZSBhbiBTR1BSCi8vLyBudW1iZXIuCi8vLwovLy8gVGhlIGluaXRpYWwgU0dQUnMgY29tcHJpc2UgdXAgdG8gMTYgVXNlciBTUkdQcyB0aGF0IGFyZSBzZXQgdXAgYnkgQ1AgYW5kCi8vLyBhcHBseSB0byBhbGwgd2F2ZXMgb2YgdGhlIGdyaWQuIEl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgbW9yZSB0aGFuIDE2IFVzZXIKLy8vIFNHUFJzIHVzaW5nIHRoZSBlbmFibGVfc2dwcl8qIGJpdCBmaWVsZHMsIGluIHdoaWNoIGNhc2Ugb25seSB0aGUgZmlyc3QgMTYKLy8vIGFyZSBhY3R1YWxseSBpbml0aWFsaXplZC4gVGhlc2UgYXJlIHRoZW4gaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgdGhlIFN5c3RlbQovLy8gU0dQUnMgdGhhdCBhcmUgc2V0IHVwIGJ5IEFEQy9TUEkgYW5kIGNhbiBoYXZlIGRpZmZlcmVudCB2YWx1ZXMgZm9yIGVhY2ggd2F2ZQovLy8gb2YgdGhlIGdyaWQgZGlzcGF0Y2guCi8vLwovLy8gU0dQUiByZWdpc3RlciBpbml0aWFsIHN0YXRlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKLy8vCi8vLyBQcml2YXRlIFNlZ21lbnQgQnVmZmVyIChlbmFibGVfc2dwcl9wcml2YXRlX3NlZ21lbnRfYnVmZmVyKToKLy8vICAgTnVtYmVyIG9mIFVzZXIgU0dQUiByZWdpc3RlcnM6IDQuIFYjIHRoYXQgY2FuIGJlIHVzZWQsIHRvZ2V0aGVyIHdpdGgKLy8vICAgU2NyYXRjaCBXYXZlIE9mZnNldCBhcyBhbiBvZmZzZXQsIHRvIGFjY2VzcyB0aGUgUHJpdmF0ZS9TcGlsbC9BcmcKLy8vICAgc2VnbWVudHMgdXNpbmcgYSBzZWdtZW50IGFkZHJlc3MuIEl0IG11c3QgYmUgc2V0IGFzIGZvbGxvd3M6Ci8vLyAgICAgLSBCYXNlIGFkZHJlc3M6IG9mIHRoZSBzY3JhdGNoIG1lbW9yeSBhcmVhIHVzZWQgYnkgdGhlIGRpc3BhdGNoLiBJdAovLy8gICAgICAgZG9lcyBub3QgaW5jbHVkZSB0aGUgc2NyYXRjaCB3YXZlIG9mZnNldC4gSXQgd2lsbCBiZSB0aGUgcGVyIHByb2Nlc3MKLy8vICAgICAgIFNIX0hJRERFTl9QUklWQVRFX0JBU0VfVk1JRCBwbHVzIGFueSBvZmZzZXQgZnJvbSB0aGlzIGRpc3BhdGNoIChmb3IKLy8vICAgICAgIGV4YW1wbGUgdGhlcmUgbWF5IGJlIGEgcGVyIHBpcGUgb2Zmc2V0LCBvciBwZXIgQVFMIFF1ZXVlIG9mZnNldCkuCi8vLyAgICAgLSBTdHJpZGUgKyBkYXRhX2Zvcm1hdDogRWxlbWVudCBTaXplICogSW5kZXggU3RyaWRlICg/Pz8pCi8vLyAgICAgLSBDYWNoZSBzd2l6emxlOiA/Pz8KLy8vICAgICAtIFN3aXp6bGUgZW5hYmxlOiBTSF9TVEFUSUNfTUVNX0NPTkZJRy5TV0laWkxFX0VOQUJMRSAobXVzdCBiZSAxIGZvcgovLy8gICAgICAgc2NyYXRjaCkKLy8vICAgICAtIE51bSByZWNvcmRzOiBGbGF0IFNjcmF0Y2ggV29yayBJdGVtIFNpemUgLyBFbGVtZW50IFNpemUgKD8/PykKLy8vICAgICAtIERzdF9zZWxfKjogPz8/Ci8vLyAgICAgLSBOdW1fZm9ybWF0OiA/Pz8KLy8vICAgICAtIEVsZW1lbnRfc2l6ZTogU0hfU1RBVElDX01FTV9DT05GSUcuRUxFTUVOVF9TSVpFICh3aWxsIGJlIERXT1JELCBtdXN0Ci8vLyAgICAgICBhZ3JlZSB3aXRoIGFtZF9rZXJuZWxfY29kZV90LnByaXZhdGVFbGVtZW50U2l6ZSkKLy8vICAgICAtIEluZGV4X3N0cmlkZTogU0hfU1RBVElDX01FTV9DT05GSUcuSU5ERVhfU1RSSURFICh3aWxsIGJlIDY0IGFzIG11c3QKLy8vICAgICAgIGJlIG51bWJlciBvZiB3YXZlZnJvbnQgbGFuZXMgZm9yIHNjcmF0Y2gsIG11c3QgYWdyZWUgd2l0aAovLy8gICAgICAgYW1kX2tlcm5lbF9jb2RlX3Qud2F2ZWZyb250U2l6ZSkKLy8vICAgICAtIEFkZCB0aWQgZW5hYmxlOiAxCi8vLyAgICAgLSBBVEM6IGZyb20gU0hfTUVNX0NPTkZJRy5QUklWQVRFX0FUQywKLy8vICAgICAtIEhhc2hfZW5hYmxlOiA/Pz8KLy8vICAgICAtIEhlYXA6ID8/PwovLy8gICAgIC0gTXR5cGU6IGZyb20gU0hfU1RBVElDX01FTV9DT05GSUcuUFJJVkFURV9NVFlQRQovLy8gICAgIC0gVHlwZTogMCAoYSBidWZmZXIpICg/Pz8pCi8vLwovLy8gRGlzcGF0Y2ggUHRyIChlbmFibGVfc2dwcl9kaXNwYXRjaF9wdHIpOgovLy8gICBOdW1iZXIgb2YgVXNlciBTR1BSIHJlZ2lzdGVyczogMi4gNjQgYml0IGFkZHJlc3Mgb2YgQVFMIGRpc3BhdGNoIHBhY2tldAovLy8gICBmb3Iga2VybmVsIGFjdHVhbGx5IGV4ZWN1dGluZy4KLy8vCi8vLyBRdWV1ZSBQdHIgKGVuYWJsZV9zZ3ByX3F1ZXVlX3B0cik6Ci8vLyAgIE51bWJlciBvZiBVc2VyIFNHUFIgcmVnaXN0ZXJzOiAyLiA2NCBiaXQgYWRkcmVzcyBvZiBBbWRRdWV1ZSBvYmplY3QgZm9yCi8vLyAgIEFRTCBxdWV1ZSBvbiB3aGljaCB0aGUgZGlzcGF0Y2ggcGFja2V0IHdhcyBxdWV1ZWQuCi8vLwovLy8gS2VybmFyZyBTZWdtZW50IFB0ciAoZW5hYmxlX3NncHJfa2VybmFyZ19zZWdtZW50X3B0cik6Ci8vLyAgIE51bWJlciBvZiBVc2VyIFNHUFIgcmVnaXN0ZXJzOiAyLiA2NCBiaXQgYWRkcmVzcyBvZiBLZXJuYXJnIHNlZ21lbnQuIFRoaXMKLy8vICAgaXMgZGlyZWN0bHkgY29waWVkIGZyb20gdGhlIGtlcm5hcmdQdHIgaW4gdGhlIGRpc3BhdGNoIHBhY2tldC4gSGF2aW5nIENQCi8vLyAgIGxvYWQgaXQgb25jZSBhdm9pZHMgbG9hZGluZyBpdCBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IHdhdmVmcm9udC4KLy8vCi8vLyBEaXNwYXRjaCBJZCAoZW5hYmxlX3NncHJfZGlzcGF0Y2hfaWQpOgovLy8gICBOdW1iZXIgb2YgVXNlciBTR1BSIHJlZ2lzdGVyczogMi4gNjQgYml0IERpc3BhdGNoIElEIG9mIHRoZSBkaXNwYXRjaAovLy8gICBwYWNrZXQgYmVpbmcgZXhlY3V0ZWQuCi8vLwovLy8gRmxhdCBTY3JhdGNoIEluaXQgKGVuYWJsZV9zZ3ByX2ZsYXRfc2NyYXRjaF9pbml0KToKLy8vICAgTnVtYmVyIG9mIFVzZXIgU0dQUiByZWdpc3RlcnM6IDIuIFRoaXMgaXMgMiBTR1BScy4KLy8vCi8vLyAgIEZvciBDSS9WSToKLy8vICAgICBUaGUgZmlyc3QgU0dQUiBpcyBhIDMyIGJpdCBieXRlIG9mZnNldCBmcm9tIFNIX01FTV9ISURERU5fUFJJVkFURV9CQVNFCi8vLyAgICAgdG8gYmFzZSBvZiBtZW1vcnkgZm9yIHNjcmF0Y2ggZm9yIHRoaXMgZGlzcGF0Y2guIFRoaXMgaXMgdGhlIHNhbWUgb2Zmc2V0Ci8vLyAgICAgdXNlZCBpbiBjb21wdXRpbmcgdGhlIFNjcmF0Y2ggU2VnbWVudCBCdWZmZXIgYmFzZSBhZGRyZXNzLiBUaGUgdmFsdWUgb2YKLy8vICAgICBTY3JhdGNoIFdhdmUgT2Zmc2V0IG11c3QgYmUgYWRkZWQgYnkgdGhlIGtlcm5lbCBjb2RlIGFuZCBtb3ZlZCB0bwovLy8gICAgIFNHUFJuLTQgZm9yIHVzZSBhcyB0aGUgRkxBVCBTQ1JBVENIIEJBU0UgaW4gZmxhdCBtZW1vcnkgaW5zdHJ1Y3Rpb25zLgovLy8KLy8vICAgICBUaGUgc2Vjb25kIFNHUFIgaXMgMzIgYml0IGJ5dGUgc2l6ZSBvZiBhIHNpbmdsZSB3b3JrLWl0ZW2ScyBzY3JhdGNoCi8vLyAgICAgbWVtb3J5IHVzYWdlLiBUaGlzIGlzIGRpcmVjdGx5IGxvYWRlZCBmcm9tIHRoZSBkaXNwYXRjaCBwYWNrZXQgUHJpdmF0ZQovLy8gICAgIFNlZ21lbnQgQnl0ZSBTaXplIGFuZCByb3VuZGVkIHVwIHRvIGEgbXVsdGlwbGUgb2YgRFdPUkQuCi8vLwovLy8gICAgIFx0b2RvIFtEb2VzIENQIG5lZWQgdG8gcm91bmQgdGhpcyB0byA+NCBieXRlIGFsaWdubWVudD9dCi8vLwovLy8gICAgIFRoZSBrZXJuZWwgY29kZSBtdXN0IG1vdmUgdG8gU0dQUm4tMyBmb3IgdXNlIGFzIHRoZSBGTEFUIFNDUkFUQ0ggU0laRSBpbgovLy8gICAgIGZsYXQgbWVtb3J5IGluc3RydWN0aW9ucy4gSGF2aW5nIENQIGxvYWQgaXQgb25jZSBhdm9pZHMgbG9hZGluZyBpdCBhdAovLy8gICAgIHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgd2F2ZWZyb250LgovLy8KLy8vICAgRm9yIFBJOgovLy8gICAgIFRoaXMgaXMgdGhlIDY0IGJpdCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHNjcmF0Y2ggYmFja2luZyBtZW1vcnkgZm9yCi8vLyAgICAgYWxsb2NhdGVkIGJ5IENQIGZvciB0aGlzIGRpc3BhdGNoLgovLy8KLy8vIFByaXZhdGUgU2VnbWVudCBTaXplIChlbmFibGVfc2dwcl9wcml2YXRlX3NlZ21lbnRfc2l6ZSk6Ci8vLyAgIE51bWJlciBvZiBVc2VyIFNHUFIgcmVnaXN0ZXJzOiAxLiBUaGUgMzIgYml0IGJ5dGUgc2l6ZSBvZiBhIHNpbmdsZQovLy8gICB3b3JrLWl0ZW2ScyBzY3JhdGNoIG1lbW9yeSBhbGxvY2F0aW9uLiBUaGlzIGlzIHRoZSB2YWx1ZSBmcm9tIHRoZSBkaXNwYXRjaAovLy8gICBwYWNrZXQuIFByaXZhdGUgU2VnbWVudCBCeXRlIFNpemUgcm91bmRlZCB1cCBieSBDUCB0byBhIG11bHRpcGxlIG9mIERXT1JELgovLy8KLy8vICAgXHRvZG8gW0RvZXMgQ1AgbmVlZCB0byByb3VuZCB0aGlzIHRvID40IGJ5dGUgYWxpZ25tZW50P10KLy8vCi8vLyAgIEhhdmluZyBDUCBsb2FkIGl0IG9uY2UgYXZvaWRzIGxvYWRpbmcgaXQgYXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeQovLy8gICB3YXZlZnJvbnQuCi8vLwovLy8gICBcdG9kbyBbVGhpcyB3aWxsIG5vdCBiZSB1c2VkIGZvciBDSS9WSSBzaW5jZSBpdCBpcyB0aGUgc2FtZSB2YWx1ZSBhcwovLy8gICB0aGUgc2Vjb25kIFNHUFIgb2YgRmxhdCBTY3JhdGNoIEluaXQuIEhvd2V2ZXIsIGl0IGlzIG5lZWQgZm9yIFBJIHdoaWNoCi8vLyAgIGNoYW5nZXMgbWVhbmluZyBvZiBGbGF0IFNjcmF0Y2hnIEluaXQuLl0KLy8vCi8vLyBHcmlkIFdvcmstR3JvdXAgQ291bnQgWCAoZW5hYmxlX3NncHJfZ3JpZF93b3JrZ3JvdXBfY291bnRfeCk6Ci8vLyAgIE51bWJlciBvZiBVc2VyIFNHUFIgcmVnaXN0ZXJzOiAxLiAzMiBiaXQgY291bnQgb2YgdGhlIG51bWJlciBvZgovLy8gICB3b3JrLWdyb3VwcyBpbiB0aGUgWCBkaW1lbnNpb24gZm9yIHRoZSBncmlkIGJlaW5nIGV4ZWN1dGVkLiBDb21wdXRlZCBmcm9tCi8vLyAgIHRoZSBmaWVsZHMgaW4gdGhlIEhzYURpc3BhdGNoUGFja2V0IGFzCi8vLyAgICgoZ3JpZFNpemUueCt3b3JrZ3JvdXBTaXplLngtMSkvd29ya2dyb3VwU2l6ZS54KS4KLy8vCi8vLyBHcmlkIFdvcmstR3JvdXAgQ291bnQgWSAoZW5hYmxlX3NncHJfZ3JpZF93b3JrZ3JvdXBfY291bnRfeSk6Ci8vLyAgIE51bWJlciBvZiBVc2VyIFNHUFIgcmVnaXN0ZXJzOiAxLiAzMiBiaXQgY291bnQgb2YgdGhlIG51bWJlciBvZgovLy8gICB3b3JrLWdyb3VwcyBpbiB0aGUgWSBkaW1lbnNpb24gZm9yIHRoZSBncmlkIGJlaW5nIGV4ZWN1dGVkLiBDb21wdXRlZCBmcm9tCi8vLyAgIHRoZSBmaWVsZHMgaW4gdGhlIEhzYURpc3BhdGNoUGFja2V0IGFzCi8vLyAgICgoZ3JpZFNpemUueSt3b3JrZ3JvdXBTaXplLnktMSkvd29ya2dyb3VwU2l6ZS55KS4KLy8vCi8vLyAgIE9ubHkgaW5pdGlhbGl6ZWQgaWYgPDE2IHByZXZpb3VzIFNHUFJzIGluaXRpYWxpemVkLgovLy8KLy8vIEdyaWQgV29yay1Hcm91cCBDb3VudCBaIChlbmFibGVfc2dwcl9ncmlkX3dvcmtncm91cF9jb3VudF96KToKLy8vICAgTnVtYmVyIG9mIFVzZXIgU0dQUiByZWdpc3RlcnM6IDEuIDMyIGJpdCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mCi8vLyAgIHdvcmstZ3JvdXBzIGluIHRoZSBaIGRpbWVuc2lvbiBmb3IgdGhlIGdyaWQgYmVpbmcgZXhlY3V0ZWQuIENvbXB1dGVkCi8vLyAgIGZyb20gdGhlIGZpZWxkcyBpbiB0aGUgSHNhRGlzcGF0Y2hQYWNrZXQgYXMKLy8vICAgKChncmlkU2l6ZS56K3dvcmtncm91cFNpemUuei0xKS93b3JrZ3JvdXBTaXplLnopLgovLy8KLy8vICAgT25seSBpbml0aWFsaXplZCBpZiA8MTYgcHJldmlvdXMgU0dQUnMgaW5pdGlhbGl6ZWQuCi8vLwovLy8gV29yay1Hcm91cCBJZCBYIChlbmFibGVfc2dwcl93b3JrZ3JvdXBfaWRfeCk6Ci8vLyAgIE51bWJlciBvZiBTeXN0ZW0gU0dQUiByZWdpc3RlcnM6IDEuIDMyIGJpdCB3b3JrIGdyb3VwIGlkIGluIFggZGltZW5zaW9uCi8vLyAgIG9mIGdyaWQgZm9yIHdhdmVmcm9udC4gQWx3YXlzIHByZXNlbnQuCi8vLwovLy8gV29yay1Hcm91cCBJZCBZIChlbmFibGVfc2dwcl93b3JrZ3JvdXBfaWRfeSk6Ci8vLyAgIE51bWJlciBvZiBTeXN0ZW0gU0dQUiByZWdpc3RlcnM6IDEuIDMyIGJpdCB3b3JrIGdyb3VwIGlkIGluIFkgZGltZW5zaW9uCi8vLyAgIG9mIGdyaWQgZm9yIHdhdmVmcm9udC4KLy8vCi8vLyBXb3JrLUdyb3VwIElkIFogKGVuYWJsZV9zZ3ByX3dvcmtncm91cF9pZF96KToKLy8vICAgTnVtYmVyIG9mIFN5c3RlbSBTR1BSIHJlZ2lzdGVyczogMS4gMzIgYml0IHdvcmsgZ3JvdXAgaWQgaW4gWiBkaW1lbnNpb24KLy8vICAgb2YgZ3JpZCBmb3Igd2F2ZWZyb250LiBJZiBwcmVzZW50IHRoZW4gV29yay1ncm91cCBJZCBZIHdpbGwgYWxzbyBiZQovLy8gICBwcmVzZW50Ci8vLwovLy8gV29yay1Hcm91cCBJbmZvIChlbmFibGVfc2dwcl93b3JrZ3JvdXBfaW5mbyk6Ci8vLyAgIE51bWJlciBvZiBTeXN0ZW0gU0dQUiByZWdpc3RlcnM6IDEuIHtmaXJzdF93YXZlLCAxNJJiMDAwMCwKLy8vICAgb3JkZXJlZF9hcHBlbmRfdGVybVsxMDowXSwgdGhyZWFkZ3JvdXBfc2l6ZV9pbl93YXZlc1s1OjBdfQovLy8KLy8vIFByaXZhdGUgU2VnbWVudCBXYXZlIEJ5dGUgT2Zmc2V0Ci8vLyAoZW5hYmxlX3NncHJfcHJpdmF0ZV9zZWdtZW50X3dhdmVfYnl0ZV9vZmZzZXQpOgovLy8gICBOdW1iZXIgb2YgU3lzdGVtIFNHUFIgcmVnaXN0ZXJzOiAxLiAzMiBiaXQgYnl0ZSBvZmZzZXQgZnJvbSBiYXNlIG9mCi8vLyAgIGRpc3BhdGNoIHNjcmF0Y2ggYmFzZS4gTXVzdCBiZSB1c2VkIGFzIGFuIG9mZnNldCB3aXRoIFByaXZhdGUvU3BpbGwvQXJnCi8vLyAgIHNlZ21lbnQgYWRkcmVzcyB3aGVuIHVzaW5nIFNjcmF0Y2ggU2VnbWVudCBCdWZmZXIuIEl0IG11c3QgYmUgYWRkZWQgdG8KLy8vICAgRmxhdCBTY3JhdGNoIE9mZnNldCBpZiBzZXR0aW5nIHVwIEZMQVQgU0NSQVRDSCBmb3IgZmxhdCBhZGRyZXNzaW5nLgovLy8KLy8vCi8vLyBUaGUgb3JkZXIgb2YgdGhlIFZHUFIgcmVnaXN0ZXJzIGlzIGRlZmluZWQsIGJ1dCB0aGUgRmluYWxpemVyIGNhbiBzcGVjaWZ5Ci8vLyB3aGljaCBvbmVzIGFyZSBhY3R1YWxseSBzZXR1cCBpbiB0aGUgYW1kX2tlcm5lbF9jb2RlX3Qgb2JqZWN0IHVzaW5nIHRoZQovLy8gZW5hYmxlVmdwciogIGJpdCBmaWVsZHMuIFRoZSByZWdpc3RlciBudW1iZXJzIHVzZWQgZm9yIGVuYWJsZWQgcmVnaXN0ZXJzCi8vLyBhcmUgZGVuc2Ugc3RhcnRpbmcgYXQgVkdQUjA6IHRoZSBmaXJzdCBlbmFibGVkIHJlZ2lzdGVyIGlzIFZHUFIwLCB0aGUgbmV4dAovLy8gZW5hYmxlZCByZWdpc3RlciBpcyBWR1BSMSBldGMuOyBkaXNhYmxlZCByZWdpc3RlcnMgZG8gbm90IGhhdmUgYW4gVkdQUgovLy8gbnVtYmVyLgovLy8KLy8vIFZHUFIgcmVnaXN0ZXIgaW5pdGlhbCBzdGF0ZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6Ci8vLwovLy8gV29yay1JdGVtIElkIFggKGFsd2F5cyBpbml0aWFsaXplZCk6Ci8vLyAgIE51bWJlciBvZiByZWdpc3RlcnM6IDEuIDMyIGJpdCB3b3JrIGl0ZW0gaWQgaW4gWCBkaW1lbnNpb24gb2Ygd29yay1ncm91cAovLy8gICBmb3Igd2F2ZWZyb250IGxhbmUuCi8vLwovLy8gV29yay1JdGVtIElkIFggKGVuYWJsZV92Z3ByX3dvcmtpdGVtX2lkID4gMCk6Ci8vLyAgIE51bWJlciBvZiByZWdpc3RlcnM6IDEuIDMyIGJpdCB3b3JrIGl0ZW0gaWQgaW4gWSBkaW1lbnNpb24gb2Ygd29yay1ncm91cAovLy8gICBmb3Igd2F2ZWZyb250IGxhbmUuCi8vLwovLy8gV29yay1JdGVtIElkIFggKGVuYWJsZV92Z3ByX3dvcmtpdGVtX2lkID4gMCk6Ci8vLyAgIE51bWJlciBvZiByZWdpc3RlcnM6IDEuIDMyIGJpdCB3b3JrIGl0ZW0gaWQgaW4gWiBkaW1lbnNpb24gb2Ygd29yay1ncm91cAovLy8gICBmb3Igd2F2ZWZyb250IGxhbmUuCi8vLwovLy8KLy8vIFRoZSBzZXR0aW5nIG9mIHJlZ2lzdGVycyBpcyBiZWluZyBkb25lIGJ5IGV4aXN0aW5nIEdQVSBoYXJkd2FyZSBhcyBmb2xsb3dzOgovLy8gICAxKSBTR1BScyBiZWZvcmUgdGhlIFdvcmstR3JvdXAgSWRzIGFyZSBzZXQgYnkgQ1AgdXNpbmcgdGhlIDE2IFVzZXIgRGF0YQovLy8gICAgICByZWdpc3RlcnMuCi8vLyAgIDIpIFdvcmstZ3JvdXAgSWQgcmVnaXN0ZXJzIFgsIFksIFogYXJlIHNldCBieSBTUEkgd2hpY2ggc3VwcG9ydHMgYW55Ci8vLyAgICAgIGNvbWJpbmF0aW9uIGluY2x1ZGluZyBub25lLgovLy8gICAzKSBTY3JhdGNoIFdhdmUgT2Zmc2V0IGlzIGFsc28gc2V0IGJ5IFNQSSB3aGljaCBpcyB3aHkgaXRzIHZhbHVlIGNhbm5vdAovLy8gICAgICBiZSBhZGRlZCBpbnRvIHRoZSB2YWx1ZSBGbGF0IFNjcmF0Y2ggT2Zmc2V0IHdoaWNoIHdvdWxkIGF2b2lkIHRoZQovLy8gICAgICBGaW5hbGl6ZXIgZ2VuZXJhdGVkIHByb2xvZyBoYXZpbmcgdG8gZG8gdGhlIGFkZC4KLy8vICAgNCkgVGhlIFZHUFJzIGFyZSBzZXQgYnkgU1BJIHdoaWNoIG9ubHkgc3VwcG9ydHMgc3BlY2lmeWluZyBlaXRoZXIgKFgpLAovLy8gICAgICAoWCwgWSkgb3IgKFgsIFksIFopLgovLy8KLy8vIEZsYXQgU2NyYXRjaCBEaXNwYXRjaCBPZmZzZXQgYW5kIEZsYXQgU2NyYXRjaCBTaXplIGFyZSBhZGphY2VudCBTR1JScyBzbwovLy8gdGhleSBjYW4gYmUgbW92ZWQgYXMgYSA2NCBiaXQgdmFsdWUgdG8gdGhlIGhhcmR3YXJlIHJlcXVpcmVkIFNHUFJuLTMgYW5kCi8vLyBTR1BSbi00IHJlc3BlY3RpdmVseSB1c2luZyB0aGUgRmluYWxpemVyID9GTEFUX1NDUkFUQ0g/IFJlZ2lzdGVyLgovLy8KLy8vIFRoZSBnbG9iYWwgc2VnbWVudCBjYW4gYmUgYWNjZXNzZWQgZWl0aGVyIHVzaW5nIGZsYXQgb3BlcmF0aW9ucyBvciBidWZmZXIKLy8vIG9wZXJhdGlvbnMuIElmIGJ1ZmZlciBvcGVyYXRpb25zIGFyZSB1c2VkIHRoZW4gdGhlIEdsb2JhbCBCdWZmZXIgdXNlZCB0bwovLy8gYWNjZXNzIEhTQUlMIEdsb2JhbC9SZWFkb25seS9LZXJuYXJnICh3aGljaCBhcmUgY29tYmluZSkgc2VnbWVudHMgdXNpbmcgYQovLy8gc2VnbWVudCBhZGRyZXNzIGlzIG5vdCBwYXNzZWQgaW50byB0aGUga2VybmVsIGNvZGUgYnkgQ1Agc2luY2UgaXRzIGJhc2UKLy8vIGFkZHJlc3MgaXMgYWx3YXlzIDAuIEluc3RlYWQgdGhlIEZpbmFsaXplciBnZW5lcmF0ZXMgcHJvbG9nIGNvZGUgdG8KLy8vIGluaXRpYWxpemUgNCBTR1BScyB3aXRoIGEgViMgdGhhdCBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzLCBhbmQgdGhlbgovLy8gdXNlcyB0aGF0IGluIHRoZSBidWZmZXIgaW5zdHJ1Y3Rpb25zOgovLy8gICAtIGJhc2UgYWRkcmVzcyBvZiAwCi8vLyAgIC0gbm8gc3dpenpsZQovLy8gICAtIEFUQz0xCi8vLyAgIC0gTVRZUEUgc2V0IHRvIHN1cHBvcnQgbWVtb3J5IGNvaGVyZW5jZSBzcGVjaWZpZWQgaW4KLy8vICAgICBhbWRfa2VybmVsX2NvZGVfdC5nbG9iYWxNZW1vcnlDb2hlcmVuY2UKLy8vCi8vLyBXaGVuIHRoZSBHbG9iYWwgQnVmZmVyIGlzIHVzZWQgdG8gYWNjZXNzIHRoZSBLZXJuYXJnIHNlZ21lbnQsIG11c3QgYWRkIHRoZQovLy8gZGlzcGF0Y2ggcGFja2V0IGtlcm5BcmdQdHIgdG8gYSBrZXJuYXJnIHNlZ21lbnQgYWRkcmVzcyBiZWZvcmUgdXNpbmcgdGhpcyBWIy4KLy8vIEFsdGVybmF0aXZlbHkgc2NhbGFyIGxvYWRzIGNhbiBiZSB1c2VkIGlmIHRoZSBrZXJuYXJnIG9mZnNldCBpcyB1bmlmb3JtLCBhcwovLy8gdGhlIGtlcm5hcmcgc2VnbWVudCBpcyBjb25zdGFudCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBrZXJuZWwgZXhlY3V0aW9uLgovLy8KdHlwZWRlZiBzdHJ1Y3QgYW1kX2tlcm5lbF9jb2RlX3MgewogIC8vLyBUaGUgQU1EIG1ham9yIHZlcnNpb24gb2YgdGhlIENvZGUgT2JqZWN0LiBNdXN0IGJlIHRoZSB2YWx1ZQogIC8vLyBBTURfQ09ERV9WRVJTSU9OX01BSk9SLgogIGFtZF9jb2RlX3ZlcnNpb24zMl90IGFtZF9jb2RlX3ZlcnNpb25fbWFqb3I7CgogIC8vLyBUaGUgQU1EIG1pbm9yIHZlcnNpb24gb2YgdGhlIENvZGUgT2JqZWN0LiBNaW5vciB2ZXJzaW9ucyBtdXN0IGJlCiAgLy8vIGJhY2t3YXJkIGNvbXBhdGlibGUuIE11c3QgYmUgdGhlIHZhbHVlCiAgLy8vIEFNRF9DT0RFX1ZFUlNJT05fTUlOT1IuCiAgYW1kX2NvZGVfdmVyc2lvbjMyX3QgYW1kX2NvZGVfdmVyc2lvbl9taW5vcjsKCiAgLy8vIFRoZSBieXRlIHNpemUgb2YgdGhpcyBzdHJ1Y3QuIE11c3QgYmUgc2V0IHRvCiAgLy8vIHNpemVvZihhbWRfa2VybmVsX2NvZGVfdCkuIFVzZWQgZm9yIGJhY2t3YXJkCiAgLy8vIGNvbXBhdGliaWxpdHkuCiAgdWludDMyX3Qgc3RydWN0X2J5dGVfc2l6ZTsKCiAgLy8vIFRoZSB0YXJnZXQgY2hpcCBpbnN0cnVjdGlvbiBzZXQgZm9yIHdoaWNoIGNvZGUgaGFzIGJlZW4KICAvLy8gZ2VuZXJhdGVkLiBWYWx1ZXMgYXJlIGZyb20gdGhlIEVfU0NfSU5TVFJVQ1RJT05fU0VUIGVudW1lcmF0aW9uCiAgLy8vIGluIHNjL0ludGVyZmFjZS9TQ0NvbW1vbi5oLgogIHVpbnQzMl90IHRhcmdldF9jaGlwOwoKICAvLy8gQnl0ZSBvZmZzZXQgKHBvc3NpYmx5IG5lZ2F0aXZlKSBmcm9tIHN0YXJ0IG9mIGFtZF9rZXJuZWxfY29kZV90CiAgLy8vIG9iamVjdCB0byBrZXJuZWwncyBlbnRyeSBwb2ludCBpbnN0cnVjdGlvbi4gVGhlIGFjdHVhbCBjb2RlIGZvcgogIC8vLyB0aGUga2VybmVsIGlzIHJlcXVpcmVkIHRvIGJlIDI1NiBieXRlIGFsaWduZWQgdG8gbWF0Y2ggaGFyZHdhcmUKICAvLy8gcmVxdWlyZW1lbnRzIChTUSBjYWNoZSBsaW5lIGlzIDE2KS4gVGhlIGNvZGUgbXVzdCBiZSBwb3NpdGlvbgogIC8vLyBpbmRlcGVuZGVudCBjb2RlIChQSUMpIGZvciBBTUQgZGV2aWNlcyB0byBnaXZlIHJ1bnRpbWUgdGhlCiAgLy8vIG9wdGlvbiBvZiBjb3B5aW5nIGNvZGUgdG8gZGlzY3JldGUgR1BVIG1lbW9yeSBvciBBUFUgTDIKICAvLy8gY2FjaGUuIFRoZSBGaW5hbGl6ZXIgc2hvdWxkIGVuZGVhdm91ciB0byBhbGxvY2F0ZSBhbGwga2VybmVsCiAgLy8vIG1hY2hpbmUgY29kZSBpbiBjb250aWd1b3VzIG1lbW9yeSBwYWdlcyBzbyB0aGF0IGEgZGV2aWNlCiAgLy8vIHByZS1mZXRjaGVyIHdpbGwgdGVuZCB0byBvbmx5IHByZS1mZXRjaCBLZXJuZWwgQ29kZSBvYmplY3RzLAogIC8vLyBpbXByb3ZpbmcgY2FjaGUgcGVyZm9ybWFuY2UuCiAgaW50NjRfdCBrZXJuZWxfY29kZV9lbnRyeV9ieXRlX29mZnNldDsKCiAgLy8vIFJhbmdlIG9mIGJ5dGVzIHRvIGNvbnNpZGVyIHByZWZldGNoaW5nIGV4cHJlc3NlZCBhcyBhbiBvZmZzZXQKICAvLy8gYW5kIHNpemUuIFRoZSBvZmZzZXQgaXMgZnJvbSB0aGUgc3RhcnQgKHBvc3NpYmx5IG5lZ2F0aXZlKSBvZgogIC8vLyBhbWRfa2VybmVsX2NvZGVfdCBvYmplY3QuIFNldCBib3RoIHRvIDAgaWYgbm8gcHJlZmV0Y2gKICAvLy8gaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLgogIC8vLwogIC8vLyBcdG9kbyB0dHllIDExLzE1LzIwMTMgSXMgdGhlIHByZWZldGNoIGRlZmluaXRpb24gd2Ugd2FudD8gRGlkCiAgLy8vIG5vdCBtYWtlIHRoZSBzaXplIGEgdWludDY0X3QgYXMgcHJlZmV0Y2hpbmcgbW9yZSB0aGFuIDRHaUIgc2VlbXMKICAvLy8gZXhjZXNzaXZlLgogIGludDY0X3Qga2VybmVsX2NvZGVfcHJlZmV0Y2hfYnl0ZV9vZmZzZXQ7CiAgdWludDY0X3Qga2VybmVsX2NvZGVfcHJlZmV0Y2hfYnl0ZV9zaXplOwoKICAvLy8gTnVtYmVyIG9mIGJ5dGVzIG9mIHNjcmF0Y2ggYmFja2luZyBtZW1vcnkgcmVxdWlyZWQgZm9yIGZ1bGwKICAvLy8gb2NjdXBhbmN5IG9mIHRhcmdldCBjaGlwLiBUaGlzIHRha2VzIGludG8gYWNjb3VudCB0aGUgbnVtYmVyIG9mCiAgLy8vIGJ5dGVzIG9mIHNjcmF0Y2ggcGVyIHdvcmstaXRlbSwgdGhlIHdhdmVmcm9udCBzaXplLCB0aGUgbWF4aW11bQogIC8vLyBudW1iZXIgb2Ygd2F2ZWZyb250cyBwZXIgQ1UsIGFuZCB0aGUgbnVtYmVyIG9mIENVcy4gVGhpcyBpcyBhbgogIC8vLyB1cHBlciBsaW1pdCBvbiBzY3JhdGNoLiBJZiB0aGUgZ3JpZCBiZWluZyBkaXNwYXRjaGVkIGlzIHNtYWxsIGl0CiAgLy8vIG1heSBvbmx5IG5lZWQgbGVzcyB0aGFuIHRoaXMuIElmIHRoZSBrZXJuZWwgdXNlcyBubyBzY3JhdGNoLCBvcgogIC8vLyB0aGUgRmluYWxpemVyIGhhcyBub3QgY29tcHV0ZWQgdGhpcyB2YWx1ZSwgaXQgbXVzdCBiZSAwLgogIHVpbnQ2NF90IG1heF9zY3JhdGNoX2JhY2tpbmdfbWVtb3J5X2J5dGVfc2l6ZTsKCiAgLy8vIFNoYWRlciBwcm9ncmFtIHNldHRpbmdzIGZvciBDUy4gQ29udGFpbnMgQ09NUFVURV9QR01fUlNSQzEgYW5kCiAgLy8vIENPTVBVVEVfUEdNX1JTUkMyIHJlZ2lzdGVycy4KICBhbWRfY29tcHV0ZV9wZ21fcmVzb3VyY2VfcmVnaXN0ZXI2NF90IGNvbXB1dGVfcGdtX3Jlc291cmNlX3JlZ2lzdGVyczsKCiAgLy8vIENvZGUgcHJvcGVydGllcy4gU2VlIGFtZF9jb2RlX3Byb3BlcnR5X21hc2tfdCBmb3IgYSBmdWxsIGxpc3Qgb2YKICAvLy8gcHJvcGVydGllcy4KICBhbWRfY29kZV9wcm9wZXJ0eTMyX3QgY29kZV9wcm9wZXJ0aWVzOwoKICAvLy8gVGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgZm9yIHRoZSBjb21iaW5lZCBwcml2YXRlLCBzcGlsbAogIC8vLyBhbmQgYXJnIHNlZ21lbnRzIGZvciBhIHdvcmstaXRlbSBpbiBieXRlcy4gSWYKICAvLy8gaXNfZHluYW1pY19jYWxsc3RhY2sgaXMgMSB0aGVuIGFkZGl0aW9uYWwgc3BhY2UgbXVzdCBiZSBhZGRlZCB0bwogIC8vLyB0aGlzIHZhbHVlIGZvciB0aGUgY2FsbCBzdGFjay4KICB1aW50MzJfdCB3b3JraXRlbV9wcml2YXRlX3NlZ21lbnRfYnl0ZV9zaXplOwoKICAvLy8gVGhlIGFtb3VudCBvZiBncm91cCBzZWdtZW50IG1lbW9yeSByZXF1aXJlZCBieSBhIHdvcmstZ3JvdXAgaW4KICAvLy8gYnl0ZXMuIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBhbnkgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGdyb3VwCiAgLy8vIHNlZ21lbnQgbWVtb3J5IHRoYXQgbWF5IGJlIGFkZGVkIHdoZW4gdGhlIGtlcm5lbCBpcwogIC8vLyBkaXNwYXRjaGVkLgogIHVpbnQzMl90IHdvcmtncm91cF9ncm91cF9zZWdtZW50X2J5dGVfc2l6ZTsKCiAgLy8vIE51bWJlciBvZiBieXRlIG9mIEdEUyByZXF1aXJlZCBieSBrZXJuZWwgZGlzcGF0Y2guIE11c3QgYmUgMCBpZgogIC8vLyBub3QgdXNpbmcgR0RTLgogIHVpbnQzMl90IGdkc19zZWdtZW50X2J5dGVfc2l6ZTsKCiAgLy8vIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBrZXJuYXJnIHNlZ21lbnQgdGhhdCBob2xkcyB0aGUgdmFsdWVzCiAgLy8vIG9mIHRoZSBhcmd1bWVudHMgdG8gdGhlIGtlcm5lbC4gVGhpcyBjb3VsZCBiZSB1c2VkIGJ5IENQIHRvCiAgLy8vIHByZWZldGNoIHRoZSBrZXJuYXJnIHNlZ21lbnQgcG9pbnRlZCB0byBieSB0aGUgZGlzcGF0Y2ggcGFja2V0LgogIHVpbnQ2NF90IGtlcm5hcmdfc2VnbWVudF9ieXRlX3NpemU7CgogIC8vLyBOdW1iZXIgb2YgZmJhcnJpZXIncyB1c2VkIGluIHRoZSBrZXJuZWwgYW5kIGFsbCBmdW5jdGlvbnMgaXQKICAvLy8gY2FsbHMuIElmIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGdyb3VwIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUKICAvLy8gZmJhcnJpZXJzIHRoZW4gdGhhdCBhbW91bnQgbXVzdCBhbHJlYWR5IGJlIGluY2x1ZGVkIGluIHRoZQogIC8vLyB3b3JrZ3JvdXBfZ3JvdXBfc2VnbWVudF9ieXRlX3NpemUgdG90YWwuCiAgdWludDMyX3Qgd29ya2dyb3VwX2ZiYXJyaWVyX2NvdW50OwoKICAvLy8gTnVtYmVyIG9mIHNjYWxhciByZWdpc3RlcnMgdXNlZCBieSBhIHdhdmVmcm9udC4gVGhpcyBpbmNsdWRlcwogIC8vLyB0aGUgc3BlY2lhbCBTR1BScyBmb3IgVkNDLCBGbGF0IFNjcmF0Y2ggQmFzZSwgRmxhdCBTY3JhdGNoIFNpemUKICAvLy8gYW5kIFhOQUNLIChmb3IgR0ZYOCAoVkkpKS4gSXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgMTYgU0dQUiBhZGRlZCBpZiBhCiAgLy8vIHRyYXAgaGFuZGxlciBpcyBlbmFibGVkLiBVc2VkIHRvIHNldCBDT01QVVRFX1BHTV9SU1JDMS5TR1BSUy4KICB1aW50MTZfdCB3YXZlZnJvbnRfc2dwcl9jb3VudDsKCiAgLy8vIE51bWJlciBvZiB2ZWN0b3IgcmVnaXN0ZXJzIHVzZWQgYnkgZWFjaCB3b3JrLWl0ZW0uIFVzZWQgdG8gc2V0CiAgLy8vIENPTVBVVEVfUEdNX1JTUkMxLlZHUFJTLgogIHVpbnQxNl90IHdvcmtpdGVtX3ZncHJfY291bnQ7CgogIC8vLyBJZiByZXNlcnZlZF92Z3ByX2NvdW50IGlzIDAgdGhlbiBtdXN0IGJlIDAuIE90aGVyd2lzZSwgdGhpcyBpcyB0aGUKICAvLy8gZmlyc3QgZml4ZWQgVkdQUiBudW1iZXIgcmVzZXJ2ZWQuCiAgdWludDE2X3QgcmVzZXJ2ZWRfdmdwcl9maXJzdDsKCiAgLy8vIFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgVkdQUnMgcmVzZXJ2ZWQgYnkgdGhlIGNsaWVudC4gSWYKICAvLy8gaXNfZGVidWdfc3VwcG9ydGVkIHRoZW4gdGhpcyBjb3VudCBpbmNsdWRlcyBWR1BScyByZXNlcnZlZAogIC8vLyBmb3IgZGVidWdnZXIgdXNlLgogIHVpbnQxNl90IHJlc2VydmVkX3ZncHJfY291bnQ7CgogIC8vLyBJZiByZXNlcnZlZF9zZ3ByX2NvdW50IGlzIDAgdGhlbiBtdXN0IGJlIDAuIE90aGVyd2lzZSwgdGhpcyBpcyB0aGUKICAvLy8gZmlyc3QgZml4ZWQgU0dQUiBudW1iZXIgcmVzZXJ2ZWQuCiAgdWludDE2X3QgcmVzZXJ2ZWRfc2dwcl9maXJzdDsKCiAgLy8vIFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgU0dQUnMgcmVzZXJ2ZWQgYnkgdGhlIGNsaWVudC4gSWYKICAvLy8gaXNfZGVidWdfc3VwcG9ydGVkIHRoZW4gdGhpcyBjb3VudCBpbmNsdWRlcyBTR1BScyByZXNlcnZlZAogIC8vLyBmb3IgZGVidWdnZXIgdXNlLgogIHVpbnQxNl90IHJlc2VydmVkX3NncHJfY291bnQ7CgogIC8vLyBJZiBpc19kZWJ1Z19zdXBwb3J0ZWQgaXMgMCB0aGVuIG11c3QgYmUgMC4gT3RoZXJ3aXNlLCB0aGlzIGlzIHRoZQogIC8vLyBmaXhlZCBTR1BSIG51bWJlciB1c2VkIHRvIGhvbGQgdGhlIHdhdmUgc2NyYXRjaCBvZmZzZXQgZm9yIHRoZQogIC8vLyBlbnRpcmUga2VybmVsIGV4ZWN1dGlvbiwgb3IgdWludDE2X3QoLTEpIGlmIHRoZSByZWdpc3RlciBpcyBub3QKICAvLy8gdXNlZCBvciBub3Qga25vd24uCiAgdWludDE2X3QgZGVidWdfd2F2ZWZyb250X3ByaXZhdGVfc2VnbWVudF9vZmZzZXRfc2dwcjsKCiAgLy8vIElmIGlzX2RlYnVnX3N1cHBvcnRlZCBpcyAwIHRoZW4gbXVzdCBiZSAwLiBPdGhlcndpc2UsIHRoaXMgaXMgdGhlCiAgLy8vIGZpeGVkIFNHUFIgbnVtYmVyIG9mIHRoZSBmaXJzdCBvZiA0IFNHUFJzIHVzZWQgdG8gaG9sZCB0aGUKICAvLy8gc2NyYXRjaCBWIyB1c2VkIGZvciB0aGUgZW50aXJlIGtlcm5lbCBleGVjdXRpb24sIG9yIHVpbnQxNl90KC0xKQogIC8vLyBpZiB0aGUgcmVnaXN0ZXJzIGFyZSBub3QgdXNlZCBvciBub3Qga25vd24uCiAgdWludDE2X3QgZGVidWdfcHJpdmF0ZV9zZWdtZW50X2J1ZmZlcl9zZ3ByOwoKICAvLy8gVGhlIG1heGltdW0gYnl0ZSBhbGlnbm1lbnQgb2YgdmFyaWFibGVzIHVzZWQgYnkgdGhlIGtlcm5lbCBpbgogIC8vLyB0aGUgc3BlY2lmaWVkIG1lbW9yeSBzZWdtZW50LiBFeHByZXNzZWQgYXMgYSBwb3dlciBvZiB0d28uIE11c3QKICAvLy8gYmUgYXQgbGVhc3QgSFNBX1BPV0VSVFdPXzE2LgogIGhzYV9wb3dlcnR3bzhfdCBrZXJuYXJnX3NlZ21lbnRfYWxpZ25tZW50OwogIGhzYV9wb3dlcnR3bzhfdCBncm91cF9zZWdtZW50X2FsaWdubWVudDsKICBoc2FfcG93ZXJ0d284X3QgcHJpdmF0ZV9zZWdtZW50X2FsaWdubWVudDsKCiAgdWludDhfdCByZXNlcnZlZDM7CgogIC8vLyBUeXBlIG9mIGNvZGUgb2JqZWN0LgogIGhzYV9leHRfY29kZV9raW5kMzJfdCBjb2RlX3R5cGU7CgogIC8vLyBSZXNlcnZlZCBmb3IgY29kZSBwcm9wZXJ0aWVzIGlmIGFueSBhcmUgZGVmaW5lZCBpbiB0aGUgZnV0dXJlLgogIC8vLyBUaGVyZSBhcmUgY3VycmVudGx5IG5vIGNvZGUgcHJvcGVydGllcyBzbyB0aGlzIGZpZWxkIG11c3QgYmUgMC4KICB1aW50MzJfdCByZXNlcnZlZDQ7CgogIC8vLyBXYXZlZnJvbnQgc2l6ZSBleHByZXNzZWQgYXMgYSBwb3dlciBvZiB0d28uIE11c3QgYmUgYSBwb3dlciBvZiAyCiAgLy8vIGluIHJhbmdlIDEuLjY0IGluY2x1c2l2ZS4gVXNlZCB0byBzdXBwb3J0IHJ1bnRpbWUgcXVlcnkgdGhhdAogIC8vLyBvYnRhaW5zIHdhdmVmcm9udCBzaXplLCB3aGljaCBtYXkgYmUgdXNlZCBieSBhcHBsaWNhdGlvbiB0bwogIC8vLyBhbGxvY2F0ZWQgZHluYW1pYyBncm91cCBtZW1vcnkgYW5kIHNldCB0aGUgZGlzcGF0Y2ggd29yay1ncm91cAogIC8vLyBzaXplLgogIGhzYV9wb3dlcnR3bzhfdCB3YXZlZnJvbnRfc2l6ZTsKCiAgLy8vIFRoZSBvcHRpbWl6YXRpb24gbGV2ZWwgc3BlY2lmaWVkIHdoZW4gdGhlIGtlcm5lbCB3YXMKICAvLy8gZmluYWxpemVkLgogIHVpbnQ4X3Qgb3B0aW1pemF0aW9uX2xldmVsOwoKICAvLy8gVGhlIEhTQUlMIHByb2ZpbGUgZGVmaW5lcyB3aGljaCBmZWF0dXJlcyBhcmUgdXNlZC4gVGhpcwogIC8vLyBpbmZvcm1hdGlvbiBpcyBmcm9tIHRoZSBIU0FJTCB2ZXJzaW9uIGRpcmVjdGl2ZS4gSWYgdGhpcwogIC8vLyBhbWRfa2VybmVsX2NvZGVfdCBpcyBub3QgZ2VuZXJhdGVkIGZyb20gYW4gSFNBSUwgY29tcGlsYXRpb24KICAvLy8gdW5pdCB0aGVuIG11c3QgYmUgMC4KICBoc2FfZXh0X2JyaWdfcHJvZmlsZThfdCBoc2FpbF9wcm9maWxlOwoKICAvLy8gVGhlIEhTQUlMIG1hY2hpbmUgbW9kZWwgZ2l2ZXMgdGhlIGFkZHJlc3Mgc2l6ZXMgdXNlZCBieSB0aGUKICAvLy8gY29kZS4gVGhpcyBpbmZvcm1hdGlvbiBpcyBmcm9tIHRoZSBIU0FJTCB2ZXJzaW9uIGRpcmVjdGl2ZS4gSWYKICAvLy8gbm90IGdlbmVyYXRlZCBmcm9tIGFuIEhTQUlMIGNvbXBpbGF0aW9uIHVuaXQgdGhlbiBtdXN0IHN0aWxsCiAgLy8vIGluZGljYXRlIGZvciB3aGF0IG1hY2hpbmUgbW9kZSB0aGUgY29kZSBpcyBnZW5lcmF0ZWQuCiAgaHNhX2V4dF9icmlnX21hY2hpbmVfbW9kZWw4X3QgaHNhaWxfbWFjaGluZV9tb2RlbDsKCiAgLy8vIFRoZSBIU0FJTCBtYWpvciB2ZXJzaW9uLiBUaGlzIGluZm9ybWF0aW9uIGlzIGZyb20gdGhlIEhTQUlMCiAgLy8vIHZlcnNpb24gZGlyZWN0aXZlLiBJZiB0aGlzIGFtZF9rZXJuZWxfY29kZV90IGlzIG5vdAogIC8vLyBnZW5lcmF0ZWQgZnJvbSBhbiBIU0FJTCBjb21waWxhdGlvbiB1bml0IHRoZW4gbXVzdCBiZSAwLgogIHVpbnQzMl90IGhzYWlsX3ZlcnNpb25fbWFqb3I7CgogIC8vLyBUaGUgSFNBSUwgbWlub3IgdmVyc2lvbi4gVGhpcyBpbmZvcm1hdGlvbiBpcyBmcm9tIHRoZSBIU0FJTAogIC8vLyB2ZXJzaW9uIGRpcmVjdGl2ZS4gSWYgdGhpcyBhbWRfa2VybmVsX2NvZGVfdCBpcyBub3QKICAvLy8gZ2VuZXJhdGVkIGZyb20gYW4gSFNBSUwgY29tcGlsYXRpb24gdW5pdCB0aGVuIG11c3QgYmUgMC4KICB1aW50MzJfdCBoc2FpbF92ZXJzaW9uX21pbm9yOwoKICAvLy8gUmVzZXJ2ZWQgZm9yIEhTQUlMIHRhcmdldCBvcHRpb25zIGlmIGFueSBhcmUgZGVmaW5lZCBpbiB0aGUKICAvLy8gZnV0dXJlLiBUaGVyZSBhcmUgY3VycmVudGx5IG5vIHRhcmdldCBvcHRpb25zIHNvIHRoaXMgZmllbGQKICAvLy8gbXVzdCBiZSAwLgogIHVpbnQxNl90IHJlc2VydmVkNTsKCiAgLy8vIFJlc2VydmVkLiBNdXN0IGJlIDAuCiAgdWludDE2X3QgcmVzZXJ2ZWQ2OwoKICAvLy8gVGhlIHZhbHVlcyBzaG91bGQgYmUgdGhlIGFjdHVhbGx5IHZhbHVlcyB1c2VkIGJ5IHRoZSBmaW5hbGl6ZXIKICAvLy8gaW4gZ2VuZXJhdGluZyB0aGUgY29kZS4gVGhpcyBtYXkgYmUgdGhlIHVuaW9uIG9mIHZhbHVlcwogIC8vLyBzcGVjaWZpZWQgYXMgZmluYWxpemVyIGFyZ3VtZW50cyBhbmQgZXhwbGljaXQgSFNBSUwgY29udHJvbAogIC8vLyBkaXJlY3RpdmVzLiBJZiB0aGUgZmluYWxpemVyIGNob29zZXMgdG8gaWdub3JlIGEgY29udHJvbAogIC8vLyBkaXJlY3RpdmUsIGFuZCBub3QgZ2VuZXJhdGUgY29uc3RyYWluZWQgY29kZSwgdGhlbiB0aGUgY29udHJvbAogIC8vLyBkaXJlY3RpdmUgc2hvdWxkIG5vdCBiZSBtYXJrZWQgYXMgZW5hYmxlZCBldmVuIHRob3VnaCBpdCB3YXMKICAvLy8gcHJlc2VudCBpbiB0aGUgSFNBSUwgb3IgZmluYWxpemVyIGFyZ3VtZW50LiBUaGUgdmFsdWVzIGFyZQogIC8vLyBpbnRlbmRlZCB0byByZWZsZWN0IHRoZSBjb25zdHJhaW50cyB0aGF0IHRoZSBjb2RlIGFjdHVhbGx5CiAgLy8vIHJlcXVpcmVzIHRvIGNvcnJlY3RseSBleGVjdXRlLCBub3QgdGhlIHZhbHVlcyB0aGF0IHdlcmUKICAvLy8gYWN0dWFsbHkgc3BlY2lmaWVkIGF0IGZpbmFsaXplIHRpbWUuCiAgaHNhX2V4dF9jb250cm9sX2RpcmVjdGl2ZXNfdCBjb250cm9sX2RpcmVjdGl2ZTsKCiAgLy8vIFRoZSBjb2RlIGNhbiBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIGFtZF9rZXJuZWxfY29kZV90LCBvciBjYW4KICAvLy8gY29tZSBhZnRlciBzdWJzZXF1ZW50IGFtZF9rZXJuZWxfY29kZV90IHN0cnVjdHMgd2hlbiB0aGVyZSBhcmUKICAvLy8gbXVsdGlwbGUga2VybmVscyBpbiB0aGUgY29tcGlsYXRpb24gdW5pdC4KCn0gYW1kX2tlcm5lbF9jb2RlX3Q7CgojZW5kaWYgLy8gQU1ES0VSTkVMQ09ERVRfSAo=