LyoKRGF0ZTogVHVlLCAxNiBNYXIgMjAwNCAxOTozODo0MCAtMDgwMApGcm9tOiBIYXJvbGQgTGV2eSA8SGFyb2xkLkxldnlAc3lub3BzeXMuY29tPgpTdWJqZWN0OiBmZ2V0cyhzdGRpbikgLS0+IHJlYWRsaW5lKCkgcmVkaXJlY3RvcgpUbzogY2hldEBwby5jd3J1LmVkdQoKSGkgQ2hldCwKCkhlcmUgaXMgc29tZXRoaW5nIHlvdSBtYXkgZmluZCB1c2VmdWwgZW5vdWdoIHRvIGluY2x1ZGUgaW4gdGhlIHJlYWRsaW5lCmRpc3RyaWJ1dGlvbi4gIEl0IGlzIGEgc2hhcmVkIGxpYnJhcnkgdGhhdCByZWRpcmVjdHMgY2FsbHMgdG8gZmdldHMoc3RkaW4pCnRvIHJlYWRsaW5lKCkgdmlhIExEX1BSRUxPQUQsIGFuZCBpdCBzdXBwb3J0cyBhIGN1c3RvbSBwcm9tcHQgYW5kIGxpc3Qgb2YKY29tbWFuZCBuYW1lcy4gIE1hbnkgcGVvcGxlIGhhdmUgYXNrZWQgbWUgZm9yIHRoaXMgZmlsZSwgc28gSSB0aG91Z2h0IEknZApwYXNzIGl0IHlvdXIgd2F5IGluIGhvcGUgb2YganVzdCBpbmNsdWRpbmcgaXQgd2l0aCByZWFkbGluZSB0byBiZWdpbiB3aXRoLgoKQmVzdCBSZWdhcmRzLAoKLUhhcm9sZAoqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgCiAgRklMRSBOQU1FOiAgICBmZ2V0cy5jICAgICAgICAgICAgICAgICAgVEFSR0VUOiAgIGxpYmZnZXRzLnNvCiAgQVVUSE9SOiAgICAgICBIYXJvbGQgTGV2eSAgICAgICAgICAgICAgVkVSU0lPTjogIDEuMAogICAgICAgICAgICAgICAgaGxldnlAc3lub3BzeXMuY29tCiAgCiAgQUJTVFJBQ1Q6ICBDdXN0b21pemUgZmdldHMoKSBiZWhhdmlvciB2aWEgTERfUFJFTE9BRCBpbiB0aGUgZm9sbG93aW5nIHdheXM6CiAgCiAgICAtLSBJZiBmZ2V0cyhzdGRpbikgaXMgY2FsbGVkLCByZWRpcmVjdCB0byBHTlUgcmVhZGxpbmUoKSB0byBvYnRhaW4KICAgICAgIGNvbW1hbmQtbGluZSBlZGl0aW5nLCBmaWxlLW5hbWUgY29tcGxldGlvbiwgaGlzdG9yeSwgZXRjLgogIAogICAgLS0gQSBsaXN0IG9mIGNvbW1hbmRzIGZvciBjb21tYW5kLW5hbWUgY29tcGxldGlvbiBjYW4gYmUgY29uZmlndXJlZCBieQogICAgICAgc2V0dGluZyB0aGUgZW52aXJvbm1lbnQtdmFyaWFibGUgRkdFVFNfQ09NTUFORF9GSUxFIHRvIGEgZmlsZSBjb250YWluaW5nCiAgICAgICB0aGUgbGlzdCBvZiBjb21tYW5kcyB0byBiZSB1c2VkLgogIAogICAgLS0gQ29tbWFuZC1saW5lIGVkaXRpbmcgd2l0aCByZWFkbGluZSgpIHdvcmtzIGJlc3Qgd2hlbiB0aGUgcHJvbXB0IHN0cmluZwogICAgICAgaXMga25vd247IHlvdSBjYW4gc2V0IHRoaXMgd2l0aCB0aGUgRkdFVFNfUFJPTVBUIGVudmlyb25tZW50IHZhcmlhYmxlLgogIAogICAgLS0gVGhlcmUgc3BlY2lhbCBzdHJpbmdzIHRoYXQgbGliZmdldHMgd2lsbCBpbnRlcnByZXQgYXMgaW50ZXJuYWwgY29tbWFuZHM6CiAgCiAgICAgICAgICAgX2ZnZXRzX3Jlc2V0XyAgICByZXNldCB0aGUgY29tbWFuZCBsaXN0CiAgCiAgICAgICAgICAgX2ZnZXRzX2R1bXBfICAgICBkdW1wIHN0YXR1cwogIAogICAgICAgICAgIF9mZ2V0c19kZWJ1Z18gICAgdG9nZ2xlIGRlYnVnIG1lc3NhZ2VzCgogIEhPVyBUTyBCVUlMRDogIEhlcmUgYXJlIGV4YW1wbGVzIG9mIGhvdyB0byBidWlsZCBsaWJmZ2V0cy5zbyBvbiB2YXJpb3VzCiAgcGxhdGZvcm1zOyB5b3Ugd2lsbCBoYXZlIHRvIGFkZCAtSSBhbmQgLUwgZmxhZ3MgdG8gY29uZmlndXJlIGFjY2VzcyB0bwogIHRoZSByZWFkbGluZSBoZWFkZXIgYW5kIGxpYnJhcnkgZmlsZXMuCgogICgzMi1iaXQgYnVpbGRzIHdpdGggZ2NjKQogIEFJWDogICBnY2MgLWZQSUMgZmdldHMuYyAtc2hhcmVkIC1vIGxpYmZnZXRzLnNvIC1sYyAtbGRsIC1scmVhZGxpbmUgLWx0ZXJtY2FwCiAgSFAtVVg6IGdjYyAtZlBJQyBmZ2V0cy5jIC1zaGFyZWQgLW8gbGliZmdldHMuc28gLWxjIC1sZGxkIC1scmVhZGxpbmUKICBMaW51eDogZ2NjIC1mUElDIGZnZXRzLmMgLXNoYXJlZCAtbyBsaWJmZ2V0cy5zbyAtbGMgLWxkbCAtbHJlYWRsaW5lCiAgU3VuT1M6IGdjYyAtZlBJQyBmZ2V0cy5jIC1zaGFyZWQgLW8gbGliZmdldHMuc28gLWxjIC1sZGwgLWxnZW4gLWxyZWFkbGluZQoKICAoNjQtYml0IGJ1aWxkcyB3aXRob3V0IGdjYykKICBTdW5PUzogU1VOV3Nwcm8vYmluL2NjIC1EX0xBUkdFRklMRTY0X1NPVVJDRT0xIC14dGFyZ2V0PXVsdHJhIC14YXJjaD12OSBcCiAgICAgICAgICAgLUtQSUMgZmdldHMuYyAtQmR5bmFtaWMgLWxjIC1sZGwgLWxnZW4gLWx0ZXJtY2FwIC1scmVhZGxpbmUKICAKICBIT1cgVE8gVVNFOiAgRGlmZmVyZW50IG9wZXJhdGluZyBzeXN0ZW1zIGhhdmUgZGlmZmVyZW50IGxldmVscyBvZiBzdXBwb3J0CiAgZm9yIHRoZSBMRF9QUkVMT0FEIGNvbmNlcHQuICBUaGUgZ2VuZXJpYyBtZXRob2QgZm9yIDMyLWJpdCBwbGF0Zm9ybXMgaXMgdG8KICBwdXQgbGlidGVybWNhcC5zbywgbGliZmdldHMuc28sIGFuZCBsaWJyZWFkbGluZS5zbyAod2l0aCBhYnNvbHV0ZSBwYXRocykKICBpbiB0aGUgTERfUFJFTE9BRCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgYW5kIHRvIHB1dCB0aGVpciBwYXJlbnQgZGlyZWN0b3JpZXMKICBpbiB0aGUgTERfTElCUkFSWV9QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiAgVW5mb3J0dW5hdGVseSB0aGVyZSBpcyBubwogIGdlbmVyaWMgbWV0aG9kIGZvciA2NC1iaXQgcGxhdGZvcm1zOyBlLmcuIGZvciA2NC1iaXQgU3VuT1MsIHlvdSB3b3VsZCBoYXZlCiAgdG8gYnVpbGQgYm90aCAzMi1iaXQgYW5kIDY0LWJpdCBsaWJmZ2V0cyBhbmQgbGlicmVhZGxpbmUgbGlicmFyaWVzLCBhbmQKICB1c2UgdGhlIExEX0ZMQUdTXzMyIGFuZCBMRF9GTEFHU182NCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2l0aCBwcmVsb2FkIGFuZAogIGxpYnJhcnlfcGF0aCBjb25maWd1cmF0aW9ucyAoYSBtaXggb2YgMzItYml0IGFuZCA2NC1iaXQgY2FsbHMgYXJlIG1hZGUgdW5kZXIKICA2NC1iaXQgU3VuT1MpLgogIAogIEVYQU1QTEUgV1JBUFBFUjogIEhlcmUgaXMgYW4gZXhhbXBsZSBzaGVsbCBzY3JpcHQgd3JhcHBlciBhcm91bmQgdGhlCiAgcHJvZ3JhbSAiZm9vIiB0aGF0IHVzZXMgZmdldHMoKSBmb3IgY29tbWFuZC1saW5lIGlucHV0OgoKICAgICAgIyEvYmluL2NzaAogICAgICAjIyMjIHJlcGxhY2UgdGhpcyB3aXRoIHRoZSBsaWJ0ZXJtY2FwLnNvIGRpcmVjdG9yeToKICAgICAgc2V0IGRpcjEgPSAiL3Vzci9saWIiCiAgICAgICMjIyMgcmVwbGFjZSB0aGlzIHdpdGggdGhlIGxpYmZnZXRzLnNvIGRpcmVjdG9yeToKICAgICAgc2V0IGRpcjIgPSAiL3Vzci9mZ2V0cyIKICAgICAgIyMjIyByZXBsYWNlIHRoaXMgd2l0aCB0aGUgbGlicmVhZGxpbmUuc28gZGlyZWN0b3J5OgogICAgICBzZXQgZGlyMyA9ICIvdXNyL2xvY2FsL2xpYiIKICAgICAgc2V0IGxpYjEgPSAiJHtkaXIxfS9saWJ0ZXJtY2FwLnNvIgogICAgICBzZXQgbGliMiA9ICIke2RpcjJ9L2xpYmZnZXRzLnNvIgogICAgICBzZXQgbGliMyA9ICIke2RpcjN9L2xpYnJlYWRsaW5lLnNvIgogICAgICBpZiAoICIkez9MRF9QUkVMT0FEfSIgKSB0aGVuCiAgICAgICAgc2V0ZW52IExEX1BSRUxPQUQgIiR7bGliMX06JHtsaWIyfToke2xpYjN9OiR7TERfUFJFTE9BRH0iCiAgICAgIGVsc2UKICAgICAgICBzZXRlbnYgTERfUFJFTE9BRCAiJHtsaWIxfToke2xpYjJ9OiR7bGliM30iCiAgICAgIGVuZGlmCiAgICAgIGlmICggIiR7P0xEX0xJQlJBUllfUEFUSH0iICkgdGhlbgogICAgICAgIHNldGVudiBMRF9MSUJSQVJZX1BBVEggIiR7ZGlyMX06JHtkaXIyfToke2RpcjN9OiR7TERfTElCUkFSWV9QQVRIfSIKICAgICAgZWxzZQogICAgICAgIHNldGVudiBMRF9MSUJSQVJZX1BBVEggIiR7ZGlyMX06JHtkaXIyfToke2RpcjN9IgogICAgICBlbmRpZgogICAgICBzZXRlbnYgRkdFVFNfQ09NTUFORF9GSUxFICIke2RpcjJ9L2Zvby5jb21tYW5kcyIKICAgICAgc2V0ZW52IEZHRVRTX1BST01QVCAgICAgICAiZm9vPiAiCiAgICAgIGV4ZWMgImZvbyIgJCoKICAKICBDb3B5cmlnaHQgKEMpqTIwMDMtMjAwNCBIYXJvbGQgTGV2eS4KICAKICBUaGlzIGNvZGUgbGlua3MgdG8gdGhlIEdOVSByZWFkbGluZSBsaWJyYXJ5LCBhbmQgYXMgc3VjaCBpcyBib3VuZCBieSB0aGUKICB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiAgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogIAogIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBvZnRlbiBzaGlwcGVkIHdpdGggR05VIHNvZnR3YXJlLCBhbmQgaXMKICBnZW5lcmFsbHkga2VwdCBpbiBhIGZpbGUgY2FsbGVkIENPUFlJTkcgb3IgTElDRU5TRS4gIElmIHlvdSBkbyBub3QgaGF2ZSBhCiAgY29weSBvZiB0aGUgbGljZW5zZSwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlLAogIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMSBVU0EuCiAgCiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCiAgZGV0YWlscy4KICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKDAojaW5jbHVkZSA8ZGxmY24uaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmdzLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKI2luY2x1ZGUgPHJlYWRsaW5lL3JlYWRsaW5lLmg+CiNpbmNsdWRlIDxyZWFkbGluZS9oaXN0b3J5Lmg+CgoKDAovKiBmb3IgZHluYW1pY2FsbHkgY29ubmVjdGluZyB0byB0aGUgbmF0aXZlIGZnZXRzKCkgKi8KI2lmIGRlZmluZWQoUlRMRF9ORVhUKQojZGVmaW5lIFJFQUxfTElCQyBSVExEX05FWFQKI2Vsc2UKI2RlZmluZSBSRUFMX0xJQkMgKCh2b2lkICopIC0xTCkKI2VuZGlmCnR5cGVkZWYgY2hhciAqICggKiBmZ2V0c190ICkgKCBjaGFyICogcywgaW50IG4sIEZJTEUgKiBzdHJlYW0gKSA7CgoKDAovKiBwcml2YXRlIGRhdGEgKi8KLyogLS0gd3JpdGVhYmxlIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBzaGFyZWQgbGlicmFyeSdzIGRhdGEgc2VnbWVudAogICAtLSBldmVyeSBwcm9jZXNzIHRoYXQgdXNlcyB0aGUgc2hhcmVkIGxpYnJhcnkgZ2V0cyBhIHByaXZhdGUgbWVtb3J5IGNvcHkgb2YKICAgICAgaXRzIGVudGlyZSBkYXRhIHNlZ21lbnQKICAgLS0gc3RhdGljIGRhdGEgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5IGlzIG5vdCBjb3BpZWQgdG8gdGhlIGFwcGxpY2F0aW9uCiAgIC0tIG9ubHkgcmVhZC1vbmx5IChpLmUuICdjb25zdCcpIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBzaGFyZWQgbGlicmFyeSdzCiAgICAgIHRleHQgc2VnbWVudAoqLwpzdGF0aWMgY2hhciAqKiBteV9mZ2V0c19uYW1lcyAgICAgICAgICAgPSBOVUxMIDsKc3RhdGljIGludCAgICAgbXlfZmdldHNfbnVtYmVyX29mX25hbWVzID0gMCAgICA7CnN0YXRpYyBpbnQgICAgIG15X2ZnZXRzX2RlYnVnX2ZsYWcgICAgICA9IDAgICAgOwoKCgwKLyogaW52b2tlZCB3aXRoIF9mZ2V0c19yZXNldF8gKi8Kc3RhdGljIHZvaWQKbXlfZmdldHNfcmVzZXQgKAogIHZvaWQKKSB7CiAgaWYgKCBteV9mZ2V0c19uYW1lcyAmJiAobXlfZmdldHNfbnVtYmVyX29mX25hbWVzID4gMCkgKSB7CiAgICBpbnQgaSA7CiAgICBpZiAoIG15X2ZnZXRzX2RlYnVnX2ZsYWcgKSB7CiAgICAgIHByaW50ZiAoICJsaWJmZ2V0czogIHJlbW92aW5nIGNvbW1hbmQgbGlzdFxuIiApIDsKICAgIH0KICAgIGZvciAoIGkgPSAwIDsgaSA8IG15X2ZnZXRzX251bWJlcl9vZl9uYW1lcyA7IGkgKysgKSB7CiAgICAgIGlmICggbXlfZmdldHNfbmFtZXNbaV0gKSBmcmVlICggbXlfZmdldHNfbmFtZXNbaV0gKSA7CiAgICB9CiAgICBmcmVlICggbXlfZmdldHNfbmFtZXMgKSA7CiAgfQogIG15X2ZnZXRzX25hbWVzID0gTlVMTCA7CiAgbXlfZmdldHNfbnVtYmVyX29mX25hbWVzID0gMCA7Cn0KCgoMCi8qIGludm9rZWQgd2l0aCBfZmdldHNfZHVtcF8gKi8Kc3RhdGljIHZvaWQKbXlfZmdldHNfZHVtcCAoCiAgdm9pZAopIHsKICBjaGFyICogcyA7CiAgcHJpbnRmICggIlxuIiApIDsKICBzID0gZ2V0ZW52ICggIkZHRVRTX1BST01QVCIgKSA7CiAgcHJpbnRmICggIkZHRVRTX1BST01QVCAgICAgICA9ICVzXG4iLCBzID8gcyA6ICIiICkgOwogIHMgPSBnZXRlbnYgKCAiRkdFVFNfQ09NTUFORF9GSUxFIiApIDsKICBwcmludGYgKCAiRkdFVFNfQ09NTUFORF9GSUxFID0gJXNcbiIsIHMgPyBzIDogIiIgKSA7CiAgcHJpbnRmICggImRlYnVnIGZsYWcgICAgICAgICA9ICVkXG4iLCBteV9mZ2V0c19kZWJ1Z19mbGFnICkgOwogIHByaW50ZiAoICIjY29tbWFuZHMgICAgICAgICAgPSAlZFxuIiwgbXlfZmdldHNfbnVtYmVyX29mX25hbWVzICkgOwogIGlmICggbXlfZmdldHNfZGVidWdfZmxhZyApIHsKICAgIGlmICggbXlfZmdldHNfbmFtZXMgJiYgKG15X2ZnZXRzX251bWJlcl9vZl9uYW1lcyA+IDApICkgewogICAgICBpbnQgaSA7CiAgICAgIGZvciAoIGkgPSAwIDsgaSA8IG15X2ZnZXRzX251bWJlcl9vZl9uYW1lcyA7IGkgKysgKSB7CiAgICAgICAgcHJpbnRmICggIiVzXG4iLCBteV9mZ2V0c19uYW1lc1tpXSApIDsKICAgICAgfQogICAgfQogIH0KICBwcmludGYgKCAiXG4iICkgOwp9CgoKDAovKiBpbnZva2VkIHdpdGggX2ZnZXRzX2RlYnVnXyAqLwpzdGF0aWMgdm9pZApteV9mZ2V0c19kZWJ1Z190b2dnbGUgKAogIHZvaWQKKSB7CiAgbXlfZmdldHNfZGVidWdfZmxhZyA9IG15X2ZnZXRzX2RlYnVnX2ZsYWcgPyAwIDogMSA7CiAgaWYgKCBteV9mZ2V0c19kZWJ1Z19mbGFnICkgewogICAgcHJpbnRmICggImxpYmZnZXRzOiAgZGVidWcgZmxhZyA9ICVkXG4iLCBteV9mZ2V0c19kZWJ1Z19mbGFnICkgOwogIH0KfQoKCgwKLyogcmVhZCB0aGUgY29tbWFuZCBsaXN0IGlmIG5lZWRlZCwgcmV0dXJuIHRoZSBpLXRoIG5hbWUgKi8Kc3RhdGljIGNoYXIgKgpteV9mZ2V0c19sb29rdXAgKAogIGludCBpbmRleAopIHsKICBpZiAoICghIG15X2ZnZXRzX25hbWVzKSB8fCAoISBteV9mZ2V0c19udW1iZXJfb2ZfbmFtZXMpICkgewogICAgY2hhciAqIGZuYW1lIDsKICAgIEZJTEUgKiBmcCA7CiAgICBmZ2V0c190IF9mZ2V0cyA7CiAgICBpbnQgaSA7CiAgICBjaGFyIGJ1ZjFbMjU2XSwgYnVmMlsyNTZdIDsKICAgIGZuYW1lID0gZ2V0ZW52ICggIkZHRVRTX0NPTU1BTkRfRklMRSIgKSA7CiAgICBpZiAoICEgZm5hbWUgKSB7CiAgICAgIGlmICggbXlfZmdldHNfZGVidWdfZmxhZyApIHsKICAgICAgICBwcmludGYgKCAibGliZmdldHM6ICBlbXB0eSBvciB1bnNldCBGR0VUU19DT01NQU5EX0ZJTEVcbiIgKSA7CiAgICAgIH0KICAgICAgcmV0dXJuIE5VTEwgOwogICAgfQogICAgZnAgPSBmb3BlbiAoIGZuYW1lLCAiciIgKSA7CiAgICBpZiAoICEgZnAgKSB7CiAgICAgIGlmICggbXlfZmdldHNfZGVidWdfZmxhZyApIHsKICAgICAgICBwcmludGYgKCAibGliZmdldHM6ICBjYW5ub3Qgb3BlbiAnJXMnIGZvciByZWFkaW5nXG4iLCBmbmFtZSApIDsKICAgICAgfQogICAgICByZXR1cm4gTlVMTCA7CiAgICB9CiAgICBfZmdldHMgPSAoZmdldHNfdCkgZGxzeW0gKCBSRUFMX0xJQkMsICJmZ2V0cyIgKSA7CiAgICBpZiAoICEgX2ZnZXRzICkgewogICAgICBmcHJpbnRmICggc3RkZXJyLAogICAgICAgICJsaWJmZ2V0czogIGZhaWxlZCB0byBkeW5hbWljYWxseSBsaW5rIHRvIG5hdGl2ZSBmZ2V0cygpXG4iCiAgICAgICkgOwogICAgICByZXR1cm4gTlVMTCA7CiAgICB9CiAgICBmb3IgKCBpID0gMCA7IF9mZ2V0cyhidWYxLDI1NSxmcCkgOyBpICsrICkgOwogICAgaWYgKCAhIGkgKSB7IGZjbG9zZShmcCkgOyByZXR1cm4gTlVMTCA7IH0KICAgIG15X2ZnZXRzX25hbWVzID0gKGNoYXIqKikgY2FsbG9jICggaSwgc2l6ZW9mKGNoYXIqKSApIDsKICAgIHJld2luZCAoIGZwICkgOwogICAgaSA9IDAgOwogICAgd2hpbGUgKCBfZmdldHMoYnVmMSwyNTUsZnApICkgewogICAgICBidWYxWzI1NV0gPSAwIDsKICAgICAgaWYgKCAxID09IHNzY2FuZihidWYxLCIlcyIsYnVmMikgKSB7CiAgICAgICAgbXlfZmdldHNfbmFtZXNbaV0gPSBzdHJkdXAoYnVmMikgOwogICAgICAgIGkgKysgOwogICAgICB9CiAgICB9CiAgICBmY2xvc2UgKCBmcCApIDsKICAgIG15X2ZnZXRzX251bWJlcl9vZl9uYW1lcyA9IGkgOwogICAgaWYgKCBteV9mZ2V0c19kZWJ1Z19mbGFnICkgewogICAgICBwcmludGYgKCAibGliZmdldHM6ICBzdWNjZXNzZnVsbHkgcmVhZCAlZCBjb21tYW5kc1xuIiwgaSApIDsKICAgIH0KICB9CiAgaWYgKCBpbmRleCA8IG15X2ZnZXRzX251bWJlcl9vZl9uYW1lcyApIHsKICAgIHJldHVybiBteV9mZ2V0c19uYW1lc1tpbmRleF0gOwogIH0gZWxzZSB7CiAgICByZXR1cm4gTlVMTCA7CiAgfQp9CgoKDAovKiBnZW5lcmF0ZSBhIGxpc3Qgb2YgcGFydGlhbCBuYW1lIG1hdGNoZXMgZm9yIHJlYWRsaW5lKCkgKi8Kc3RhdGljIGNoYXIgKgpteV9mZ2V0c19nZW5lcmF0b3IgKAogIGNvbnN0IGNoYXIgKiB0ZXh0LAogIGludCAgICAgICAgICBzdGF0ZQopCnsKICBzdGF0aWMgaW50IGxpc3RfaW5kZXgsIGxlbiA7CiAgY2hhciAqICAgICBuYW1lIDsKICBpZiAoICEgc3RhdGUgKSB7CiAgICBsaXN0X2luZGV4ID0gMCA7CiAgICBsZW4gPSBzdHJsZW4gKCB0ZXh0ICkgOwogIH0KICB3aGlsZSAoICggbmFtZSA9IG15X2ZnZXRzX2xvb2t1cChsaXN0X2luZGV4KSApICkgewogICAgbGlzdF9pbmRleCArKyA7CiAgICBpZiAoICEgc3RybmNtcCAoIG5hbWUsIHRleHQsIGxlbiApICkgewogICAgICByZXR1cm4gKCBzdHJkdXAgKCBuYW1lICkgKSA7CiAgICB9CiAgfQogIHJldHVybiAoIE5VTEwgKSA7Cn0KCgoMCi8qIHBhcnRpYWwgbmFtZSBjb21wbGV0aW9uIGNhbGxiYWNrIGZvciByZWFkbGluZSgpICovCnN0YXRpYyBjaGFyICoqCm15X2ZnZXRzX2NvbXBsZXRpb24gKAogIGNvbnN0IGNoYXIgKiB0ZXh0LAogIGludCAgICAgICAgICBzdGFydCwKICBpbnQgICAgICAgICAgZW5kCikKewogIGNoYXIgKiogbWF0Y2hlcyA7CiAgbWF0Y2hlcyA9IE5VTEwgOwogIGlmICggISBzdGFydCApIHsKICAgIG1hdGNoZXMgPSBybF9jb21wbGV0aW9uX21hdGNoZXMgKCB0ZXh0LCBteV9mZ2V0c19nZW5lcmF0b3IgKSA7CiAgfQogIHJldHVybiAoIG1hdGNoZXMgKSA7Cn0KCgoMCi8qIGZnZXRzKCkgaW50ZXJjZXB0ICovCmNoYXIgKgpmZ2V0cyAoCiAgY2hhciAqIHMsCiAgaW50ICAgIG4sCiAgRklMRSAqIHN0cmVhbQopCnsKICBpZiAoICEgcyApIHJldHVybiBOVUxMIDsKICBpZiAoIHN0cmVhbSA9PSBzdGRpbiApIHsKICAgIGNoYXIgKiBwcm9tcHQgOwogICAgY2hhciAqIG15X2ZnZXRzX2xpbmUgOwogICAgcmxfYWxyZWFkeV9wcm9tcHRlZCA9IDEgOwogICAgcmxfYXR0ZW1wdGVkX2NvbXBsZXRpb25fZnVuY3Rpb24gPSBteV9mZ2V0c19jb21wbGV0aW9uIDsKICAgIHJsX2NhdGNoX3NpZ25hbHMgPSAxIDsKICAgIHJsX2NhdGNoX3NpZ3dpbmNoID0gMSA7CiAgICBybF9zZXRfc2lnbmFscyAoKSA7CiAgICBwcm9tcHQgPSBnZXRlbnYgKCAiRkdFVFNfUFJPTVBUIiApIDsKICAgIGZvciAoCiAgICAgIG15X2ZnZXRzX2xpbmUgPSAwIDsgISBteV9mZ2V0c19saW5lIDsgbXlfZmdldHNfbGluZT1yZWFkbGluZShwcm9tcHQpCiAgICApIDsKICAgIGlmICggISBzdHJuY21wKG15X2ZnZXRzX2xpbmUsICJfZmdldHNfcmVzZXRfIiwgMTMpICkgewogICAgICBteV9mZ2V0c19yZXNldCAoKSA7CiAgICAgIGZyZWUgKCBteV9mZ2V0c19saW5lICkgOwogICAgICBzdHJjcHkgKCBzLCAiXG4iICkgOwogICAgICByZXR1cm4gKCBzICkgOwogICAgfQogICAgaWYgKCAhIHN0cm5jbXAobXlfZmdldHNfbGluZSwgIl9mZ2V0c19kdW1wXyIsIDEyKSApIHsKICAgICAgbXlfZmdldHNfZHVtcCAoKSA7CiAgICAgIGZyZWUgKCBteV9mZ2V0c19saW5lICkgOwogICAgICBzdHJjcHkgKCBzLCAiXG4iICkgOwogICAgICByZXR1cm4gKCBzICkgOwogICAgfQogICAgaWYgKCAhIHN0cm5jbXAobXlfZmdldHNfbGluZSwgIl9mZ2V0c19kZWJ1Z18iLCAxMykgKSB7CiAgICAgIG15X2ZnZXRzX2RlYnVnX3RvZ2dsZSAoKSA7CiAgICAgIGZyZWUgKCBteV9mZ2V0c19saW5lICkgOwogICAgICBzdHJjcHkgKCBzLCAiXG4iICkgOwogICAgICByZXR1cm4gKCBzICkgOwogICAgfQogICAgKHZvaWQpIHN0cm5jcHkgKCBzLCBteV9mZ2V0c19saW5lLCBuLTEgKSA7CiAgICAodm9pZCkgc3RyY2F0ICggcywgIlxuIiApIDsKICAgIGlmICggKm15X2ZnZXRzX2xpbmUgKSBhZGRfaGlzdG9yeSAoIG15X2ZnZXRzX2xpbmUgKSA7CiAgICBmcmVlICggbXlfZmdldHNfbGluZSApIDsKICAgIHJldHVybiAoIHMgKSA7CiAgfSBlbHNlIHsKICAgIHN0YXRpYyBmZ2V0c190IF9mZ2V0cyA7CiAgICBfZmdldHMgPSAoZmdldHNfdCkgZGxzeW0gKCBSRUFMX0xJQkMsICJmZ2V0cyIgKSA7CiAgICBpZiAoICEgX2ZnZXRzICkgewogICAgICBmcHJpbnRmICggc3RkZXJyLAogICAgICAgICJsaWJmZ2V0czogIGZhaWxlZCB0byBkeW5hbWljYWxseSBsaW5rIHRvIG5hdGl2ZSBmZ2V0cygpXG4iCiAgICAgICkgOwogICAgICBzdHJjcHkgKCBzLCAiXG4iICkgOwogICAgICByZXR1cm4gKCBzICkgOwogICAgfQogICAgcmV0dXJuICgKICAgICAgX2ZnZXRzICggcywgbiwgc3RyZWFtICkKICAgICkgOwogIH0KfQo=